在文件中写乱码?

时间:2017-02-24 18:44:42

标签: c printf

所以我打开一个文件,让我们调用该文件key.txt

    FILE *fp;
    fp = fopen("key.txt", "r");

现在假设我有另一个用代码打开的文件(fa)" a"附加到它。现在我正在读取fp中的所有字符,并将每个字母字符附加到文件fp,但它附加了更多。

    char c;
    do {
        c = getc(fp);
        if(isalpha(c)){
            fprintf(fa, &c);
            fprintf(fa, "\n");
        }
     } while(c != EOF);

好的,这对我来说很好看,现在它将每个字母字符添加到文件中,但问题是,它甚至将 MORE 字符添加到单行文本中。我试图找出这个问题。 这是一个例子,我们在key.txt里面有

    lol
    xd

输出文件fa具有内容

    l<82>^0)y^?
    o<82>^0)y^?
    l<82>^0)y^?
    x<82>^0)y^?
    d<82>^0)y^?

所以我不知道这里发生了什么。我该如何解决?我不确定究竟是什么问题

2 个答案:

答案 0 :(得分:5)

您使用fprintf()错误。从man page开始,预期格式为

int fprintf(FILE *stream, const char *format, ...);

其中,第一个参数是文件指针,第二个参数是转换说明符,第三个参数是(是)所提到的转换说明符的参数。

引用C11,章节§7.21.6.1,fprintf(),格式说明符

  

c

     

如果不存在l长度修饰符,则int参数将转换为   unsigned char,并写出结果字符。 [...]

因此,如果你想写一个角色,你需要使用像

这样的东西
fprintf(fa, "%c", c);   //%c for character, no '&' needed before variable

也就是说,getc()会返回int,因此您应该在int变量中捕获返回值。

故事的道德:启用编译器警告。

答案 1 :(得分:1)

您的代码片段有几个问题:

char c;
do {
    c = getc(fp);
    if(isalpha(c)){
        fprintf(fa, &c);
        fprintf(fa, "\n");
    }
 } while(c != EOF);
  • c应使用int类型声明,以适应unsigned char类型的所有值加上特殊负值EOF

    < / LI>
  • fprintf必须传递格式字符串。 fprintf(fa, &c);有未定义的行为。使用fprintf(fa, "%c", c);或仅putc(c, fa);未定义的行为意味着任何事情都可能发生:乱码输出是一种可能性,程序崩溃是另一种可能......

  • 在循环中进一步处理之前检查EOFdo { ... } while循环不合适,请改用while ((c = getc(fp)) != EOF) { ... }

以下是更正后的版本:

int c;
while ((c = getc(fp)) != EOF) {
    if (isalpha(c)) {
        fprintf(fa, "%c\n", c);
    }
 }