写一个新行到文件

时间:2013-03-14 04:16:09

标签: c file file-io newline file-descriptor

我目前正在使用以下命令写入我的程序的输出文件。我想把存储在2D数组中的字符串写入我设置的输出文件,即“url_storage.txt”。

以下示例显示了我如何在程序开头附近设置文件(即初始文件描述符声明并调用open(...))并显示写入(...)的主要调用,它发生在while循环中(从2D数组中的每个槽写入,或字符串/字符数组的集合)。我的问题是我想在每个字符串后面插入一个NEWLINE字符,但是,以下代码不会在单独的行上生成每个字符串(或每次写入的结果)的文件。是否有任何简单的方法让write函数能够识别我希望它遵守换行符?我还发现有一个函数lseek(...)会调整我的文件位置指针(看起来它对新行调整并不是很有用)。关于如何指向下一行的任何建议?

int fd2 = open("/directory/path/to/target/output/file/url_storage.txt", O_WRONLY, O_CREAT, 00777);

...
while(...){
      ...
      (void) write(fd2, (" %s \n", matches[ind]), strlen(matches[ind]));
}

1 个答案:

答案 0 :(得分:4)

此:

write(fd2, (" %s \n", matches[ind]), strlen(matches[ind]));

不符合您的想法。您将printf()write()混淆了。 '格式字符串'" %s \n"是逗号表达式的第一部分,实际上被丢弃了。单独的字符串将写入文件。您必须单独编写换行符:

if (write(fd2, " ", 1) != 1 ||
    write(fd2, matches[ind], strlen(matches[ind])) != strlen(matches[ind]) ||
    write(fd2, " \n", 2) != 2)
    ...something went wrong...

或者考虑使用类似于fprintf()的POSIX dprintf(),但写入文件描述符而不是文件流。

if (dprintf(fd2, " %s \n", matches[ind]) != strlen(matches[ind])+3)
    ...something went wrong...

我试图遵循你的意图,在字符串之前和之后添加一个空格,但是它是我的代码,至少会省略尾随空格(在新行之前几乎不需要空格)任何情况 - 除了标记电子邮件签名开始的--之后。前面的空格可能需要将字符串与之前的空格分开。但是,我可能会写:

if (dprintf(fd2, "%s\n", matches[ind]) != strlen(matches[ind])+1)
    ...something went wrong...

或具有单独write()来电的等效内容。


顺便说一下,你写了相当于:

 const char path[] = "/directory/path/to/target/output/file/url_storage.txt";
 int fd2 = open(path, O_WRONLY, O_CREAT, 00777);

由于复杂的历史原因,open()的原型是int open(const char *path, int flag, ...);,但只有2或3个参数是有效的,你已经使用过4.你应该写的:

 int fd2 = open(path, O_WRONLY|O_CREAT, 0777);

但编译器无法轻易诊断错误;毕竟,原型说“任意数量的论点”。此外,除非您正在编写shell脚本,否则该文件不应该是可执行的(所以0666而不是0777),并且我愿意认为它也不应该是可公开写的,所以0664甚至0644会更好,尽管有umask值。顺便说一句,使用像path这样的变量而不是文字的一个好处是,如果您不必重复字符串文字,则使用文件名更容易报告有意义的错误消息。