在 C 中,"getc" 只从文本文件中读取三行

In C, "getc" reads only three lines from text file

我的代码在这里

int main(){
  FILE *fp;
  fp = fopen("dic.txt", "r");
  while(getc(fp) != EOF){
    if(getc(fp) == ' '){
        printf("up ");
    }
  }
}

我的 dic.txt 在这里

dic.txt

我的预测是“向上向上”
因为,有四个 space " "

但它只打印了一个“up”

有什么问题?

您在每次循环迭代中调用 getc 两次;这两个调用之一将字符与 EOF 进行比较,而另一个调用将字符与 ' '.

进行比较

这有两个后果:

  • 您的程序将只打印 "up" 偶数位置的空格,而忽略所有奇数位置的空格;
  • 您的程序可能会在第一次到达 EOF 后额外调用一次 getc

如何修复

您需要在循环的每次迭代中对 getc 进行 单次 调用。将getc返回的字符保存到一个局部变量中;然后使用此变量检查循环体中的空格,检查循环条件中的EOF

你想要这个:

#include <stdio.h>

int main() {
  FILE* fp;
  fp = fopen("dic.txt", "r");
  if (fp == NULL)
  {
    printf("Can't open file\n");
    return 1;
  }

  int ch;                            // int is needed her, not char !!
  while ((ch = getc(fp)) != EOF) {   // read one char and check if it's EOF in one go
    if (ch == ' ') {
      printf("up ");
    }
  }
}
  • 你只需要在循环中调用一次getc,否则你会跳过两个字符中的一个。
  • 奖金:您需要检查 fopen 是否失败。

试试这段代码:

FILE *fp;

fp = fopen("dic.txt", "r");
int ch = getc(fp);

while(ch != EOF){
    if(getc(fp) == ' '){
        printf("up ");
    }
}

return 0;