我有点绝望,因为我浪费了最后 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/