[英]Reading character by character from a file in C
我写了以下程序:
int main(){
char str[500],c;
FILE *f1=fopen("input.txt","r");
FILE *f2=fopen("output.txt","w");
while(c=fgetc(f1)!=EOF)
fputc(toupper(c),f2);
fclose(f1);
}
我没有得到想要的结果。 我使用do while循环重写了代码。
int main(){
char str[500];
FILE *f1=fopen("input.txt","r");
FILE *f2=fopen("output.txt","w");
char c;
do
{
fputc(toupper(c),f2);
c=fgetc(f1);
}while(c!=EOF);
}
我发现第一个代码失败的原因是因为在while循环while(c=fgetc(f1)!=EOF)
,我们不能保证!=
的左半部分首先被求值,因此结果不正确。 这是正确的解释吗?
是的,你是对的; 在您的第一个代码中,您的while循环写错了:
while(c=fgetc(f1)!=EOF)
应该:
while((c=fgetc(f1))!=EOF)
// ^ ^ added parenthesis
由于条件表达式c=fgetc(f1)!=EOF
中运算符 !=
的优先级大于=
运算符,因此第一个运算符返回将fgetc()
的值与EOF(0或1)进行比较的结果,并将其分配给c
。 (这意味着简单地c=fgetc(f1)!=EOF
表达式等效于c=(fgetc(f1)!=EOF)
,这不是您所需要的。)
您需要()
覆盖我建议的优先级。
但是您还有第二点要改进的地方,就是c
变量必须为int
( 而不是 char
)才能保留EOF值。
很好的阅读: EOF的定义以及如何有效使用它
我将补充一点,为什么c
应该是int
而不是char
。 假设你写
#include <stdio.h>
#include <ctype.h>
#include <locale.h>
int main(){
setlocale(LC_ALL,"");
FILE *f1=fopen("input.txt","r");
FILE *f2=fopen("output.txt","w");
char c;
while(EOF != (c=fgetc(f1))){
if(isalpha(c)) c = toupper(c);
fputc(c,f2);
}
return 0;
}
而您的input.txt
是
some text
Некоторый текст
Ъ - on this letter program will stop
在KOI8-R符号Ъ
具有代码255 == -1(当使用char
)。 这就是为什么在使用char
而不是int
情况下将只为该文本提供output.txt
:
SOME TEXT
НЕКОТОРЫЙ ТЕКСТ
至于带有括号的非工作代码: c=fgetc(f1)!=EOF
可以由编译器表示为c = (fgetc(f1)!=EOF)
,这就是为什么总是加括号的原因。
我建议您在编译应用程序时使用标志-Wall -Werror
。 在这种情况下,“忘记”括号会给您一个错误:
11.c: In function 'main':
11.c:9:2: error: suggest parentheses around assignment used as truth value [-Werror=parentheses]
cc1: all warnings being treated as errors
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.