为什么std :: istream :: getline不能在std :: string上运行?

时间:2015-06-15 06:43:18

标签: c++ istream

在C ++中,istream有一个名为getline的方法,它在C风格的字符数组上运行。我知道还有其他独立的getline函数可以在istreamstd::string上运行。但为什么单独的方法呢?为什么不把它放在istream?为什么istream的getline仅适用于C风格的字符串而不是std::string

2 个答案:

答案 0 :(得分:2)

我认为 strings 库和 streams 库是分开开发的。我认为这就是我们在 streams 库中不具备通用std::string支持的原因。尽管已经解决了一些问题,但std::fstream::open正在使用字符串

需要注意的一点是,std::istream::getlinestd::getline更安全,因此在某些情况下应该首选。

问题是std::getline没有检查将要读取的字符串的长度。这意味着恶意代码(或损坏的数据源)可以通过显示包含很长行的数据来破坏内存。

使用std::istream::getline,您可以读取的数量有限制。

答案 1 :(得分:1)

我的想法是它是出于性能原因而设计的。您只需分配一个缓冲区块,就可以逐行迭代处理。请注意std::getlinestd::string为参数,在写入s.erase()之前调用s,如果行太长,可能会导致s分配更多缓冲区