代码之家  ›  专栏  ›  技术社区  ›  MK.

在linux中重定向cout到文件与直接写入文件

  •  1
  • MK.  · 技术社区  · 15 年前

    系统是否在程序开始时使用了适当的魔法,使这两种情况完全相同,还是后一种情况比前一种情况更好?

    谢谢

    4 回复  |  直到 15 年前
        1
  •  2
  •   Ian Ian    15 年前

    它们基本上是等价的。在这两种情况下,底层流缓冲区最终将调用write()系统调用,以获得相同的效果。

    但是请注意,默认情况下,cout与stdio同步,以实现向后兼容性(因此您可以使用C风格的标准输出以及cout,并使其按预期工作)。这种附加同步可以减慢C++输出。如果这很重要,那么可以使用std::ios_base::sync_和_stdio(false)来取消它们之间的链接。然后,重定向的文件cout和fstream应该具有基本相同的性能和功能。

        2
  •  2
  •   Federico klez Culloca    15 年前

    前者更适合于UNIX工具的发展哲学,即用另一个程序的输出为一个程序提供数据。

    相反,如果你直接写一个文件,你就不能再写了。

    当然,如果您不打算让应用程序执行这类操作,可以直接写入文件。但如果我是你,我会让用户决定。可能需要一个命令行参数。

        3
  •  0
  •   cigarman    15 年前

    我不认为后者必然是“更好”或“更糟”。当您仅从shell重定向cout/stdout时,它所需的代码显然要少得多。它允许简单的文本输出(通过printf/fprintf/cout)。

    我更喜欢使用简单的cout调用来进行快速而肮脏的日志记录和“printf”风格的调试。

    要记录的。例如,在错误情况下,文件无法打开,或者资源耗尽,等等。

    我将printf/fprintf用于其他“简单”日志记录任务。

        4
  •  0
  •   Andy Ross    15 年前

    对如果生成进程已安排文件描述符1(标准输出)是对磁盘文件的open()调用的结果,则子进程对该描述符的I/O是无效的 相当于对手动打开的文件执行相同的I/O操作。对于使用管道或套接字生成的进程也是如此(即,其行为等同于打开自己的管道或套接字)。事实上,内核甚至无法区分两者之间的区别。重要的是文件描述符是如何创建的(即使用什么系统调用,在什么文件系统上),而不是由哪个进程创建的。