如何使用fscanf在C中扫描文件

时间:2013-10-11 16:36:50

标签: c scanf

我正在使用代码

while(fscanf(input, "%49[^@ ]@%49s -> %49[^@ ]@%49s", sender, trash, receiver, trash) != EOF){
   printf("%s " "%s\n", sender, reciever);
}

尝试从文件中读取和打印每一行 然而,当我运行这段代码时,它会陷入无休止的循环,一遍又一遍地打印文件的第一行。如何在执行此代码后将扫描仪向下移动到下一行。提前感谢您的帮助。

5 个答案:

答案 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和解析错误。

相关问题