所以,我目前正在编写一个行编辑器作为I / O的学习项目,编写文件等。它是用C ++编写的,我目前正在尝试写出用户选择的文件。我已实现CLI参数,但我目前不知道如何实现指定要写入的文件的程序方式。
char *filename;
if (argc >= 2){
filename = argv[1];
} else{
cout << "file>";
cin >> filename;
cin.ignore();
}
当我使用命令行参数时,这非常有效;但是,每当我没有,只要我启动程序,它就会出现Segmentation Faults。我使用实际文件名的地方在save命令中:
void save(char filename[], int textlen, string file[]){
ofstream out(filename);
out << filestring(textlen, file);
out.close();
}
哪个也很好用。有什么办法可以帮助我吗?正在审核的完整源代码在https://github.com/GBGamer/SLED
上答案 0 :(得分:2)
问题是char* filename
只是指向某些包含字符的内存的指针。它本身没有任何记忆。
当您使用命令行参数时,程序会处理在某处存储该字符串,并获得指向它的指针。当您尝试使用cin >> filename
进行阅读时,实际上并不存储任何存储读取数据的内容。
解决方案:将char* filename
替换为std::string filename
(和#include <string>
)。
然后打开输出文件,需要一个c风格的字符串(空终止char
数组)。 std::string
具有此功能。你会写
std::ofstream out(filename.c_str());
^^^^^
或者,实际上,如果您可以使用具有c ++ 11功能的最新编译器,则甚至不需要使用c_str()
。添加了新的std::ofstream
constructor以接受std::string
。
答案 1 :(得分:0)
当提供命令行参数时,filename
变量指向argv[1]
,它不需要分配内存,但是当进入else
块时,您没有为{分配内存{1}}。它只是一个指针。
使用filename
为malloc
分配一些内存,然后接受用户输入。
filename