我正在尝试一个非常简单的程序,在test.txt中编写的任何内容都可以在up.txt中复制,但以大写字母。我在windows 11上使用dev c++,运行程序后创建了up.txt文件,但它是空的,我不知道为什么。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(){
FILE *fpin, *fpout;
char x;
fpin=fopen("test.txt","r");
if(fpin==NULL){
fprintf(stderr,"read errorn");
exit(666);
}
fpout=fopen("up.txt","w");
if(fpout=NULL){
fprintf(stderr,"write error/n");
exit(667);
}
while((x=fgetc(fpin))!=EOF){
fputc(toupper(x),fpout);
}
fclose(fpin);
fclose(fpout);
return 0;
}
我在linux上成功地尝试了相同的程序,但我不确定为什么它在windows上不起作用
这段代码不可能在任何平台上运行。您确定在Linux上运行的代码实际上与问题中显示的代码完全相同吗?
主要问题在这里:
fpout=fopen("up.txt","w");
// up.txt is now created
if (fpout = NULL) { // you're using an assignment here (=) instead
// of the == operator
fprintf(stderr,"write error/n");
exit(667);
}
// fpout is NULL now
if (fpout = NULL)
不是比较,只是简单地将NULL
赋值给fout
。由于结果是false
(它或多或少与NULL相同),fprintf(stderr,"write error/n");exit(667)
将不会被执行,程序只是继续。
然后在接下来的while
循环中,您正在写入NULL文件指针,这是未定义的行为,最有可能的是程序会崩溃,或者它可能什么都不做或只是退出,或者可能是别的什么)。查找&;C未定义的行为&;在你最喜欢的搜索引擎
还有一个微妙的错误:char x;
应该是int x;
,因为fgetc
返回的是int
,而不是char
。
阅读以下文章获取更多信息:
- 为什么fgetc()返回int而不是char? C中int、char和EOF的混淆