被跳过的字符是输出文件i / o

时间:2016-10-11 21:14:23

标签: c io

我有一个函数用于通过用前面的三个字母替换每个字符来加密文件,但是我对输出有一些问题。

void file_encrypt(char * filename)
{
    FILE *file1 = fopen(filename, "r");
    char c;

    if(file1 != NULL) {
        while(fscanf(file1, "%c", &c) == 1) {
            c = fgetc(file1);
            if(c == 'a' || c == 'b' || c == 'c' || c == ' ') {
                switch(c) {
                    case 'a': putchar('x');
                        break;
                    case 'b': putchar('y');
                        break;
                    case 'c': putchar('z');
                        break;
                    case ' ': putchar(' ');
                        break;
                }
            }
            else 
                printf("%c", c - 3);
        }
    }  
}

我的输入文件是一个包含aaaaa bbbbb ccccc def作为简单测试的文本文件,所以我的输出应该xxxxx yyyyy zzzzz abc,而不是它xx yy zz b

我已尝试搞乱while循环条件(将其设为!= EOF而不是== 1,将fscanf更改为fgetc检查{} {1}}语句先前已c = fgetc(file1)将char分配给c的地址,结果相同。

现在看着它我可以看到它正在读或写所有其他角色,包括跳过第一个角色。任何人都知道为什么会这样?

1 个答案:

答案 0 :(得分:0)

在循环开始时,您从文件中读取两次,忽略读取的第一个值(进入cfscanf()):

    while(fscanf(file1, "%c", &c) == 1) {
        c = fgetc(file1);

您可能希望将其简化为只读一次:

    int c;   // EOF is not a 'char' value
    while ((c = fgetc(file1)) != EOF) {