3

所以,我目前正在编写一个行编辑器,作为 I/O、编写文件等方面的学习项目。它是用 C++ 编写的,我目前正在尝试写入用户选择的文件。我已经实现了 CLI 参数,但我目前不知道如何在程序中实现指定要写入的文件的方式。

char *filename;
if (argc >= 2){
        filename = argv[1];
} else{
        cout << "file>";
        cin >> filename;
        cin.ignore();
}

当我使用命令行参数时,这非常有效;但是,每当我不这样做时,只要我启动程序,它就会出现分段错误。我使用实际文件名的地方在 save 命令中:

void save(char filename[], int textlen, string file[]){
        ofstream out(filename);
        out << filestring(textlen, file);
        out.close();
}

这也工作得很好。你有什么办法可以帮助我吗?完整的源代码,供审查,在https://github.com/GBGamer/SLED

4

2 回答 2

2

问题是它char* filename只是指向某些包含字符的内存的指针。它本身不拥有任何内存。当您使用命令行参数时,程序会处理将该字符串存储在某处,并且您会得到一个指向它的指针。当您尝试使用读取时cin >> filename,实际上没有任何地方可以存储读取的数据。

解决方案:替换char* filenamestd::string filename(和#include <string>)。

然后要打开输出文件,您需要一个 c 风格的字符串(以空结尾的char数组)。std::string有这个功能。你会写

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

或者,事实上,如果您可以使用具有 c++11 功能的最新编译器,您甚至不需要使用c_str(). 添加了一个新的std::ofstream构造函数来接受一个std::string.

于 2013-07-06T08:24:26.533 回答
-1

您的filename变量指向argv[1]何时提供命令行参数,它不需要分配内存,但是当进入else块时,您没有为filename. 它只是一个指针。

用于malloc分配filename一些内存,然后接受用户输入。

filename = (char *)malloc(sizeof(char)*(FILE_NAME_LENGTH+1))
于 2013-07-06T08:28:21.607 回答