带有换行符的 fputs() 就像 C 中的 puts()

fputs() with newline like puts() in C

在 C 中,puts(string); 会将 string 打印到标准输出,然后是换行符。另一方面,fputs(fileptr, string); 会将 string 写入 fileptr 而没有尾随换行符。是否有像 fputs() 这样的附加换行符的函数,或者我应该像我一直使用的那样坚持使用 fprintf(fileptr, "%s\n", string); 吗?

fputs() 对我来说似乎比 fprintf() 更有效,因为它不解析它的输入。我知道我也可以使用

fputs(string, fileptr);
fputc('\n', fileptr);

但我想知道是否有一种方法可以通过一次磁盘写入来做到这一点。

我试图弄清楚 puts() 是如何附加换行符的(因为 printf() 实际上只是 vfprintf(stdout, ...) 的包装器,我认为这同样适用于 puts()fputs()),但奇怪的是我在 glibc 源代码中找不到 puts()

I was wondering if there was a way to do that with one disk write.

你过度优化了。写入磁盘缓冲的,除非你碰巧弄乱了缓冲设置或者你使用了一个非常糟糕的libc实现。一般来说,实现你想要的最好方法是

fputs(string, fileptr);
fputc('\n', fileptr);

放下手。如果您不会关心优化,您相信您的编译器会优化它,您可以使用

fprintf(fileptr, "%s\n", string);

它需要解析格式字符串——即便如此,在内部,使用 fputs 的等价物来编写 %sfputc 来打印换行符。


但是有一个陷阱 - 请注意 FILE 结构通常具有某种线程安全锁定。 fputs + fputc 需要两次获取锁,而 fprintf 可能只需要一次。然而,在单线程应用程序中,不会竞争锁。但可能只是对于复杂的格式和多线程程序,fprintf 解析比单独操作获取锁更快。另一个是来自另一个线程的调用可以交错 fputs/fputc,但是 fprintf 应该是原子的。


P.S。 Glibc 的 puts 代码在 libio/ioputs.c.

没有什么比:

更有效
  1. 确保您的字符串可以多容纳一个字符
  2. \n 分配给字符串
  3. fputs 字符串