无法理解 - 从C中的文件中读取字符

时间:2017-01-08 14:00:10

标签: c file-handling

我刚刚开始学习C中的文件处理,并想知道我是否可以通过读取文件中的输入来执行数学计算,这里只是读取字符并在控制台上显示的代码:

SELECT id,exam,exam_res FROM exam INNER JOIN search_exam USING(exam)

numbers.txt包含(每个字符前面有一个空格):

int main(void)
{
    FILE *p;
    char a, b, c, ch;

    p = fopen("numbers.txt", "a+");

    while((ch = getc(p)) != EOF)
    {
        fscanf(p, "%c %c %c\n", &a, &b, &c);
        printf("%c %c %c\n", a, b, c);
    }
    fclose(p);

    return 0;
} 

获得的输出是:

 2 + 3
 5 + 6
 6 + 7

我无法理解为什么第一行输出符合预期但第二行和第三行缺少字符,即使在numbers.txt中的每个表达式后面都给出了新行。

2 个答案:

答案 0 :(得分:6)

while循环

的每次迭代开始时扫描另一个字符
while((ch = getc(p)) != EOF)

尝试将fscanf()语句作为while循环的条件,并检查其返回值。根据 cplusplus.com

  

成功时,该函数返回参数的项数   列表已成功填写。此计数可以匹配预期的数量   由于匹配失败,读数,项目或更少(甚至为零)   错误,或文件结尾的范围。

     

如果发生读取错误或达到文件结尾时   阅读,设置正确的指标(feof或ferror)。而且,如果有的话   在成功读取任何数据之前发生,返回EOF

因此,请尝试将您的while条件更改为以下任何人:

while (fscanf(p, " %c %c %c", &a, &b, &c) != EOF)

while (fscanf(p, " %c %c %c", &a, &b, &c) == 3)

答案 1 :(得分:6)

使用scanf格式说明符中的空格,就像使用\n一样,匹配任何数量的空格。消耗\n和下一行的前导空格,导致getc删除第一个数字而不是前导空格。

我完全跳过getc,因为@BLUEPIXY建议:

while (fscanf(p, " %c %c %c", &a, &b, &c) == 3) {
    printf("%c %c %c\n", a, b, c);
}