gpt4 book ai didi

c++ - 将 std::istream::sentry 与 std::istream 一起使用

转载 作者:搜寻专家 更新时间:2023-10-31 01:38:19 27 4
gpt4 key购买 nike

考虑以下简单程序,它将输入拆分为空白并每行打印出一个非空白标记:

#include <iostream>
int main(int argc, char* argv[])
{
while (std::cin)
{
std::string s;
std::cin >> s;
std::cout << "-" << s << "-\n";
}
return 0;
}

这工作正常 - 除了因为输入流仅指示 EOF after 我们试图从它读取,当它到达输入流的末尾时(^D) 它读入并发出一个空字符串:

[begin]
< a b c
> -a-
> -b-
> -c-
< (^D)
> --
[end]

我们可以通过使输出行以 !s.empty() 为条件来解决这个问题。

但是还有另一种选择。我们可以替换这一行:

while (std::cin)

与:

while (std::istream::sentry(std::cin))

哨兵对象(通常由 operator>> 内部使用) 具有消耗空白和然后检查 EOF 或其他流状态的效果:

[begin]
< a b c
> -a-
> -b-
> -c-
< (^D)
[end]

我的问题有三个:

  • 是否有任何原因导致此构造无法按预期工作?
  • 它已经是地道的了吗?
  • 如果不是,为什么不呢?

最佳答案

std::istream::sentry用于 inside 输入函数。正确解决问题的方法是始终检查流是否良好,即,读取后读取成功:

for (std::string s; std::cin >> s; ) {
std::cout << '-' << s << "-\n";
}

流无法提前知道读取操作是否会成功。完成后,它就知道了。

使用 sentry 的方法通常适用于字符串,但对于需要任何格式的类型可能会失败。例如,如果您需要读取 int使用 sentry 跳过空格不表示是否 int可以阅读。即使有 std::string s 该方法可能会失败:流可以在第一次访问时提供字符,但在第二次访问时失败。第一次访问是确定字符不是 sentry 中的空格s 构造函数后跟字符串读取失败。

关于c++ - 将 std::istream::sentry 与 std::istream 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33015411/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com