如何验证已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);