[英]fscanf() stucks in an infinite loop
我有一个包含整数矩阵的文件,如下所示:
1 2 -5
0 2 4
-2 –1 3
我需要知道矩阵中有多少元素(在本例中为9)。
计算元素数量的代码如下:
while(!feof(pFile)) {
fscanf(pFile, "%d", &voidElement);
elements++;
}
由于某些原因,当fscanf
读取包含矩阵的文件中的数字-2
时,代码进入循环。
感谢您的帮助。
这是一个看起来像你的小程序,但工作(不会卡住 - 使用我的输入文件)。 但是你会发现它有一个问题 - 继续阅读:
#include <stdio.h>
int main(void) {
int i, el=0;
FILE* fp;
fp = fopen("nine.txt","r");
while(!feof(fp)) {
fscanf(fp, "%d", &i);
el++;
printf("element %d = %d\n", el, i);
}
fclose(fp);
}
输出:
element 1 = 1
element 2 = 2
element 3 = -5
element 4 = 0
element 5 = 2
element 6 = 4
element 7 = -2
element 8 = -1
element 9 = 3
element 10 = 3
换句话说 - 这样做你会获得比你预期更多的元素 - 因为在你尝试阅读过去的文件结束之前,不会设置feof
标志。
换句话说 - 你的方法并不好; 实际应该检查fscanf
是否成功,并仅计算那些(成功读取)。
更好的技术是:
#include <stdio.h>
int main(void) {
int i, el=0;
FILE* fp;
fp = fopen("nine.txt","r");
while(1) {
if(fscanf(fp, "%d", &i)!=1) break;
el++;
printf("element %d = %d\n", el, i);
}
fclose(fp);
}
还有一件事 - 如果fscanf
由于任何原因而失败(可能文件中存在错误的字符),它将永远不会到达文件的末尾并且永远不会设置EOF标记。 这可能是你的代码实际上进入无限循环的原因 - 为什么第二种方法(当fscanf
没有成功读取一个值时退出循环)将起作用。
编辑时,我按照我自己的评论中的建议(采取输入文件并执行十六进制转储)使用上面的数字(最初我刚刚将数字键入文本文件,事情工作正常...)我看到以下:
hexdump -C typedNumbers.txt
00000000 31 20 32 20 2d 35 0a 30 20 32 20 34 0a 2d 32 20 |1 2 -5.0 2 4.-2 |
00000010 2d 31 20 33 0a |-1 3.|
00000015
hexdump -C copiedNumbers.txt
00000000 31 20 32 20 2d 35 0a 30 20 32 20 34 0a 2d 32 20 |1 2 -5.0 2 4.-2 |
00000010 e2 80 93 31 20 33 0a |...1 3.|
00000017
请注意,第一行在两个文件中都是相同的 - 但在第二个文件(原始文件)的第二行中有“不可打印”的字节。 特别是,字节是
e2 80 93 before 31
代替
2d 31
令我困惑的是,看到三个角色最终被一个emdash代表 - 我必须承认我不明白这是怎么做的。 但是,正如我在早期版本的答案中所推测的那样,你的“隐藏的角色”很多。
我知道我的代码存在问题(请参阅Floris的回答 )但主要问题是实际上第7个元素之前的减号不是真正的减号( -
与–
不同,你会注意到它如果你放大足够)。
这导致循环甚至在到达EOF之前就退出了(实际上当fscanf
试图读取–1
时它有问题)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.