【问题标题】:In C, "getc" reads only three lines from text file在 C 中,“getc”只从文本文件中读取三行
【发布时间】:2021-03-09 13:02:33
【问题描述】:

我的代码在这里

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

我的 dic.txt 在这里

dic.txt

我的预测是“涨涨涨涨”
因为,有四个空格“”

但它只打印了一个“up”

什么问题?

【问题讨论】:

  • 将文本文件作为文本发布到代码块中。不是图片。
  • @klutt 抱歉,算了,评论已删除。谢谢
  • 关于:while(getc(fp) != EOF){ if(getc(fp) == ' '){ 每次循环输入两个字符。建议:int ch; while( (ch = getc(fp)) != EOF){ if(ch == ' '){
  • 关于:fp = fopen("dic.txt", "r"); 对于健壮的代码,请始终检查 (!=NULL) 返回值以确保操作成功。建议:fp = fopen("dic.txt", "r"); if( ! fp ) { perror( "fopen to read dic.txt failed" ); exit( EXIT_FAILURE ); }

标签: c getc


【解决方案1】:

试用此代码:

FILE *fp;

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

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

return 0;

【讨论】:

    【解决方案2】:

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

    这有两个后果:

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

    如何解决

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

    【讨论】:

    • @Jabberwocky 有什么意义? OP 在编写代码时犯了一个错误;每次迭代都会对getc 进行两次调用;这两个调用中只有一个测试EOF,所以第一次到达 EOF 时,它可能不会被检测到,并且会进行额外的调用。
    • 算了,我在这段时间里删除了我无意义的评论,你也可以删除你的
    • @Jabberwocky 您的评论并非毫无用处。这表明你误解了我的解释。这表明我的解释可能不够清楚。
    • 不,显然是我读错了。答案很明确。
    【解决方案3】:

    你想要这个:

    #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 是否失败。

    【讨论】:

    • 关于:printf("Can't open file\n"); 错误消息应该输出到stderr,而不是stdout。当错误来自 C 库函数(如“fopen()”)时,还应将系统认为发生错误的文本原因输出到stderr。建议调用perror(),因为它会输出您的错误消息和文本原因。
    猜你喜欢
    • 2020-09-21
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    • 2020-02-24
    相关资源
    最近更新 更多