如何验证已std::istream::getline()
到达分隔符,而不仅仅是最大化输入缓冲区?
我意识到我可以用它gcount()
来确定是否读取了比缓冲区少的字节,但是如果要读取的行与缓冲区一样长怎么办?到达\n
与未到达看起来完全一样\n
。
根本不要使用会员getline
。以下将始终有效,使用 free 功能:
#include <string>
std::string line;
if (!std::getline(infile, line)) { /* error */ }
// entire line in "line"
(您的实际问题的答案是您必须getline
在循环中使用 member- 。但是为什么要麻烦。)
终止条件std::istream::getline()
非常精确:如果函数因为n - 1
存储而停止但没有到达换行符,std::ios_base::failbit
则设置标志。也就是说,您可以只检查流的状态以确定是否到达了换行符。
也就是说,除非您需要防止数据的恶意来源(例如,Internet 连接会向您发送数据,直到您耗尽内存,所有这些都在一行中),您应该使用以下std::string
版本:
std::string line;
std::getline(in, line);