C++ C+中奇怪的stdout行为+;

C++ C+中奇怪的stdout行为+;,c++,printf,stdout,windmill,C++,Printf,Stdout,Windmill,我希望我的程序在处理时显示unix windmill。有一个for循环,在每次迭代中都有一个printf函数: printf("Fetching articles (%c)\r",q); q是风车中的一个字符(-\ |/),取决于迭代次数 问题是——似乎在100次迭代中,显示的行中只有两次更改,每次迭代大约需要1秒才能完成 这有什么用呢 这是整个循环,风车只有两个可能的特性: for (int i=0;i<numb_articles;i++) { memset(file_path,0

我希望我的程序在处理时显示unix windmill。有一个for循环,在每次迭代中都有一个printf函数:

printf("Fetching articles (%c)\r",q);
q是风车中的一个字符(-\ |/),取决于迭代次数

问题是——似乎在100次迭代中,显示的行中只有两次更改,每次迭代大约需要1秒才能完成

这有什么用呢

这是整个循环,风车只有两个可能的特性:

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();
}
for(inti=0;iprint!=无打印){
url=修改url(url,规则->打印输出,规则->打印);
如果(url==“空”)
继续;
}
获取页面(url、文件内容);
if(strcmp(规则->保存.data(),“NULL”)!=0)
如果(!选中保存(规则->保存,文件内容,url))
继续;
至少保存一个=真;
麻木的文章被接受++;
编码列表[i]=获取编码(文件内容);
title=get\u title(文件内容,err\u msg);
如果(标题==“”)
继续;
title_list[i]=strdup(title.data());
文件名=获取文件名(标题);
int count=numb_fn_found(filename_list,i,filename.data());
char*tmp=新字符[10];
如果(计数>0){
sprintf(tmp,(%d)”,计数);
filename.insert((size_t)filename.length(),tmp);
}
filename_list[i]=strdup(filename.data());
charq;
如果(i%2==0)
q=“|”;
否则q='-';
printf(“获取文章(%c)\r”,q);
流输出文件;
sprintf(文件路径,TMP文件,filename.data());
strncat(文件路径“.html”,5);
输出文件。打开(文件路径);

输出文件写入每行后刷新输出:

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

如果不这样做,通常会缓冲标准输出,并且只有在看到换行符或其内部缓冲区填满时才会转储其输出。

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

您可能需要校正有关回车的部分,因为这正是要打印的字符。已修复。我还遗漏了一点,从技术上讲,一个完整的缓冲区在你尝试写入之前是不会被刷新的。。。还有一些其他的原因。谢谢,我只需要这样写:printf(“\r”);printf(“获取文章(%c)”,q);fflush(stdout)@巴特克,啊,这就是让我一直困惑于文本后面的\r:)