C 把胡言乱语写入文件?
我打开了一个文件,我们把这个文件叫做key.txtC 把胡言乱语写入文件?,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);
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(fa和c)代码>具有未定义的行为。使用fprintf
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(fa和c)代码>具有未定义的行为。使用fprintf
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]
不同,并将其标记。