【问题标题】:Why doesn't std::getline block?为什么 std::getline 不阻塞?
【发布时间】:2012-07-06 02:04:29
【问题描述】:

我在 Objective-C 类中有这段代码(在 Objective-C++ 文件中):

+(NSString *)readString
{
    string res;
    std::getline(cin, res);
    return [NSString stringWithCString:res.c_str() encoding:NSASCIIStringEncoding];
}

当我运行它时,我每次都会得到一个长度为零的字符串。从来没有机会在命令行输入。没有。当我将这段代码逐字复制到main() 中时,它就可以工作了。我在构建设置下打开了 ARC。我不知道发生了什么。 OSX 10.7.4,Xcode 4.3.2。

一个控制台应用程序。

【问题讨论】:

  • 你试过std::cin以防cin被屏蔽了吗?
  • 缓冲区中是否有换行符等待?
  • 表示输入端有输入等待读取。您可以清空输入:cin.ignore(std::numeric_limits<std::streamsize>::max())
  • @Linuxios 输出无关紧要。当您输入数字时,将读取数字的数字,不读取换行符。所以有一个换行符等待阅读。当您使用getline 时,它会读取换行符并立即返回,不允许您输入任何输入,因为它已经找到了行尾。
  • @Hurkyl 不,这是经典的“在数字后读取字符串”问题。

标签: c++ objective-c macos objective-c++ getline


【解决方案1】:

这意味着有输入等待读取输入。您可以清空输入:

cin.ignore(std::numeric_limits<std::streamsize>::max();
std::getline(cin, res);

如果发生这种情况,则意味着您在之前的读取中没有从输入流中读取所有数据。上面的代码会在尝试阅读更多内容之前丢弃任何用户输入。

这可能意味着您将operator&gt;&gt;std::getline() 混合用于读取用户输入。您可能应该选择一种技术并在整个应用程序中使用它 (std::getline()) (您可以混合使用它们,您只需要更加小心并在使用 operator>> 后删除 '\n' 以确保任何后续的 std ::getline() 不会混淆..

如果你想读取一个数字,则读取该行,然后解析该行之外的数字:

std::getline(cin, line);
std::stringstream  linestream(line);

linestream >> value;

【讨论】:

    【解决方案2】:

    你可以这样做:

    cin.ignore();
    

    或使用

    cin.clear();
    cin.sync();
    

    在使用getline()之前

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-21
      • 2012-10-19
      • 1970-01-01
      • 2021-05-19
      • 2012-10-31
      • 2013-05-11
      • 2021-12-09
      相关资源
      最近更新 更多