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

时间:2018-07-11 03:41:39

标签: c microbenchmark puts

在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()

2 个答案:

答案 0 :(得分:7)

  

我想知道是否有一种方法可以一次写入磁盘。

您正在过度优化。对磁盘 的写操作是缓冲的,除非您碰巧弄乱了缓冲设置,或者您使用的是非常糟糕的libc实现。通常,实现所需目标的最佳方法是

select regexp_replace("foobarbarfoo","bar(?=bar)","<NA>");

WARNINGS: Could not compile regexp pattern: bar(?=bar)
Error: invalid perl operator: (?=

放下手。如果您不会关心优化,则您认为编译器会对其进行优化,则可以使用

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

它需要解析格式字符串-即使在内部,也要使用等效的fprintf(fileptr, "%s\n", string); 来编写fputs%s来打印换行符。


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


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

答案 1 :(得分:1)

最有效的方法莫过于: 1.确保您的字符串可以再容纳一个字符 2.为字符串分配“ \ n” 3.输入字符串