C 把胡言乱语写入文件?

C 把胡言乱语写入文件?,c,printf,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);

我打开了一个文件,我们把这个文件叫做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);
好的,这看起来不错,现在它将每个字母字符添加到文件中,但问题是,它将更多的字符添加到一行文本中。我正试图指出这个问题。 下面是一个例子,在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^?
l^0)是吗?
o^0)y^?
l^0)y^?
x^0)y^?
d^0)y^?
所以我不明白这里发生了什么。我该如何解决这个问题?我不确定确切的问题是什么

您使用的
fprintf()
错误。从中,预期的格式为

int fprintf(FILE *stream, const char *format, ...);
其中,第一个参数是文件指针,第二个参数是转换说明符,第三个参数是前面提到的转换说明符的参数

引用
C11
,第§7.21.6.1章,
fprintf()
,作为格式说明符

c

如果不存在
l
长度修饰符,则
int
参数将转换为
无符号字符
,并写入结果字符。[……]

所以,如果你想写一个字符,你需要使用

fprintf(fa, "%c", c);   //%c for character, no '&' needed before variable
也就是说,
getc()
返回一个
int
,因此您应该在
int
变量中捕获返回值

故事的寓意:启用编译器警告。

您使用的
fprintf()
错误。从中,预期的格式为

int fprintf(FILE *stream, const char *format, ...);
其中,第一个参数是文件指针,第二个参数是转换说明符,第三个参数是前面提到的转换说明符的参数

引用
C11
,第§7.21.6.1章,
fprintf()
,作为格式说明符

c

如果不存在
l
长度修饰符,则
int
参数将转换为
无符号字符
,并写入结果字符。[……]

所以,如果你想写一个字符,你需要使用

fprintf(fa, "%c", c);   //%c for character, no '&' needed before variable
也就是说,
getc()
返回一个
int
,因此您应该在
int
变量中捕获返回值


故事的寓意:启用编译器警告。

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

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

  • fprintf
    必须传递一个格式字符串<代码>fprintf(fa和c)具有未定义的行为。使用
    fprintf(fa,“%c”,c)或简单地
    putc(c,fa)。未定义的行为意味着任何事情都可能发生:胡言乱语的输出是一种可能性,程序崩溃是另一种可能性

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

以下是更正的版本:

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

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

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

  • fprintf
    必须传递一个格式字符串<代码>fprintf(fa和c)具有未定义的行为。使用
    fprintf(fa,“%c”,c)或简单地
    putc(c,fa)。未定义的行为意味着任何事情都可能发生:胡言乱语的输出是一种可能性,程序崩溃是另一种可能性

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

以下是更正的版本:

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

fprintf(fa和c)-->
fprintf(fa,“%c”,c)?@SouravGhosh成功了谢谢!Craig Estey,我确实用-Wall编译了,它工作得很好是的,它确实编译了[我再次查看后再次检查],这就是为什么我删除了我的第一条评论。
&c
[从技术上讲]将是一个
字符*
,并且将被编译器中的格式扫描程序接受。当调用
fprintf()
传递参数的内容,而不是参数的地址时,它无法推断它不是与
char fmt[2]
等价的,并标记它-->
fprintf(fa,“%c”,c)?@SouravGhosh成功了谢谢!Craig Estey,我确实用-Wall编译了,它工作得很好是的,它确实编译了[我再次查看后再次检查],这就是为什么我删除了我的第一条评论。
&c
[从技术上讲]将是一个
字符*
,并且将被编译器中的格式扫描程序接受。当调用
fprintf()
传递参数的内容,而不是参数的地址时,它无法推断它与
char fmt[2]
不同,并将其标记。