Segfault onstream open()

时间:2013-11-20 15:42:21

标签: segmentation-fault ofstream strcat

我正在编写ASE / RSA加密程序,目前正在使用该接口。我目前要做的是将加密/解密的结果输出到本地文件夹,即“Encrypted / FILE.txt”。当用户选择输入他们想要通过stdin加密的数据时,我想使用用户输入的命令行参数作为文件名。这需要我将文件夹路径与文件名结合起来:

ofstream out("Encrypted/FILE.txt");

我目前正在使用以下代码实现此目的:

char ddest[] = "Decrypted/";
char edest[] = "Encrypted/";
char * decf;
char * encf;
decf = ddest;
encf = edest;
...
if(enc) //If the user wants to encrypt
    out.open(strcat(encf, argv[argc-2])); //resulting in "Encrypted/FILE.txt"
else
    out.open(strcat(decf, argv[argc-2]));

当用户希望将命令行参数输入用作文件名而不是stdin时,我也使用这种将路径与文件名组合的strcat方法。 当我运行我的程序时,它适用于所有情况,除了尝试从STDIN进行ENCODE。经过一些调试后,我将问题缩小到了ofstream open函数。并且它不是strcat的结果,如下面的代码

cout << "a" << endl;
char * path = strcat(encf, argv[argc-2]);
cout << "b" << endl;
out.open("Decrypted/test.txt");
cout << "c" << endl;

产生以下输出

escher@ubuntu:~/AESencrypt$ ./ucrypt -e -s secretstdin.txt key
a
b
Segmentation fault (core dumped)

该方法是程序在Decrypted文件夹中成功创建文件test.txt,当路径是隐式路径时以及在open()中使用strcat函数时。

那么,有人可以就此问题提出建议吗?我的猜测是我的组合路径和文件名的方法很粗糙,导致内存问题。

1 个答案:

答案 0 :(得分:2)

不要在C ++程序中使用strcat。这是一项很多工作,而且容易出错,因为你必须自己做内存管理。

如果您只想连接字符串,请使用:

std::string filename;
filename += "directory/";
filename += basename;

std::ofstream out(filename.c_str());

如果事情变得更复杂,请使用std::ostringstream,您也可以连接整数和其他对象。

在您的特殊情况下,您创建了一个C字符串“Encrypted /”。这个C字符串没有空间来附加内容。无论如何,当你尝试时,你将覆盖任意内存,导致未定义的行为。作业encf = edest不会创建新字符串,只会使encf指向与<{1}}相同的相同字符串。