C++: cin >> *char

3

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

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

当我使用命令行参数时,这个程序运行得非常好; 然而,每当我不使用命令行参数时,一旦我启动该程序,它就会发生分段错误。 我使用实际文件名的地方是在保存命令中:

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

这也完美地运作。你能帮我吗?完整的源代码供审核,可在https://github.com/GBGamer/SLED上找到。


1
使用std::string并阅读此文(自我推广)。 - BoBTFish
问题在于 ofstream,如果我没记错的话,不能使用字符串作为输入。你有没有任何可以使用字符串的替代方案? - ubsan
1
字符串有一个转换函数c_str(),它返回类型为const char *。 - suspectus
2个回答

2
问题在于char* filename只是一个指向包含字符的某些内存的指针。它本身不拥有任何内存。 当您使用命令行参数时,程序会处理将该字符串存储在某个地方,并且您会得到一个指向它的指针。当您尝试使用cin >> filename读取时,实际上没有任何地方可以存储读取的数据。
解决方案:将char* filename替换为std::string filename(并添加#include <string>)。
然后,要打开输出文件,您需要一个C风格的字符串(以null结尾的char数组)。std::string有一个用于此的函数。您可以编写:
std::ofstream out(filename.c_str());
                           ^^^^^

事实上,如果您可以使用带有c++11特性的最新编译器,甚至不需要使用c_str()。一个新的std::ofstream构造函数已经添加了接受std::string的参数。


但是使用ofstream呢?有没有允许字符串的替代方法?编辑:没事了,看到suspectus了。 - ubsan

-1
你的filename变量指向argv[1]当命令行参数被提供时,它不需要分配内存,但是当进入else块时,你没有为filename分配内存。它只是一个指针。
使用mallocfilename分配一些内存,然后获取用户输入。
filename = (char *)malloc(sizeof(char)*(FILE_NAME_LENGTH+1))

1
哇,哇,哇!认真的吗?你认为对于刚开始学习处理输入的人来说,手动内存管理和malloc是最好的解决方案? - BoBTFish
1
我认为在使用std命名空间的函数之前,有人会学习C语言。在使用std :: string等东西之前,我学习了malloc。如果有人遇到分段错误,如果需要说明原因,就无法避免对内存的解释。而且,仅仅将一些指针变量分配给内存并不是手动内存管理中的巨大工程。 - Shashwat Kumar
这有点像说在学习使用std::string之前应该先学会如何编写它。虽然我同意应该尽早了解new/delete/RAII,但它们与处理用户交互的最佳方式是相当独立的。而你的回答(不要把这个人身攻击,我的意思是任何一个足够简短可以成为SO答案的东西)远远没有足够详细的内容来解决这些问题,只会引起混淆。 - BoBTFish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接