如何在C语言中统计文件中整数的数量?

3

我有这段代码,它从main函数的第一个参数中读取文件,并计算其中存储的整数数量。

#include<stdio.h>
#include <sys/wait.h>
#include <stdlib.h>

int array[100000];
int count = 0;
int main(int argc, char* argv[]){
    FILE* file;
    int i;


    file = fopen(argv[1],"r");

    while(!feof(file)){
        fscanf(file, "%d", &array[count]);
        count++;
    }

    for(i=0; i<count; i++){
        printf(" \n a[%d] = %d\n",i,array[i]);
    }
    return 0;
}

执行此文件时的输出为:
 a[0] = 1

 a[1] = 2

 a[2] = 3

 a[3] = 4

 a[4] = 5

 a[5] = 6

 a[6] = 7

 a[7] = 8

 a[8] = 9

 a[9] = 10

 a[10] = 0

为什么计数器的值比预期多1?

我的输入文件使用"./a.out /home/ghost/Desktop/file.txt",内容如下:

1 2 3 4 5 6 7 8 9 10


4
第一处错误是 while(!feof(file)),这是不正确的!你应该阅读 fscanf() 的文档,然后使用 while (fscanf(file, "%d", array[count++]) == 1);。此外,绝对不需要全局变量。 - Iharob Al Asimi
1
如果你在意检查fscanf的返回值(这是你应该总是做的事情),你就能够发现/避免这个bug了。 - hyde
@iharob 嗯,“数组”作为全局变量比在栈中作为本地变量更安全,大小也不会有问题...在这样的代码片段中使用“malloc”只会转移我们的注意力。因此,在这种情况下使用全局变量是有意义的。 - hyde
@hyde 我完全不同意。如果数组在 main() 中定义,它将具有与整个程序相同的生命周期。 - Iharob Al Asimi
@iharob,我说的不是生命周期,而是栈大小有限。即使只为程序的生命周期分配5%(典型8MB中的约400 KB),这也是相当可疑的。 - hyde
@hyde 现在我明白了,没有注意数组的大小。 - Iharob Al Asimi
1个回答

2
while(!feof(file)){
    fscanf(file, "%d", &array[count]);
    count++;
}

不要检查 eof,而是需要检查fscanf()的返回值:

while(fscanf(file, "%d", &array[count]) == 1)
    count++;

但最好还是加入一些安全措施,例如:

#define NUM_ITEMS 1000

int array[NUM_ITEMS];

int main(int argc, char* argv[]){
{
    FILE* file;
    int i, count = 0;

    file = fopen(argv[1], "r");

    if (!file) {
        printf("Problem with opening file\n");
        return 0; // or some error code
    }

    while(count < NUM_ITEMS && fscanf(file, "%d", &array[count]) == 1)
        count++;

    fclose(file);

    for(i=0; i<count; i++){
        printf("a[%d] = %d\n", i, array[i]);
    }

    return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接