[英]Why does fgetc not stop at eof
假设我有input.txt
,其中包含“123456789”。 我正在尝试使用fputc
和fgetc
将奇数写入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.