在C ++中,istream
有一个名为getline
的方法,它在C风格的字符数组上运行。我知道还有其他独立的getline
函数可以在istream
和std::string
上运行。但为什么单独的方法呢?为什么不把它放在istream
?为什么istream
的getline仅适用于C风格的字符串而不是std::string
?
答案 0 :(得分:2)
我认为 strings 库和 streams 库是分开开发的。我认为这就是我们在 streams 库中不具备通用std::string
支持的原因。尽管已经解决了一些问题,但std::fstream::open
正在使用字符串。
需要注意的一点是,std::istream::getline
比std::getline
更安全,因此在某些情况下应该首选。
问题是std::getline
没有检查将要读取的字符串的长度。这意味着恶意代码(或损坏的数据源)可以通过显示包含很长行的数据来破坏内存。
使用std::istream::getline
,您可以读取的数量有限制。
答案 1 :(得分:1)
我的想法是它是出于性能原因而设计的。您只需分配一个缓冲区块,就可以逐行迭代处理。请注意std::getline
以std::string
为参数,在写入s.erase()
之前调用s
,如果行太长,可能会导致s
分配更多缓冲区