带有换行符的 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
的等价物来编写 %s
和 fputc
来打印换行符。
但是有一个陷阱 - 请注意 FILE
结构通常具有某种线程安全锁定。 fputs
+ fputc
需要两次获取锁,而 fprintf
可能只需要一次。然而,在单线程应用程序中,不会竞争锁。但可能只是对于复杂的格式和多线程程序,fprintf
解析比单独操作获取锁更快。另一个是来自另一个线程的调用可以交错 fputs
/fputc
,但是 fprintf
应该是原子的。
P.S。 Glibc 的 puts
代码在 libio/ioputs.c
.
没有什么比:
更有效
- 确保您的字符串可以多容纳一个字符
- 将
\n
分配给字符串
fputs
字符串
在 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
的等价物来编写 %s
和 fputc
来打印换行符。
但是有一个陷阱 - 请注意 FILE
结构通常具有某种线程安全锁定。 fputs
+ fputc
需要两次获取锁,而 fprintf
可能只需要一次。然而,在单线程应用程序中,不会竞争锁。但可能只是对于复杂的格式和多线程程序,fprintf
解析比单独操作获取锁更快。另一个是来自另一个线程的调用可以交错 fputs
/fputc
,但是 fprintf
应该是原子的。
P.S。 Glibc 的 puts
代码在 libio/ioputs.c
.
没有什么比:
更有效- 确保您的字符串可以多容纳一个字符
- 将
\n
分配给字符串 fputs
字符串