C++ 意外挂起时间

标签 c++ for-loop set cout

我正在尝试在我的程序中编写一个函数来加载一个包含 216,555 个单词的巨大文本文件,并将它们作为字符串放入一个集合中。这工作正常,但正如预期的那样,它会在循环文件时挂起几微秒。但是我的循环发生了一些奇怪的事情,它的行为不正常。请花时间阅读,我确信这是有正当理由的,但我不知道要搜索什么。

顺便说一下,代码是这样的:

ifstream dictionary;
dictionary.open("Dictionary.txt");

if(dictionary.fail())
{
    cout<<"Could not find Dictionary.txt. Exiting."<<endl;
    exit(0);
}
int i = 0;
int progress = 216555/50;
cout<<"Loading dictionary..."<<endl;
cout<<"<                                                  >"<<endl;
cout<<"<";
for(string line; getline(dictionary, line);)
{
    usleep(1); //Explanation below (not the hangtime)
    i++;
    if(i%progress == 0)
        cout<<"=";
    words.insert(line);
}

for 循环从文件中获取每个字符串,并将它们插入映射中。 这是一个控制台应用程序,我希望用户看到进度。这并没有太大的延迟,但我还是想这样做。如果您不理解代码,我会尽力解释。

当程序启动时,它首先打印出“Loading Dictionary...”,然后是“<”和“>”,中间用 50 个空格分隔。然后在下一行:“<”后跟一个“=”,它循环通过的每 433 个单词 (216555/50)。这样做的目的是让用户可以看到进度。循环中途所需的输出如下所示:

Loading dictionary...
<                                                  >
<=========================                         

我的问题是: 显示了正确的输出,但不是在预期的时间。它打印出完整的进度条,但只有在它挂起并完成循环之后才会打印出来。这怎么可能?显示了正确数量的“=”,但它们在挂起几微秒后同时弹出。我添加了 usleep(1) 以使挂起时间更长一些,但同样的事情发生了。 if 语句显然有效,否则“=”根本不会显示,但感觉我的程序在整个循环之后堆叠了 cout 调用。

最奇怪的是,最后一个 cout<<"<";在 for 循环开始之前,也与其行的其余部分同时显示;循环结束后。为什么以及如何?

最佳答案

你永远不会刷新流,所以输出只是进入缓冲区。

更改 cout<<"=";cout<<"="<<std::flush;

关于C++ 意外挂起时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16160764/

相关文章:

c++ - 前向声明错误的循环依赖

java - 我想要 Do - While 循环,包括 If Else 语句

windows - 如何使用命令提示符或 Power Shell 为多个文件夹中的多个文件创建符号链接(symbolic link)?

scala - 如何定义不可变的 Set 比较方法将使用的自定义相等操作

c++ - 为什么复制和 move 构造函数一起调用?

c++ - SDL_TTF 和 SDL 2 不能一起工作。给出未处理的异常

c++ - 为什么我插入 std::map 失败?

c++ - if 语句不比较我的字符串 c++ 中的数值

bash - 使用 bash 命令在列中创建编号集

javascript - 查看数组是否有两个对象的两个不同属性具有相同值的最佳方法是什么?