对于C ++ / linux程序,如何写入cout(当程序启动时cout被重定向到文件时)与直接写入目标文件相比如何? (通过说fstream)
系统是否在程序开始时做了相应的魔术,以使这两种情况完全相同,或者后者是否比第一种更好?
谢谢!
答案 0 :(得分:2)
它们基本相同。在这两种情况下,基础流缓冲区最终都会调用write()系统调用,效果相同。
但请注意,默认情况下,cout与stdio同步,以实现向后兼容性(因此您可以使用C风格的标准输出以及cout,并使其按预期工作)。这种额外的同步会降低C ++输出的速度。如果这很重要,那么您可以使用std :: ios_base :: sync_with_stdio(false)取消链接。然后,文件重定向的cout和fstream应该具有基本相同的性能和功能。
答案 1 :(得分:2)
前者更适合UNIX工具的哲学,即用另一个工具的输出来提供程序。
假设您的程序打印数字,您需要对它们进行排序。您使用命令的输出提供排序工具,然后将结果写入文件,始终使用输出重定向。
相反,如果您直接写入文件,则不能这样做。
当然,如果您没有计划应用程序来执行此类操作,则可以直接写入文件。但如果我在你身边,我会让用户决定。也许使用命令行参数。
答案 2 :(得分:0)
我不认为后者有必要“更好”或“更糟”。当您只是从shell重定向cout / stdout时,它肯定需要更少的代码。它允许简单的文本输出(通过printf / fprintf / cout)。
我更喜欢使用简单的cout调用来进行快速和脏的日志记录以及“printf”样式的调试。
根据我的经验,我使用syslog来记录绝对 的内容。例如,文件无法打开或资源耗尽或其他情况的错误情况。
我将printf / fprintf用于其他“简单”日志记录任务。
几年前,我开发了一个简单的调试系统,现在我只需插入新的Linux应用程序。然后我可以在该代码中调用适当的函数。它与syslog类似,因为它具有调试“级别”。例如,级别1始终写入stdout,级别2写入stderr,级别4写入syslog,级别5可能创建新文件并向其写入消息等。
答案 3 :(得分:0)
是。如果产生进程已经安排文件描述符1(标准输出)是磁盘文件上的open()调用的结果,那么从子进程到该描述符的I / O 完全等效于对手动打开的文件执行的I / O操作相同。对于使用管道或套接字生成的进程(即打开自己的管道或套接字的等效行为)也是如此。事实上,内核甚至无法区分它们。重要的是如何创建文件描述符(即使用什么系统调用,以及在什么文件系统上),而不是使用哪个进程。