文件的结束值打印为问号

时间:2015-02-21 18:06:51

标签: c eof

我遇到从一个文件写入另一个文件的问题,特别是最后一个值,即文件末尾,在黑色方块中打印为问号。

我的代码应该在某些条件下替换文本,这些条件完全适用于最后一个值,即EOF会产生一些问题。

有什么想法吗?

输入文件

Hi, this is *list* version v2.
Contains 8 words. 123

输出文件

___, _____ ___ *_____* _____ ___.
_____ ___ _____. ___�

C源文件

int main()
{
    FILE *li, *sa;

    li = fopen("list.txt", "r");
    sa = fopen("sablona.txt", "w");

    int c, poc = 0;
    char a[3] = "___"; 
    char b[5] = "_____";

    while ( ! feof(li) > 0 ) {

        c = getc(li);

        if ( isalnum(c) )
            poc++;
        else if ( poc > 0 && poc < 4 ) {
            fputs(a, sa);
            poc = 0;
        }
        else if ( poc >= 4 ) {
            fputs(b, sa); 
            poc = 0;
        }

        if ( ! isalnum(c) )
            putc(c, sa);
    }

    fclose(li);
    fclose(sa);

    return 0;
}

1 个答案:

答案 0 :(得分:1)

跳过“123”的原因是因为在最后一个文件读取后,计数poc悬空。有两种方法可以解决这个问题。

1)将newline添加到文件中最后一行的末尾。您最初跳过“123”的原因是因为您将EOF值视为一个字符。更好的是 -

2)在循环终止后,通过重复测试来检查悬空poc值。

代码(上面评论中建议的更正)看起来像这样。

#include <stdio.h>
#include <ctype.h>

int main(void) {

    FILE *li, *sa;
    int c, poc=0;
    char a[] = "___";               // removed length spec
    char b[] = "_____";             // removed length spec

    li = fopen("test.txt", "r");
    sa = fopen("sablona.txt", "w");

    while((c = getc(li)) != EOF) {  // altered end-of-file check

        if(isalnum(c))
            poc++;

        else if(poc>0 && poc<4){
            fputs(a, sa);
            poc = 0;
        } else if(poc>=4){
            fputs(b, sa); 
            poc = 0;
        }
        if(!isalnum(c))
            putc(c, sa);
    }

    if(poc>0 && poc<4){             // check for dangling poc
        fputs(a, sa);
        poc = 0;
    } else if(poc>=4){
        fputs(b, sa); 
        poc = 0;
    }

    fclose(li);
    fclose(sa);
    return 0;
}