我正在尝试在我的程序中编写一个函数来加载一个包含 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/