Printf Fprintf输出顺序

3

我不明白为什么在文件写入后才输出“cout”,这对我来说毫无意义...我应该如何正确处理?我尝试在两者之间加入sleep,但它仍然不能像我想要的那样颠倒顺序。

  cout << "Writing to file";
  fp = fopen("plume_visualisation.txt","w");
  for(int i=0;i<grid;i++)
    for(int j=0;j<grid;j++)
      for(int k=0;k<grid;k++)
    fprintf(fp,"%f\t%f\t%f\t%f\n",x[i],y[j],z[k],suv[i][j][k]);
  fclose(fp);

这被称为缓冲std::cout的输出被缓冲,直到缓冲区被刷新才会写入控制台。但这真的很重要吗?如果std::cout的输出稍晚一些,你会遇到什么问题呢? - Some programmer dude
虽然(如SPD所描述的那样)这很可能是真的,但我很好奇你是如何观察到它的?在这个给定的程序中,这种差异通常甚至不会被注意到。 - Lightness Races in Orbit
1
顺便说一句...如果你在编写C++代码,为什么不同时使用C++流来处理文件呢? - Some programmer dude
可以使用 endl 来刷新缓冲区(但也会产生新行)。 - Hermann
使用<< std::flush来避免这种情况。 - Lightness Races in Orbit
显示剩余3条评论
1个回答

5

C++向输出流写入内容时,会先存储到缓冲区。需要刷新缓冲区才能将其写入控制台。还记得你可能是如何向控制台写入一行代码的吗?

std::cout << "This is a message" << std::endl;

std::endl的作用是在消息末尾放置一个换行符并刷新缓冲区。根据您的代码,我猜想您认为“嘿,我可以省略endl,它不会写入新行。”这种想法很好...但您可能没有意识到endl还会刷新缓冲区。这就是您想要的:

std::cout << "Writing to file" << std::flush;

此外,请注意我在使用“std。”前缀的cout和flush。使用“using namespace standard”是不好的实践,应该避免。
另外,您已经在使用C++了。与其以旧C的方式进行文件IO,而是设置一个文件流。它的工作方式与控制台IO基本相同。这是一个很好的指南,告诉你如何以更符合惯例的方式完成你正在做的事情:http://www.cplusplus.com/doc/tutorial/files/

谢谢!我其实只是在学校和大学学了C语言,所以基本上从来不使用cout而是用printf,虽然它们的功能是一样的。 - Gerard Júlio
1
你已经点赞了,但是“在写入之前需要将缓冲区刷新到屏幕上”这句话有点不太顺口。我建议改成“需要将缓冲区刷新以便将其写入控制台”。 - user4581301

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接