【问题标题】:How to make printf function print the output on a file instead of console? [duplicate]如何使 printf 函数在文件而不是控制台上打印输出? [复制]
【发布时间】:2015-10-12 17:30:57
【问题描述】:

我们需要让printf 函数将输出写入文件而不是控制台,而不涉及任何其他函数,例如fprintf 等。

据我了解,解决方案的前半部分是关闭控制台输出文件指针,以便禁止printf 在控制台上写入任何内容。

接下来需要做什么(在 C 而不是 C++ 中)强制printf 在文件上打印输出?

如果这是 C++,函数覆盖会解决这个目的吗?

【问题讨论】:

  • 谷歌搜索得到这个stackoverflow.com/questions/584868/…
  • “如果这是 CPP,函数覆盖会解决这个目的吗?” 不,不是,你需要指定一个不同的函数签名来覆盖(更精确的重载) printf().
  • printf 打印到标准输出,可能是也可能不是控制台。在任何合理的操作系统下,您都可以运行程序并将其输出重定向到文件:program_name > output_file.txt。除此之外,你为什么不能使用fprintf

标签: c file-io


【解决方案1】:

对于 C 代码,您可以使用 freopen 函数将 stdout 与输出文件关联:

if ( freopen( "output.txt", "w", stdout ))
{
  printf( "this should go to the output file\n" );
}
else
{
  // could not associate stdout with the output file
}

【讨论】:

  • freopen("output.txt","a",stdout) 会是更好的选择,因为这不会覆盖文件中的内容(如果有的话)。
【解决方案2】:

先关闭标准输出,然后使用dup2():

int fd = open("filename", O_WRONLY);
....
close(1);
dup2(fd, 1);

来自手册页:

从 dup() 或 dup2() 成功返回后,新旧 文件描述符可以互换使用。他们指的是 相同的打开文件描述(参见 open(2)),从而共享文件 偏移量和文件状态标志;例如,如果文件偏移量 通过对其中一个描述符使用 lseek(2) 进行修改, 另一个的偏移量也发生了变化。

【讨论】:

  • 如果您打开带有O_RDONLY 标志的文件,您将无法在其中写入(打印)任何内容。
  • @mcleod_ideafix 谢谢。固定。
猜你喜欢
  • 2012-10-13
  • 1970-01-01
  • 2019-08-31
  • 2022-01-08
  • 2023-03-14
  • 1970-01-01
  • 2021-06-05
  • 2019-10-13
相关资源
最近更新 更多