【问题标题】:Unable to understand - reading characters from files in C无法理解 - 从 C 中的文件中读取字符
【发布时间】:2017-05-22 20:33:52
【问题描述】:

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

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;
} 

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

 2 + 3
 5 + 6
 6 + 7

得到的输出是:

2 + 3
  + 6
  + 7

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

【问题讨论】:

  • 请查看fopen的返回值。
  • 1) "a+" --> "r" 2) while((ch = getc(p)) != EOF) { fscanf(p, "%c %c %c\n", &a, &b, &c); --> while(fscanf(p, " %c %c %c\n", &a, &b, &c) == 3) {
  • 还要检查来自fscanf的返回值
  • 查看fix here
  • 不要将getc(...)分配给char;它返回 int 是有原因的。

标签: c file-handling


【解决方案1】:

在您的 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)

【讨论】:

    【解决方案2】:

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

    我会完全跳过getc,正如@BLUEPIXY 建议的那样:

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

    【讨论】:

      猜你喜欢
      • 2012-07-22
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 2015-05-20
      • 2014-01-21
      • 2012-02-04
      • 2017-09-06
      • 1970-01-01
      相关资源
      最近更新 更多