在C语言中从文本文件读取整数时出现错误

3
我是一个有点绝望的助手,因为我浪费了过去4个小时寻找一个简单/愚蠢问题的解决方案。我在学校里有一个项目,必须从文本文件中读取整数,然后计算它们的最大值。问题在于这些数字不一定由空格分隔,还可能是制表符(\t)或换行符(\n)。我使用fscanf函数读取整数,但问题在于在我的文件中,最后一个数字后面有一个空格,所以它会读取两次最后一个数字(我不知道为什么)。通常人们会说“只需删除该空格”,但我的老师将测试程序的多种方式,并警告我们该程序必须具有健壮性(我们必须能够处理空格、\t、\n以便正确读取数字,这就是为什么他特意在最后一个数字后留下一个空格的原因)。下面是我的代码和示例文本:
FILE* file = NULL;
int *t = NULL, *new_size = NULL;
int temp, count;

file = fopen(argv[1],"r");
do
{
    fscanf(file,"%d",&temp);
    count++;

    new_size = (int*) realloc (t, count * sizeof(int));

    if (new_size != NULL)
    {
        t = new_size;
        t[count-1] = temp;
    }
    else
    {
        free(t);
        puts("Erreur d\'allocation memoire!\n");
        exit(1);
    }
} while(!feof(file));

fclose(file);

printf ("Numbers read\n:");
for(i = 0; i < count; i++)
{
    printf ("%d ", t[i]);
}

我的论点是一个名为data.txt的文件,其中包含:3 1 7 0 4 9 6 150和一个\n。所以基本上,我的程序读取前8个整数,之后,由于它不是EndOfFile,它仍然再次读取最后一个(150)。因此我的输出是: 读取的数字: 3 1 7 0 4 9 6 150 150

有人能告诉我该怎么做,以使我的程序更加健壮?我需要处理同样类型的错误,如果最后有一个空格,甚至是一个制表符(\t)。 任何帮助都将不胜感激!

3个回答

2

检查fscanf的返回值

if (fscanf(file,"%d",&temp) != 1) break;

如果没有找到数字,就可以退出循环。 fscanf 返回成功转换的数量,应该用于错误检查和处理。


2
使用fscanf()的结果作为循环终止条件,该函数返回分配的数量。循环结束后检查是否已达到EOF并且循环未因其他故障而终止。

0
如果数字是用空格分隔的,那么您可以使用 fscanf 读取一个空格,然后再读取一个整数。为了使程序更健壮,始终要查看 fscanf 是否失败。如果它失败了,则停止读取整数,否则继续。
bool good=true;
while(good)
{
    char separator;
    if(fscanf(file,"%c",&separator)==1)
    {
        if(separator!=' ' && separator!='\t' && separator!='\n')
        {
            fprintf(stderr,"Illegal character found in file");
            // You can choose if break the loop setting good to false, or
            // if to continue, this depends on your assignment
        }
        if(fscanf(file,"%d",&temp)==1)
        {
            < Push temp to your list/array >
        }
        else
        {
            good=false;
        }
    }
    else
    {
        good=false;
    }
}

我也使用了你的想法,它非常好。我现在明白了要点。再次感谢你。 - André Hincu

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