【问题标题】:fgetc giving me garbagefgetc 给我垃圾
【发布时间】:2018-01-23 11:24:22
【问题描述】:

我编写了一个简单的程序来将文本从 ASCII 文件输出到命令行,但我得到了垃圾字符。这是我的代码的相关部分:

void main(int argc, char *argv[]) {
    char *filename;
    ... [filename is defined here as the command-line argument]
    FILE *fptr = fopen(filename, "r");
    if (fptr == NULL) {
        printf("Error: no such file %s!\n", filename);
        exit(1);
    } else {
        int c;
        while(c = fgetc(fptr) != EOF) {
            putchar(c);
        }
        fclose(fptr);
    }
}

当我使用包含一行文本的简单测试文件运行此代码时,我得到一堆垃圾符号。

【问题讨论】:

  • 你的语句相当于while( c=(fgetc(fptr) != EOF)),所以你需要像while( (c=fgetc(fptr)) != EOF )这样的括号
  • while (c=fgetc(fptr) != EOF ) {: 你不关心=!= 的优先级。试试这个:while ((c=fgetc(fptr)) != EOF) {.
  • ...否则 c 将始终为 1 并且一次(最终)为 0。
  • 所以由于我的语法不好,指针永远不会递增到下一个字符?我懂了。但我想知道为什么这不会导致无限循环。 *编辑:不,我解释错了。我猜 fgetc 使用它自己的内部指针来到达文件末尾而不修改参数指针,并且 int c 总是评估为 1
  • 再次,复合表达式出错了:( 编写简单的代码,编写易于测试的代码,编写易于调试的代码。然后您可能会得到工作代码。

标签: c file io


【解决方案1】:

运算符 != 优先于运算符 =,因此您的变量 c 被分配了比较值( fgetc(fptr) != EOF)。要解决这个问题,您必须在作业周围加上括号:

#include <stdlib.h>
#include <stdio.h>
#include <assert.h>

int main(int argc, char ** argv)
{
    assert(argc == 2);
    FILE * fptr = fopen(argv[1], "r");
    assert(fptr);
    int c;
    while((c = fgetc(fptr)) != EOF) putchar(c); 
    fclose(fptr);
    return 0;
}

(请注意,我声明这些值只是为了便于阅读。由于您的程序与用户交互,因此您可以手动检查它们并打印特定的错误消息。)

【讨论】:

  • 为什么对他的代码进行所有其他不相关的更改?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多