c - 从 C 中的文本文件读取整数时的错误

标签 c file tabs integer space

我有点绝望,因为我浪费了最后 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),我需要管理相同类型的操作系统错误。 任何帮助将不胜感激!

最佳答案

查看fscanf的返回值

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

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

关于c - 从 C 中的文本文件读取整数时的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13352544/

相关文章:

jquery - MVC 将 "#"附加到查询字符串

angularjs - AngularJS UI Bootstrap 在无法使用的静态选项卡中动态选择

c - 了解 gdb 格式

ios - 在 iOS 应用程序中运行 C 守护进程

c - C 中的输入验证(和循环)

c - 克隆人的奇怪行为

linux - jobs -l 在脚本中写入时不将输出打印到文件

c - 从文件读取到 C 中的 float** 内存块

c++ - 什么是最好的跨平台解析文本文件的方法?

android - 如何设计 Android 标签以获得 3d 外观?