首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对ofstream open()的分段错误

对ofstream open()的分段错误
EN

Stack Overflow用户
提问于 2013-11-20 15:42:21
回答 1查看 3.8K关注 0票数 2

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

代码语言:javascript
复制
ofstream out("Encrypted/FILE.txt");

我目前正在使用以下代码实现这一目标:

代码语言:javascript
复制
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打开函数。这不是strcat的结果,如下代码所示

代码语言:javascript
复制
cout << "a" << endl;
char * path = strcat(encf, argv[argc-2]);
cout << "b" << endl;
out.open("Decrypted/test.txt");
cout << "c" << endl;

结果如下所示

代码语言:javascript
复制
escher@ubuntu:~/AESencrypt$ ./ucrypt -e -s secretstdin.txt key
a
b
Segmentation fault (core dumped)

问题是,程序成功地在解密文件夹中创建了文件test.txt,无论是当路径是隐式的还是在open()中使用strcat函数时。

那么,有谁能就这个问题提出建议呢?我的猜测是,我将路径和文件名组合在一起的方法很粗糙,会导致内存问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-20 15:49:08

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

如果您只想连接字符串,请使用以下命令:

代码语言:javascript
复制
std::string filename;
filename += "directory/";
filename += basename;

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20100320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档