C ++:getline()读了整行吗?

时间:2012-10-11 14:28:54

标签: c++ io readline istream

如何验证std::istream::getline()是否到达分隔符,而不是仅仅输出缓冲区?

我意识到我可以使用gcount()来确定是否读取了比缓冲区保持的字节数更少的字节,但是如果要读取的行与缓冲区一样长,怎么办?到达\n看起来与未达到\n完全相同。

2 个答案:

答案 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);