C:根据文件名创建新的文件扩展名

use*_*179 0 c string strcat

我想基于具有不同扩展名的基本文件名来命名输出文件.在C伪代码中:

a_file = fopen(filename + ".dt1","wt");
b_file = fopen(filename + ".dt2","wt");
c_file = fopen(filename + ".dt3","wt");
Run Code Online (Sandbox Code Playgroud)

我尝试使用示例strncat,但我的程序继续追加filename.

f1=fopen(strcat(filename,".dt1"),"wt");
f2=fopen(strcat(filename,".dt2"),"wt");
f3=fopen(strcat(filename,".dt3"),"wt");
Run Code Online (Sandbox Code Playgroud)

这输出:

filename.dt1
filename.dt1.dt2
filename.dt1.dt2.dt3
Run Code Online (Sandbox Code Playgroud)

我需要最终结果看起来像:

filename.dt1
filename.dt2
filename.dt3
Run Code Online (Sandbox Code Playgroud)

pb2*_*b2q 6

考虑到strcat将扩展名附加到给定字符串,您的代码正在按预期工作.您只使用一个字符串,因此扩展会相互堆叠.

这是一种方法,修改您使用单个字符串的已发布代码filename:

size_t len = strlen(filename);
f1 = fopen(strcat(filename, ".dt1"), "wt");
filename[len] = '\0';
f2 = fopen(strcat(filename, ".dt2"), "wt");
filename[len] = '\0';
f3 = fopen(strcat(filename, ".dt3"), "wt");
Run Code Online (Sandbox Code Playgroud)

设置此索引以\0有效地截断filename回调用之间的原始字符串.

请注意,filename 必须足够大以包含附加的扩展名 - 另外4个字符的空间 - 并且通过这样做,您将在打开每个文件后丢失中间文件名.

或者,如果您的扩展名仅在最后一个字符中有所不同:

size_t len = 0;
f1 = fopen(strcat(filename, ".dt1"), "wt");
len = strlen(filename);
filename[len - 1] = '2';
f2 = fopen(filename), "wt");
filename[len - 1] = '3';
f3 = fopen(filename, "wt");
Run Code Online (Sandbox Code Playgroud)

与上述相同的警告适用.


Seb*_*olm 6

那是因为strcat直接写入第一个字符串的缓冲区.

最简单的方法可能是snprintf将两个字符串连接在一起:

snprintf(filename_a, n+4, "%s.dt1", filename);
snprintf(filename_b, n+4, "%s.dt2", filename);
snprintf(filename_c, n+4, "%s.dt3", filename);
Run Code Online (Sandbox Code Playgroud)

在这里,filename是长度n(包括结尾\0),和filename_a,filename_bfilename_c至少是长度的缓冲器n+4.

(你也可以使用sprintf,但要小心谨慎.)