为什么fgetc不在eof停止

为什么fgetc不在eof停止,c,file,C,File,假设我有input.txt,其中包含“123456789”。我试图通过使用fputc和fgetc将奇数写入odd.txt,将偶数写入偶数.txt。我对偶数.txt没有任何问题,但是奇数.txt包含 "13579ÿ". 我怎样才能去掉这个?为什么会发生这种情况 #include <stdio.h> #define true 1 int main(void){ FILE *fp = fopen("input.txt", "r+");

假设我有
input.txt
,其中包含“123456789”。我试图通过使用
fputc
fgetc
将奇数写入
odd.txt
,将偶数写入
偶数.txt
。我对
偶数.txt
没有任何问题,但是
奇数.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;
}
#包括
#定义真1
内部主(空){
文件*fp=fopen(“input.txt”,“r+”);
FILE*odd=fopen(“odd.txt”,“w”);
FILE*even=fopen(“even.txt”,“w”);
char ch;
while(true){
ch=fgetc(fp);
如果((ch-'0')%2==0){//偶数
fputc(ch,偶数);
}
else{//奇数
fputc(ch,奇数);
}
if(feof(fp)){
打破
}
}
fclose(fp);
fclose(奇数);
fclose(偶数);
返回0;
}

问题是由于将
EOF
(aka-1)发送到
奇数
引起的。当遇到输入文件结尾时,
fgetc()
将接收此EOF sentinel

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

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

因为
feof
测试上一次读取操作是否成功,而不是是否还有可用数据。您需要将
ch
声明为
int
,并测试它的
EOF
。然后,您根本不需要
feof
。谢谢,我修复了它mehmet-emre-topdal,如果文件包含0个字符,您希望打印什么?“在处理ch之前检查feof()”我尝试了这个方法,效果很好。谢谢大家在循环中少做一次测试,可以使用
while(isdigit(ch=fgetc(fp)){…}如果(ch!=EOF)Error()
@chux,我不确定,它会在第一个非数字上停止,比如空格。它可能不是缩进的东西。
    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 ?
        }
    }