所以我打开一个文件,让我们调用该文件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^?
所以我不知道这里发生了什么。我该如何解决?我不确定究竟是什么问题
答案 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
。
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);
}
}