0

C++ で記述されたコマンド ライン アプリケーションで実行される次のコードがあります。

std::string filename = m_arguments[1];
unsigned long long size = stoll(m_arguments[2]);
char character = m_arguments[3].c_str()[1]; 

FILE *pFile;
if( (pFile = fopen(filename.c_str(), "wb")) != NULL)
{
  for(int i = 0; i<size; i++)
  {
    fputc(character, pFile);
    unsigned long long  per = 100*i/size;
    if(per % 10 == 0) { cout<<"\r"<<per<<"%"<<flush; }
  }
  fclose(pFile);
}
cout<<endl;

コマンド ラインでパーセンテージがちらつきます。そのちらつきを軽減しようとしましif(per%10 == 0)たが、何も変わりません。そのちらつきを止めるにはどうすればよいですか?

4

2 に答える 2

3

あなたができる最善のことは、最後のループ以降に変更された場合にのみパーセントを表示することです. これにより、コンソールへの出力量が最小限に抑えられますが、非常に非効率であるため、速度が大幅に低下します。また、ループ変数の型を修正しました。

    std::string filename = m_arguments[1];
    unsigned long long size = stoll(m_arguments[2]);
    char character = m_arguments[3].c_str()[1]; 

    FILE *pFile;
    if( (pFile = fopen(filename.c_str(), "wb")) != NULL)
    {
      int last_per = -1;
      for(unsigned long long i = 0; i<size; i++)
      {
        fputc(character, pFile);
        int  per = (int)(100*i/size);
        if(last_per != per) { cout<<"\r"<<per<<"%"<<flush; last_per = per; }
      }
      fclose(pFile);
    }
    cout<<endl;
于 2013-09-02T08:25:18.123 に答える
0

遊んでいるだけですが、以下を使用します。

int i = 0;
while ( i != 100 ) {
    i += 10;
    std::cout << '\r' << std::setw(2) << i << '%' << std::flush;
    Sleep( 2000 );
}
std::cout << "\rDone" << std::endl;

ちらつきは見られませんでした。

あなたの場合の問題は、唯一のテストがper % 10 == 0. ファイルが大きい場合、各バイトを転送するたびに、各値を膨大な回数出力することになります。ファイルが 100KB (あまり大きくない) の場合、0 から 999 までのすべてのバイトが出力され、次に 10000 から 10999 までのすべてのバイトが出力されます。

これもちらつくことはありませんが、標準の Windows コンソール ウィンドウで行ったいくつかの試行では、ちらつくことが示されています。そして、ちらつきがなかったとしても、物事は非常に遅くなります. ただし、最後の出力を記憶し、変更された場合にのみ出力する必要があります。

int lastOutput = -1;
for ( ... ) {
    //  ...
    if ( per % 10 == 0 ) {
        int toOutput = 100LL * i / size;
        if ( toOutput != lastOutput ) {
            std::cout << '\r' << toOutput << '%' << std::flush;
            lastOutput = toOutput;
        }
    }
}

ただし、これははるかに効率的に行うことができます。出力が 10 個しかない場合は、おそらく出力したい値を示す 10 個のエントリを持つテーブルを作成し、iこれをチェックします。

于 2013-09-02T09:02:12.817 に答える