繁体   English   中英

为什么 fgetc 不在 eof 处停止

[英]Why does fgetc not stop at eof

假设我有input.txt ,其中包含“123456789”。 我正在尝试使用fputcfgetc将奇数写入odd.txt和将偶数写入even.txt even.txt我没有任何问题,但odd.txt包含“13579ÿ”。 我怎样才能删除这个ÿ? 为什么会这样?

#include <stdio.h>
#define true 1

int main(void){

    FILE *fp = fopen("input.txt", "r+");
    FILE *odd = fopen("odd.txt", "w");
    FILE *even = fopen("even.txt", "w");
    
    char ch;
    while(true){
        ch = fgetc(fp); 

        if((ch - '0') % 2 == 0){//even
            fputc(ch, even);
        }
        else{//odd
            fputc(ch, odd);
        }

        if(feof(fp)){
            break;
        }
    }
    fclose(fp);
    fclose(odd);
    fclose(even);
    return 0;
}

问题是由发送EOF (aka -1) 到odd引起的。 当遇到输入文件的结尾时, fgetc()会收到此 EOF 标记。

检查一个数字是否被实际解析

   if('0' <= ch && ch <= '9') {
        if ((ch - '0') % 2 == 0) {
            fputc(ch, even);
        }
        else{//odd
            fputc(ch, odd);
        }
   } else {
        ... error
   }

此外,在处理ch之前检查feof() ,或者将ch的类型更改为int以使其包含EOF值。 您可以使用在<ctype.h>中定义的isdigit()

循环可能如下所示:

    int ch;
    while ((ch = fgetc(fp)) != EOF) {
        if(isdigit(ch)) {
            if ((ch - '0') % 2 == 0) {
                fputc(ch, even);
            } else { //odd
                fputc(ch, odd);
            }
        } else {
            ... error ?
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM