【问题标题】:Printf Fprintf outputorderprintf fprintf 输出顺序
【发布时间】:2018-05-17 23:07:07
【问题描述】:

我不明白为什么在写入文件后会输出“cout”,这对我来说毫无意义......我该如何正确地做到这一点?我尝试在两者之间进行睡眠,但它仍然没有像我想要的那样颠倒顺序。

  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 的输出写得比你预期的晚一点,你有什么问题?
  • 虽然(如 SPD 所述)这可能是真的,但我很好奇您是如何观察到的?在这个给定的程序中,这种差异通常甚至不明显。
  • 稍微相关一点...如果您使用 C++ 编程,为什么不也使用 C++ 流来处理文件?
  • 缓冲区可以在 endl 的帮助下被刷新(不过也会产生一个新行)。
  • &lt;&lt; std::flush 避免这种情况

标签: c++ printf output


【解决方案1】:

C++ 写入输出流,存储在缓冲区中。您需要刷新缓冲区以将其写入控制台。还记得你是如何学会在控制台写一行代码的吗?

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

std::endl 所做的是在消息末尾放置一个换行符,然后刷新缓冲区。根据您的代码,我猜您认为“嘿,我可以省略 endl 并且它不会写新行。”这是一种很好的思考方式……但您可能没有意识到 endl 也会刷新缓冲区。这就是你想要的:

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

还要注意我是如何在 cout 和 flush 前面加上“std”的。使用“使用命名空间标准”是您应该避免的不好的做法。


在相关说明中,您已经在使用 C++。代替 fprintf 的旧 C 方式进行文件 IO,而是设置文件流。它的工作方式与控制台 IO 的工作方式几乎相同。以下是关于如何以更惯用的方式做你正在做的事情的一个很好的指南:http://www.cplusplus.com/doc/tutorial/files/

【讨论】:

  • 谢谢!我真的只在学校和大学学过c,所以我基本上从不使用cout,而是printf,虽然它做了同样的事情
  • 您已投票,但“您需要在写入之前将缓冲区刷新到屏幕。”擦错了一点。我建议类似“您需要刷新缓冲区才能将其写入控制台。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-10
  • 2011-06-05
  • 2020-12-02
  • 1970-01-01
  • 2018-06-16
  • 2012-10-27
相关资源
最近更新 更多