在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()
。
答案 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.输入字符串