为什么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 ?
}
}