1

对于这个简单的任务,我需要一个快速的解决方案。

我正在修改具有此功能的源代码:

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 变量了吗?

我想修改,所以文件名最后会添加“.out”。

所以,我添加了一个新变量:

字符 * 输出文件;

在调用 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++ 程序员 :(

那么,有人可以帮忙吗?

谢谢。

4

7 回答 7

5

没有为 分配内存output_file。使用 astd::string代替:

std::string s(file_name);
s += ".out";

然后s.c_str()用作函数的第一个参数saveFile()

于 2012-09-25T08:32:55.873 回答
2

很多人建议使用+=附加".out"string,这是正确和有效的,但不是很直观。如果您考虑更自然的表达方式...

std::string x = file_name + ".out";

...您会发现它不起作用,因为编译器添加了一个指向char数组char的指针。数组不能添加到任何东西,所以编译器会运行一个标准转换列表来寻找可能有意义的东西。可悲的是,该数组可以转换为另一个指向-char的指针,并且允许两个指针的数字总和(它们最终毕竟只是数字),但结果是一个不相关的地址(由于位甚至可能换行-size) 甚至可能与您程序的虚拟地址空间不对应,并且可能是随机的。在+编译器的时候没有考虑参数std::strings:在涉及左侧目的地之前评估分配右侧的任何内容。因此,使该工作正常进行的最小直观更改是明确地将参数之一+设为 a std::string

std::string x = std::string(file_name) + ".out";

...或者...

std::string x = file_name + std::string(".out");

作为一个添加很多东西的表达式是从左到右评估的,一旦你有 astd::string作为第一个或第二个参数,你可以添加其他 ASCIIZ/C/ const char*“字符串”,直到奶牛回家。

于 2012-09-25T08:49:30.083 回答
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);
于 2012-09-25T08:36:21.410 回答
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);
于 2012-09-25T08:33:08.147 回答
0

使用std::string并使您的生活更轻松:

std::string outputFile(output_file);
outputFile += ".out";

result = dfile->saveFile(outputFile.c_str(), ... );
于 2012-09-25T08:33:46.330 回答
0

全 C 方法:

output_file = malloc(strlen(output_file) + 5);
strcpy(output_file, file_name);
strcat(output_file, ".out");

PSfree(output_file)完成后您需要使用 output_file。

于 2012-09-25T08:33:58.047 回答
0

您必须为新字符串分配内存,例如:

char *cNewString = malloc(strlen(file_name)+5); //+5 for the ".out"

然后复制过来。

不再使用时不要忘记删除内存

于 2012-09-25T08:34:33.653 回答