用C编程语言从文本文件中提取字符

时间:2015-04-18 17:51:34

标签: c

创建一个程序以提取(仅)文本文件中包含的字母字符,并将它们转储到不同的文件中。提取的字符必须是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;
}

2 个答案:

答案 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);
}
...