Вопрос

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

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

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

Проблема в том, что кажется, что за 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();
}
Это было полезно?

Решение

Очистите выходные данные после написания каждой строки:

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top