簡體   English   中英

從C中的txt文件讀取整數

[英]Reading integers from txt file in C

我正在制作一個文件讀取器,該文件讀取器從文件中逐行讀取整數。 問題是那不起作用。 我認為我以錯誤的方式使用fscanf。 有人能幫我嗎?

我已經在其他問題中尋找答案,但是找不到任何能解釋為什么我的代碼無法正常工作的答案。

int read_from_txt(){
    FILE *file;
    file = fopen("random_numbers.txt", "r");
    //Counting line numbers to allocate exact memory
    int i;
    unsigned int lines = 0;
    unsigned int *num;
    char ch;
    while(!feof(file)){
        ch = fgetc(file);
        if (ch == '\n'){
            lines++;
        }
    }
    //array size will be lines+1
    num = malloc(sizeof(int)*(lines+1));
    //storing random_numbers in num vector
    for(i=0;i<=lines;i++){
        fscanf(file, "%d", &num[i]);
        printf("%d", num[i]);
    }
    fclose(file);
}

txt文件類似於:

12 
15
32
68
46
...

但是此代碼的輸出始終給出“ 0000000000000000000 ...”

您忘記了“倒帶”文件:

fseek(file, 0, SEEK_SET);

您的讀取過程將遍歷文件兩次-一次計數行,再一次讀取數據。 您需要在第二遍之前返回文件的開頭。

請注意,您可以通過以下方式一次性使用realloc :在循環中將數字讀入一個臨時int ,對於每次成功的讀取,通過調用reallocnum數組擴展一個。 這將根據需要擴展緩沖區,並且您無需倒帶。

在重新分配給num之前,請仔細檢查realloc的結果,以避免內存泄漏。

您可以嘗試使用標准IO中的getline函數,然后僅使用一個循環就將解析后的數字添加到數組中。 請參見下面的代碼。 請檢查https://linux.die.net/man/3/getline

另外,您可以使用atoistrtoul函數將讀取的行轉換為整數。 隨時檢查https://linux.die.net/man/3/atoihttps://linux.die.net/man/3/strtoul

下面的代碼對帶有數字列表的文件求值,並將這些數字添加到C整數指針中

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char ** argv) {
    FILE * file;

    file = fopen("./file.txt", "r");

    size_t read;
    char * line = NULL;
    size_t line_len = 0;

    size_t buffer_size = 10;
    int * buffer = (int *)malloc(sizeof(int) * buffer_size);

    int seek = 0;
    while((read = getline(&line, &line_len, file)) != -1) {
        buffer[seek++] = atoi(line);

        if (seek % 10 == 0) {
            buffer_size += 10;
            buffer = (int *)realloc(buffer, sizeof(int) * buffer_size);
        }
    }

    for (int i = 0; i < seek; i++) {
        printf("%d\n", buffer[i]);
    }

    free(buffer);
    fclose(file);
}

如果您不確定應該使用哪個轉換功能。 您可以在以下位置檢查atoisscanf 之間的區別:sscanf或atoi將字符串轉換為整數的區別是什么?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM