我需要一个快速的解决方案来完成这个简单的任务。
我正在修改源代码,它具有以下功能:
OFCondition MdfDatasetManager::saveFile(const char *file_name,
E_TransferSyntax opt_xfer,
E_EncodingType opt_enctype,
E_GrpLenEncoding opt_glenc,
E_PaddingEncoding opt_padenc,
OFCmdUnsignedInt opt_filepad,
OFCmdUnsignedInt opt_itempad,
OFBool opt_dataset)
在函数内部,有一行:
result = dfile->saveFile(file_name, opt_xfer, opt_enctype, opt_glenc,
opt_padenc,
OFstatic_cast(Uint32, opt_filepad),
OFstatic_cast(Uint32, opt_itempad),
(opt_dataset) ? EWM_dataset : EWM_fileformat);
请参阅file_name变量?
我想修改,因此file_name将在末尾添加“.out”。
所以,我添加了一个新变量:
char * output_file;
在调用dfile-> saveFile()函数之前,我添加了:
strcpy(output_file, file_name);
strcat(output_file, ".out");
result = dfile->saveFile(output_file, opt_xfer, opt_enctype, opt_glenc,
opt_padenc,
OFstatic_cast(Uint32, opt_filepad),
OFstatic_cast(Uint32, opt_itempad),
(opt_dataset) ? EWM_dataset : EWM_fileformat);
但是,这不起作用。
应用程序崩溃。我认为,问题是我需要初始化* output_file?
问题是,我不是C ++程序员:(
那么,有人可以帮忙吗?
感谢。
答案 0 :(得分:5)
没有为output_file
分配内存。改为使用std::string
:
std::string s(file_name);
s += ".out";
然后使用s.c_str()
作为o saveFile()
函数的第一个参数。
答案 1 :(得分:2)
很多人建议使用+=
将".out"
附加到string
,这是正确有效的,但不是非常直观。如果你考虑一个更自然的表达......
std::string x = file_name + ".out";
...你会发现它不起作用,因为编译器向char
数组添加指向char
的指针。数组不能添加到任何内容中,因此编译器会运行标准转换列表,寻找可能有意义的内容。遗憾的是,数组可以转换为另一个指针 - { - 1}}并允许两个指针的数字和(它们最终只是数字),但结果是一个无关的地址(甚至可能由于位大小而包装,这可能甚至不对应于程序的虚拟地址空间,也可能是随机的。在char
时,编译器没有考虑+
s方面的参数:在涉及左侧目的地之前评估赋值右侧的任何内容。因此,实现这一工作的最小直观变化是明确地将std::string
中的一个参数设为+
:
std::string
...或...
std::string x = std::string(file_name) + ".out";
作为添加大量内容的表达式从左到右进行评估,一旦你有std::string x = file_name + std::string(".out");
作为第一个或第二个参数,你可以添加其他ASCIIZ / C / std::string
“直到奶牛回家为止。
答案 2 :(得分:1)
当然它会崩溃。 output_file是指向字符数组的指针。但是你没有分配那个内存,也没有初始化指针。因此,它指向堆上的一些随机区域。当您尝试复制到它时,应用程序崩溃。
size_t total_size = strlen(file_name) + strlen(".out")+1;
char* output_file = new char[total_size];
memset(output_file, 0, total_size)
strcpy(output_file, file_name);
strcat(output_file, ".out");
请注意,您必须删除已分配的内存。
顺便说一下,你为什么不使用std :: string,所以你不必关心?std::string output_file(file_name);
output_file+= ".out";
result = dfile->saveFile(output_file.c_str(), opt_xfer, opt_enctype, opt_glenc,
opt_padenc,
OFstatic_cast(Uint32, opt_filepad),
OFstatic_cast(Uint32, opt_itempad),
(opt_dataset) ? EWM_dataset : EWM_fileformat);
答案 3 :(得分:0)
#include <string> // at the top of the program
std::string output_file = file_name;
output_file += ".out";
result = dfile->saveFile(output_file.c_str(), opt_xfer, opt_enctype, opt_glenc,
opt_padenc,
OFstatic_cast(Uint32, opt_filepad),
OFstatic_cast(Uint32, opt_itempad),
(opt_dataset) ? EWM_dataset : EWM_fileformat);
答案 4 :(得分:0)
使用std::string
让您的生活更轻松:
std::string outputFile(output_file);
outputFile += ".out";
result = dfile->saveFile(outputFile.c_str(), ... );
答案 5 :(得分:0)
全C方法:
output_file = malloc(strlen(output_file) + 5);
strcpy(output_file, file_name);
strcat(output_file, ".out");
P.S。完成w / output_file后,你需要free(output_file)
。
答案 6 :(得分:0)
您必须为新字符串分配内存,例如:
char *cNewString = malloc(strlen(file_name)+5); //+5 for the ".out"
然后复制它。
不要忘记在不再使用时删除内存