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