【问题标题】:Strange stdout behavior in C++C++ 中奇怪的标准输出行为
【发布时间】:2009-06-28 20:06:54
【问题描述】:

我希望我的程序在处理时显示 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();
}

【问题讨论】:

    标签: c++ printf stdout windmill


    【解决方案1】:

    写完每一行后刷新输出:

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

    如果不这样做,通常stdout 会被缓冲,并且仅在看到换行符或其内部缓冲区已满时才转储其输出。

    【讨论】:

    • 谢谢,那行得通,我只需要这样写:printf("\r"); printf("获取文章 (%c)",q); fflush(stdout);
    • @Bartek,啊,这让我一直对文本后面的 \r 感到困惑 :)
    【解决方案2】:

    输出(控制台)被缓冲。也就是说,它仅在缓冲区已满或写入换行符时才将输出写入屏幕。如果要一次输出一个字符,则需要显式调用fflush(stdout) 来刷新输出缓冲区。

    【讨论】:

    • 您可能需要修改有关回车的部分,因为这正是要打印的字符。
    • 已修复。我还遗漏了从技术上讲,一个完整的缓冲区在您尝试写入之前不会刷新……以及其他一些其他原因。
    猜你喜欢
    • 1970-01-01
    • 2012-02-05
    • 2014-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多