在 C 中,"getc" 只从文本文件中读取三行
In C, "getc" reads only three lines from text file
我的代码在这里
int main(){
FILE *fp;
fp = fopen("dic.txt", "r");
while(getc(fp) != EOF){
if(getc(fp) == ' '){
printf("up ");
}
}
}
我的 dic.txt 在这里
dic.txt
我的预测是“向上向上”
因为,有四个 space " "
但它只打印了一个“up”
有什么问题?
您在每次循环迭代中调用 getc
两次;这两个调用之一将字符与 EOF
进行比较,而另一个调用将字符与 ' '
.
进行比较
这有两个后果:
- 您的程序将只打印
"up"
偶数位置的空格,而忽略所有奇数位置的空格;
- 您的程序可能会在第一次到达
EOF
后额外调用一次 getc
。
如何修复
您需要在循环的每次迭代中对 getc
进行 单次 调用。将getc
返回的字符保存到一个局部变量中;然后使用此变量检查循环体中的空格,和检查循环条件中的EOF
。
你想要这个:
#include <stdio.h>
int main() {
FILE* fp;
fp = fopen("dic.txt", "r");
if (fp == NULL)
{
printf("Can't open file\n");
return 1;
}
int ch; // int is needed her, not char !!
while ((ch = getc(fp)) != EOF) { // read one char and check if it's EOF in one go
if (ch == ' ') {
printf("up ");
}
}
}
- 你只需要在循环中调用一次
getc
,否则你会跳过两个字符中的一个。
- 奖金:您需要检查
fopen
是否失败。
试试这段代码:
FILE *fp;
fp = fopen("dic.txt", "r");
int ch = getc(fp);
while(ch != EOF){
if(getc(fp) == ' '){
printf("up ");
}
}
return 0;
我的代码在这里
int main(){
FILE *fp;
fp = fopen("dic.txt", "r");
while(getc(fp) != EOF){
if(getc(fp) == ' '){
printf("up ");
}
}
}
我的 dic.txt 在这里
dic.txt
我的预测是“向上向上”
因为,有四个 space " "
但它只打印了一个“up”
有什么问题?
您在每次循环迭代中调用 getc
两次;这两个调用之一将字符与 EOF
进行比较,而另一个调用将字符与 ' '
.
这有两个后果:
- 您的程序将只打印
"up"
偶数位置的空格,而忽略所有奇数位置的空格; - 您的程序可能会在第一次到达
EOF
后额外调用一次getc
。
如何修复
您需要在循环的每次迭代中对 getc
进行 单次 调用。将getc
返回的字符保存到一个局部变量中;然后使用此变量检查循环体中的空格,和检查循环条件中的EOF
。
你想要这个:
#include <stdio.h>
int main() {
FILE* fp;
fp = fopen("dic.txt", "r");
if (fp == NULL)
{
printf("Can't open file\n");
return 1;
}
int ch; // int is needed her, not char !!
while ((ch = getc(fp)) != EOF) { // read one char and check if it's EOF in one go
if (ch == ' ') {
printf("up ");
}
}
}
- 你只需要在循环中调用一次
getc
,否则你会跳过两个字符中的一个。 - 奖金:您需要检查
fopen
是否失败。
试试这段代码:
FILE *fp;
fp = fopen("dic.txt", "r");
int ch = getc(fp);
while(ch != EOF){
if(getc(fp) == ' '){
printf("up ");
}
}
return 0;