从C中的txt文件中读取整数

时间:2017-03-29 19:48:50

标签: c file

我正在制作一个文件阅读器,它从文件中逐行读取整数。问题是不起作用。我想我以错误的方式使用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 ......”

2 个答案:

答案 0 :(得分:2)

你忘了“倒回”文件:

fseek(file, 0, SEEK_SET);

您的阅读过程会通过文件两次 - 一次计数行,再一次读取数据。您需要在第二次传递之前返回文件的开头。

请注意,您可以使用realloc一次性完成此操作:将循环中的数字读入临时int,并且对于每次成功读取,展开num通过调用realloc来一个数组。这将根据需要扩展缓冲区,您无需倒带。

在重新分配到realloc之前,请务必检查num的结果,以避免内存泄漏。

答案 1 :(得分:1)

您可以尝试使用标准IO中的 getline 函数,并仅使用一个循环将解析后的数字添加到数组中。请参阅下面的代码。请查看 https://linux.die.net/man/3/getline < / p>&#xA;&#xA;

此外,您可以使用 atoi strtoul 函数将读取行转换为整数。请随时查看 https://linux.die.net/man/3/atoi https://linux.die.net/man/3/strtoul < / p>&#xA;&#xA;

下面的代码评估带有数字列表的文件,并将这些数字添加到C整数指针

&#xA;&#xA;
 < code> #include&lt; stdlib.h&gt;&#xA; #include&lt; stdio.h&gt;&#xA;&#xA; int main(int argc,char ** argv){&#xA; FILE *文件;&#xA;&#xA; file = fopen(“./ file.txt”,“r”);&#xA;&#xA; size_t read;&#xA; char * line = NULL;&#xA; size_t line_len = 0;&#xA;&#xA; size_t buffer_size = 10;&#xA; int * buffer =(int *)malloc(sizeof(int)* buffer_size);&#xA;&#xA; int seek = 0;&#xA; while((read = getline(&amp; line,&amp; line_len,file))!= -1){&#xA; buffer [seek ++] = atoi(line);&#xA;&#xA; if(seek%10 == 0){&#xA; buffer_size + = 10;&#xA; buffer =(int *)realloc(buffer,sizeof(int)* buffer_size);&#xA; }&#XA; }&#XA;&#XA; for(int i = 0; i&lt; seek; i ++){&#xA; printf(“%d \ n”,buffer [i]);&#xA; }&#XA;&#XA;自由(缓冲液);&#XA; fclose(file);&#xA;}&#xA;  
&#xA;&#xA;

如果您不确定应使用哪种转换功能。您可以在 atoi 和 sscanf 之间的区别-sscanf-or-atoi-to-convert-a-string-to-an-integer“>将字符串转换为整数的sscanf或atoi有什么区别?

&#xA;