fputs()的换行符如C中的puts()

Bil*_*lly 1 c microbenchmark puts

在C中,puts(string);将打印string到stdout,然后是换行符.fputs(fileptr, string);,而另一方面,会写信stringfileptr没有结尾的新行.是否有任何函数fputs()添加换行符,或者我应该fprintf(fileptr, "%s\n", string);像我一直使用的那样坚持?

fputs()似乎比fprintf()对我更有效,因为它没有解析它的输入.我知道我也可以用

fputs(string, fileptr);
fputc('\n', fileptr);
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有办法用一个磁盘写入.

我试图找出如何puts()追加换行符(因为printf()实际上只是一个包装的vfprintf(stdout, ...),我认为同样可能拥有真正的puts()fputs()),但我奇怪找不到puts()在glibc的源.

Ant*_*ala 7

我想知道是否有办法用一个磁盘写入.

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

fputs(string, fileptr);
fputc('\n', fileptr);
Run Code Online (Sandbox Code Playgroud)

把手放下.如果您关心优化,或者您认为编译器会对其进行优化,那么您可以使用

fprintf(fileptr, "%s\n", string);
Run Code Online (Sandbox Code Playgroud)

它需要解析格式字符串 - 即使在内部,也要使用等效的内容fputs来编写%sfputc打印换行符.


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


PS putsGlibc 的代码在libio/ioputs.c.