3

処理中にプログラムで UNIX 風車を表示したい。for ループがあり、反復ごとに printf 関数があります。

printf("Fetching articles (%c)\r",q);

q は、反復回数に応じて、風車 (-\|/) 内の文字の 1 つです。

問題は、100回の反復で表示された行に2つの変更しかないように見え、すべての反復が完了するのに約1秒かかることです。

これの原因は何ですか?

風車の 2 つの可能な文字のみを含むループ全体を次に示します。

for (int i=0;i<numb_articles;i++) {
  memset(file_path,0x0,BUFF_SIZE);

  url=article_urls[i];

  if (rules->print!=NO_PRINT) {
    url=modify_url(url,rules->printout,rules->print);
    if (url=="NULL")
      continue;
  }

  get_page(url,file_content);

  if (strcmp(rules->save.data(),"NULL")!=0)
    if (!check_save(rules->save,file_content,url))
      continue;

  at_least_one_saved=true;
  numb_articles_accepted++;

  encoding_list[i]=get_encoding(file_content);

  title=get_title(file_content,err_msg);

  if (title=="")
    continue;

  title_list[i]=strdup(title.data());
  filename=get_filename(title);

  int count=numb_fn_found(filename_list,i,filename.data());
  char *tmp = new char[10];
  if (count>0) {
    sprintf(tmp,"(%d)",count);
    filename.insert((size_t)filename.length(),tmp);
  }

  filename_list[i]=strdup(filename.data());

  char q;
  if (i%2==0)
    q='|';
  else q='-';

  printf("Fetching articles (%c)\r",q);

  ofstream output_file;
  sprintf(file_path,TMP_FILE,filename.data());
  strncat(file_path,".html",5);
  output_file.open(file_path);

  output_file << file_content;

  output_file.close();
}
4

2 に答える 2

9

各行を書き込んだ後、出力をフラッシュします。

printf("Fetching articles (%c)\r",q);
fflush(stdout);

これを行わないと、通常stdoutはバッファリングされ、改行が検出された場合、または内部バッファがいっぱいになった場合にのみ出力がダンプされます。

于 2009-06-28T20:10:14.217 に答える
2

出力 (コンソール) はバッファリングされます。つまり、バッファがいっぱいになるか改行が書き込まれた場合にのみ、画面に出力を書き込みます。fflush(stdout)文字を一度に 1 つずつ出力する場合は、明示的に呼び出して出力バッファーをフラッシュする必要があります。

于 2009-06-28T20:11:35.913 に答える