0

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 ループが開始する前の最後の行も、その行の残りの部分と同時に表示されることです。ループが終了した後。なぜ、どのように?

4

3 に答える 3

3

ストリームをフラッシュすることはないため、出力はバッファに入れられます。

cout<<"=";に変更cout<<"="<<std::flush;

于 2013-04-23T04:10:24.293 に答える
3

出力ストリームをフラッシュする必要があります。

cout << "=" << std::flush;
于 2013-04-23T04:10:24.973 に答える