C 通过snprintf打开
然而,在编译警告时,我在编译程序时遇到了一些问题,这些问题本来可以正常工作,但我试图将C 通过snprintf打开,c,file,printf,fopen,C,File,Printf,Fopen,然而,在编译警告时,我在编译程序时遇到了一些问题,这些问题本来可以正常工作,但我试图将strcpy&strcat压缩为snprintf(以删除不必要的代码行) 传递'snprintf'的参数2将从指针生成整数,而不进行强制转换 呈现自己。我已经尝试过搜索其他有这个问题的人,但是一旦修改,他们的解决方案似乎与我的代码不兼容 fileDir在程序开始时定义为:char fileDir[1000] event->name是文件名(及其扩展名),例如picture1.jpg hashDirectory是
strcpy
&strcat
压缩为snprintf
(以删除不必要的代码行)
传递'snprintf'的参数2将从指针生成整数,而不进行强制转换
呈现自己。我已经尝试过搜索其他有这个问题的人,但是一旦修改,他们的解决方案似乎与我的代码不兼容
fileDir
在程序开始时定义为:char fileDir[1000]代码>
event->name
是文件名(及其扩展名),例如picture1.jpg
hashDirectory
是“/home/user/Documents/\u Hash”
我可以打开该文件,但是只有当我使用strcpy
和strcat
时,我才可以打开该文件。这正是我试图摆脱的问题。因此,您的代码存在一些问题,所有注释都证明了这一点
现在,我们将跳过这一部分,集中讨论snprintf
与printf
类似,只是有两个额外的参数需要首先传递,一个是char*
,指示在何处存储渲染的字符数据,另一个是size\t
,指示char*
处有多少可用空间。实现这一点的惯用方法(假设目标是char[]
)是使用sizeof()
,如下所示:
int res = snprintf(fileDir, sizeof(fileDir), /* Other arguments omitted */);
snprintf
返回打印的字符数(作为int
)。如果该数字大于或等于sizeof(fileDir)
,则fileDir
中的任何内容都将被截断(但总是NULL
终止)
最后,由于snprintf
的返回值是int
,因此不能将其作为第一个参数传递给fopen
,因为这要求第一个参数是常量字符*
。因此,这些需要单独的步骤
说到这里,您构建路径的方式似乎也不正确。在下面的完整示例中,我已经修复了它:
FILE *ftest2;
int res = snprintf(fileDir, sizeof(fileDir), "%s/%s.txt", hashDirectory, event->name);
if (res >= sizeof(fileDir)) {
fprintf(stderr, "The pathname was truncated. Cannot proceed.\n");
return -1;
}
ftest2 = fopen(fileDir, "wt");
if (!ftest2) {
fprintf(stderr, "Failed to open `%s': %s\n", fileDir, strerror(errno));
return -1;
}
/* Rest of your code */
一个重要的注意事项是,如果snprintf
的第一个参数是指向动态分配内存的指针(即从malloc
),您将无法使用sizeof()
,而是需要显式传递动态分配区域的大小sizeof()
在编译时计算(忽略),而不是在运行时
(如果要使用该部件,您需要为strerror()
调用包含string.h
和errno.h
)一个,在一行中塞进太多代码的真正糟糕的副作用是,当它不工作时无法调试它……这是因为第二个参数是size\u t
而不是字符串。检查此处函数的文档并相应地修复函数调用。@Blaze…因为snprintf
返回int
,而fopen
接受const char*
作为其第一个参数。您要创建什么文件名?您有一个包含扩展名的文件名,并将“:.txt”
添加到it@Gerhardh只是一个.txt文件,但删除原始文件扩展名是另一次的问题哈哈。
if (res >= sizeof(fileDir)) {
/* fileDir contains an incomplete path, handle this as an error */
}
FILE *ftest2;
int res = snprintf(fileDir, sizeof(fileDir), "%s/%s.txt", hashDirectory, event->name);
if (res >= sizeof(fileDir)) {
fprintf(stderr, "The pathname was truncated. Cannot proceed.\n");
return -1;
}
ftest2 = fopen(fileDir, "wt");
if (!ftest2) {
fprintf(stderr, "Failed to open `%s': %s\n", fileDir, strerror(errno));
return -1;
}
/* Rest of your code */