3

我有点绝望,因为我浪费了最后 4 个小时来寻找简单/愚蠢的事情的解决方案。我在学校有一个项目,我必须从文本文件中读取整数,然后计算它们的最大值。问题是这些数字不一定用空格分隔,也可以用制表符 (\t) 或换行符 (\n) 分隔。我使用 fscanf 函数读取我的整数,但问题是在最后一个数字之后我的文件中有一个空格,所以它读取最后一个数字的 2 倍(我不知道为什么)。通常人们会说“删除那个空格”,但我的老师会以几种方式测试程序,他警告我们程序必须是健壮的(我们必须能够管理空格,\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),我需要管理相同类型的 os 错误。任何帮助,将不胜感激!

4

3 回答 3

2

检查返回值fscanf

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

如果找不到数字,则跳出循环。fscanf返回成功转换的次数,应该用于错误检查和处理。

于 2012-11-12T22:24:48.727 回答
2

使用fscanf()返回赋值数的结果作为循环的终止条件。在循环检查到达 EOF 之后,由于其他一些故障,循环没有终止。

于 2012-11-12T22:24:59.990 回答
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;
    }
}
于 2012-11-12T22:43:02.727 回答