1

如何验证已std::istream::getline()到达分隔符,而不仅仅是最大化输入缓冲区?

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

4

2 回答 2

4

根本不要使用会员getline。以下将始终有效,使用 free 功能:

#include <string>

std::string line;

if (!std::getline(infile, line)) { /* error */ }

// entire line in "line"

(您的实际问题的答案是您必须getline在循环中使用 member- 。但是为什么要麻烦。)

于 2012-10-11T14:30:50.457 回答
0

终止条件std::istream::getline()非常精确:如果函数因为n - 1存储而停止但没有到达换行符,std::ios_base::failbit则设置标志。也就是说,您可以只检查流的状态以确定是否到达了换行符。

也就是说,除非您需要防止数据的恶意来源(例如,Internet 连接会向您发送数据,直到您耗尽内存,所有这些都在一行中),您应该使用以下std::string版本:

std::string line;
std::getline(in, line);
于 2012-10-11T16:13:48.350 回答