【问题标题】:Segfault on ofstream open()ofstream open() 上的段错误
【发布时间】:2013-11-20 15:42:21
【问题描述】:

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

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]));

当用户希望使用命令行参数输入作为文件名而不是标准输入时,我也使用相同的 strcat 方法将路径与文件名结合起来。 当我运行我的程序时,它适用于所有情况,除了尝试从 STDIN 编码。经过一番调试,我已将问题缩小到 ofstream 打开功能。而且不是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 函数时。

那么,任何人都可以就这个问题提出建议吗?我的猜测是我组合路径和文件名的方法很粗糙,并且会导致内存问题。

【问题讨论】:

    标签: segmentation-fault ofstream strcat


    【解决方案1】:

    不要在 C++ 程序中使用strcat。工作量很大,而且容易出错,因为您必须自己进行内存管理。

    如果你只想连接字符串,使用这个:

    std::string filename;
    filename += "directory/";
    filename += basename;
    
    std::ofstream out(filename.c_str());
    

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

    在您的特殊情况下,您创建了一个 C 字符串“Encrypted/”。这个 C 字符串没有空间来附加一些东西。无论如何,当您尝试时,您将覆盖任意内存,从而导致未定义的行为。赋值encf = edest 不会创建新字符串,它只是使encf 指向与edest 相同的字符串。

    【讨论】:

    • 啊,我想那是我做错了。实施了您的建议,现在可以完美运行。回顾我的实施,我不敢相信我一开始就没有意识到会发生这种情况。我想我假设 strcat 会自己实现 C 风格的 memalloc。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多