创建一个程序以提取(仅)文本文件中包含的字母字符,并将它们转储到不同的文件中。提取的字符必须是ASCII码为32到127的字符。
我无法解决这个问题,你能帮助我吗?
#include <stdio.h>
int main()
{
FILE *fp1;
FILE *fp2;
char ch;
fp1 = fopen("bin.txt","r");
fp2 = fopen("text.txt","w");
ch = fgetc(fp1);
while(ch != EOF)
{
if(ch >= '32' && ch <= '127')
putc(ch,fp2);
else
continue;
}
fclose(fp1);
fclose(fp2);
return 0;
}
答案 0 :(得分:1)
我在你的程序中发现了3个错误。首先,您只读取文件中的第一个字符。然后你不能正确检查它 - 看到注释掉的和替换的行。第三个是在char
返回fgetc
时使用int
类型,可能是EOF
。此外,当循环中没有更多语句时,不需要continue
,您应该检查文件是否已打开。
#include <stdio.h>
int main()
{
FILE *fp1;
FILE *fp2;
int ch;
fp1 = fopen("bin.txt","r");
fp2 = fopen("text.txt","w");
if (fp1 == NULL || fp2 == NULL)
return 1; // bad files
while((ch = fgetc(fp1)) != EOF) // read a char in each loop
//if(ch >= '32' && ch <= '127') // don't test 'char' !
if(ch >= 32 && ch <= 127) // test as values
putc(ch,fp2);
fclose(fp1);
fclose(fp2);
return 0;
}
答案 1 :(得分:0)
您应该将ch
的类型更改为int
,否则您可能无法测试EOF
。您应该测试文件是否已成功打开。您只从文件中读取一个字符,并且您对ASCII的测试不正确。以这种方式修改循环:
...
int ch;
fp1 = fopen("bin.txt","r");
fp2 = fopen("text.txt","w");
if (fp1 == NULL || fp2 == NULL) {
printf("cannot open files\n");
exit(1);
}
while ((ch = getc(fp1)) != EOF) {
if (ch >= 32 && ch <= 127)
putc(ch, fp2);
}
...