Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 通过snprintf打开_C_File_Printf_Fopen - Fatal编程技术网

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 */