fscanf每隔一行返回一次

时间:2014-05-15 13:17:26

标签: c eof scanf skip

我正在尝试从名为part_1.txt的文件中读取数字,其中包含以下数据:

101
102
103
104
105
106
107
108
109

这是我正在使用的代码:

#include <stdio.h>

int main()
{

FILE *handle_in1 = fopen("part_1.txt", "r");
FILE *handle_in2 = fopen("part_2.txt", "r");
FILE *handle_out = fopen("parts.txt", "w");

int scan;

if(handle_in1 == NULL || handle_in2 == NULL)
{
printf("File(s) could not be handled.");
}

else
{
while(fscanf(handle_in1, "%d", &scan) != EOF)
{
    fscanf(handle_in1, "%d", &scan);
    printf("Number is %d\n", scan);
}
}
return 0;

}

代码应该在屏幕上打印出存储在文件中的每个值,直到文件结束。 相反,它打印出所有其他值(和最后一个值),如下所示:

Number is 102
Number is 104
Number is 106
Number is 108
Number is 109 

此代码有什么问题?

我编辑了这个问题,因为我不能在8小时之前发布答案。以下版本是新版本:

#include <stdio.h>

int main()
{

FILE *handle_in1 = fopen("part_1.txt", "r");
FILE *handle_in2 = fopen("part_2.txt", "r");
FILE *handle_out = fopen("parts.txt", "w");

int scan;

if(handle_in1 == NULL || handle_in2 == NULL)
{
printf("File(s) could not be handled.");
}

else
{
fscanf(handle_in1, "%d", &scan);
    while(fscanf(handle_in1, "%d", &scan) != EOF)
    {
    printf("Number is %d\n", scan);
    }
}
return 0;

}

该程序的编辑版本为我提供了值:102,103,104,105,106,107,108和109.如果我编辑txt文件并在txt文件的顶部放一个额外的101,那么它从101到109一直给出值,因此它必须跳过第一个数字。为什么这样做我不知道...

2 个答案:

答案 0 :(得分:3)

你在这里做错了什么:

while(fscanf(handle_in1, "%d", &scan) != EOF)
{
    fscanf(handle_in1, "%d", &scan);
    printf("Number is %d\n", scan);
}

解决方案是:

在循环的迭代中只使用一个scanf

所以它会成为(这是一个解决方案):

while(fscanf(handle_in1, "%d", &scan) != EOF)
{
    printf("Number is %d\n", scan);
}

答案 1 :(得分:2)

第二个问题的解决方案是你必须在else之后和while之前删除第一个fscanf行

    FILE *handle_in1 = fopen("part_1.txt", "r");
    int scan;

    if(handle_in1 == NULL ){
            printf("File(s) could not be handled.");
    } else  {
    /*      fscanf(handle_in1, "%d", &scan);*/ // this line is unnecessary
            while(fscanf(handle_in1, "%d", &scan) != EOF) {
                printf("Number is %d\n", scan);
            }
    }
    return 0;

fscanf正在删除文件的第一行。