我正在使用代码
while(fscanf(input, "%49[^@ ]@%49s -> %49[^@ ]@%49s", sender, trash, receiver, trash) != EOF){
printf("%s " "%s\n", sender, reciever);
}
尝试从文件中读取和打印每一行 然而,当我运行这段代码时,它会陷入无休止的循环,一遍又一遍地打印文件的第一行。如何在执行此代码后将扫描仪向下移动到下一行。提前感谢您的帮助。
答案 0 :(得分:1)
#include < stdio.h >
FILE *fr;
main()
{
int n;
char line[80];
fr = fopen ("test.txt", "r"); /* open the file for reading */
while(fgets(line, 80, fr) != NULL)
{
/* get a line, up to 80 chars from fr. done if NULL */
sscanf ( line );
}
fclose(fr); /* close the file prior to exiting the routine */
}
做你想做的事的基本方法......
答案 1 :(得分:0)
fscanf()
返回转化次数。仅当第一次转换失败时才会返回EOF
。正确的方法是:
while (fscanf(fp, "...", &v1, &v2, ...) == <number_of_variables_read>) {
...
}
if (ferror(fp)) ...
答案 2 :(得分:0)
do {
fscanf(input, "%49[^@ ]@%49s -> %49[^@ ]@%49s", sender, trash, receiver, trash);
printf("%s " "%s\n", sender, reciever);
} while(!feof(input));
答案 3 :(得分:0)
您应该检查fscanf
的返回值。此函数返回成功转换的次数,这可能少于格式字符串中指定的转换次数。
在您的情况下,这可能意味着在fscanf
的第二次调用中可能没有执行任何转换,因为文件中的数据格式错误等。由于没有读取数据,文件句柄没有提前,所以结束 - 尚未到达文件,这反过来解释了为什么循环不会终止。由于没有读取数据,因此在每次循环迭代中都会打印先前的值。
答案 4 :(得分:0)
不要与EOF进行比较,与预期的解析字段数进行比较。
while(3 == fscanf(input, " %49[^@ ]@%*49s -> %49[^@ ]@%49s", sender, receiver, trash)){
printf("%s " "%s\n", sender, receiver);
}
一些小改动
怀疑您可能想要跳过任何前导空格,因此请使用" "
开始格式化。 (我确信这有助于您的无限循环。首先扫描将\n
留在输入队列中。第二次扫描不会将\n
放入sender
和{{1} }返回0,这不是EOF。恶意循环重复。)
无需保存首次使用“%49s”扫描垃圾字段。使用“*”进行扫描而不保存。
扫描第二个垃圾字段和保存以添加扫描计数。这有助于验证传入数据的格式是否符合预期。另一种迂腐的检查可能是fscanf()
。
BTW,建议使用" %49[^@ ]@%*49s -> %49[^@ ]@%*49s%[\n]
获取该行并使用fgets()
拆分。更容易处理I / O和解析错误。