<streamsize>在 IOStreams 库中使用 ignore(numeric_limits::max()) 是否可以处理任意大量的流?

Does using ignore(numeric_limits<streamsize>::max()) in the IOStreams library handle arbitrarily massive streams?

本文关键字:max 是否 处理 任意大 numeric IOStreams gt streamsize lt ignore limits      更新时间:2023-10-16

在c++标准(第27.6.1.3节)中,对于istreams库中的istream ignore()函数,这意味着如果您为numeric_limits::max()的'n'提供参数,它将继续忽略字符直到找到分隔符为止,甚至远远超出实际流大小的最大值(即'n'参数被解释为无穷大)。

对于gcc实现,这确实看起来是如何ignore()实现了,但我仍然不清楚这是特定于实现的,还是由标准强制要求的。有谁知道的很清楚这是由a保证的吗标准兼容的iostreams库?

标准规定numeric_limits<streamsize>::max()是一个不影响跳过字符数的特殊值。

Effects:作为一个未格式化的输入函数(如27.7.2.3第1段所述)。在构造一个哨兵对象后,提取字符并丢弃它们。字符被提取,直到出现以下任何一种情况:
——如果n != numeric_limits<streamsize>::max()(18.3.2),提取n个字符
——end- file发生在输入序列上(在这种情况下,函数调用setstate(eofbit),这可能会抛出ios_base::failure (27.5.5.4));
——traits::eq_int_type(traits::to_int_type(c), delim)用于下一个可用的输入字符c(在这种情况下,c被提取)。

根据这里:

istream&  istream::ignore ( streamsize n = 1, int delim = EOF );

提取并丢弃字符从输入序列中提取字符并丢弃它们。

当提取并丢弃n个字符时,或当找到字符delim时以先出现的为准。在后一种情况下,也提取delim字符本身。

在您的示例中,当numeric_limits::max()字符数达到时,满足第一个条件。

(每Bo)

但是,根据规范,上述情况仅在n 等于numeric_limits<streamsize>::max()时才适用。