问题描述
我正在尝试使用 fopen 在 C 中写入文件,但我要写入的文件的扩展名必须是一个变量。
扩展名存储在变量 extension
中,而我要写入的文本存储在 result
中。
我尝试使用此功能,但未创建文件。
void createAndWrite(char* result,char* extension){
char buf[100];
sprintf(buf,"%s.%s","outputFile",extension);
FILE *fh = fopen (buf,"wb");
if (fh != NULL) {
fwrite (result,sizeof (result),1,fh);
fclose (fh);
}
}
如果我手动写入文件名,它可以完美地工作,例如FILE *fh = fopen ("outputFile.txt","wb");
:文件已创建且输出正确。
我还尝试使用 strcat(),snprintf()
之类的函数或指定整个文件路径,但没有任何效果。
访问扩展变量不是问题,因为如果我执行 printf("%s",buf);
我可以看到正确的文件。
我如何解决它?
解决方法
sizeof(char* result) will always result in 4 (32 bit target) or 8 (64 bit target)
除非 result
的实际长度匹配 3 或 7 个字节(还要考虑 NULL
终止符),否则错误的长度信息将导致 fwrite (result,sizeof (result),1,fh);
失败。替换为:
fwrite (result,strlen(result) + 1,fh);
旁白:(不是主要问题的一部分)关于以下内容:
char buf[100];
sprintf(buf,"%s.%s","outputFile",extension);
即使 sprintf()
确实为成功调用在结果缓冲区中附加了一个 \0
终止符,但作为规则,初始化是一个好习惯。要在字符串函数中使用的缓冲区。例如::
char buf[100] = {0};//populates entire memory location with `nul` characters.