Странное поведение stdout в C ++ - PullRequest
3 голосов
/ 29 июня 2009

Я хочу, чтобы моя программа отображала мельницу Unix во время обработки. Есть цикл for, и в каждой итерации есть функция printf:

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

q - один из символов на ветряной мельнице (- \ | /) в зависимости от номера итерации.

Проблема в том, что в 100 итерациях кажется, что в отображаемой строке есть только два изменения, и каждая итерация занимает около одной секунды.

Что может быть для этого?

Вот весь цикл с двумя возможными символами для ветряной мельницы:

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();
}

Ответы [ 2 ]

9 голосов
/ 29 июня 2009

Очистить вывод после записи каждой строки:

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

Без этого обычно stdout буферизируется и выводит свои выходные данные только при появлении новой строки или заполнении внутреннего буфера.

2 голосов
/ 29 июня 2009

Выход (консоль) буферизуется. То есть, он выводит вывод на экран только тогда, когда буфер заполнен или записана новая строка. Если вы хотите выводить символы по одному, вам нужно явно вызвать fflush(stdout), чтобы очистить буфер вывода.

...