将字符写入文件并替换前一个,而不是每次都打开和关闭

时间:2015-12-02 06:52:51

标签: c system-calls

每当我有一个新文件时,我想写一个文件中的字符串。 例如

  #  | String in file
  1  | 10
  2  | 23
  3  | 98

我只想打开和关闭文件一次。 我想写字符串而不附加到文件的末尾。 这是测试write sys-call

的代码
int value = 0;
int filedesc = open("testfile.txt", O_WRONLY, S_IWRITE);
if (filedesc < 0) {
    printf("Failed\n");
    return -1;
}
write(filedesc, "1", 1);
char buffer[4];
sprintf(&buffer[0], "%d",value );
printf("%s", buffer);
write(filedesc, buffer, 1);

testfile.txt上的程序结果是:

11

每次写入时如何保持fileDesc的指针保持为0?或者,如果您有任何其他建议,请告诉我。 谢谢。

1 个答案:

答案 0 :(得分:1)

您可以使用lseek系统调用重新定位与文件描述符关联的偏移量:

lseek(filedesc, 0L, SEEK_SET); // move the offset back to start of file

如果您将其移回并将内容重写到文件中,但请注意

  • 在您close文件描述符之前,文件内容可能无法用于其他进程,但您可以尝试close(dup(filedesc));

  • 您可能需要使用ftruncate系统调用截断文件内容。参数为:int ftruncate(int filedesc, off_t length);

  • 使用open("testfile.txt", O_WRONLY, S_IWRITE);打开文件将不会创建它,因此不使用第三个参数。要创建文件,请使用O_CREAT标记并使文件可读:filedesc = open("testfile.txt", O_CREAT | O_WRONLY, S_IREAD | S_IWRITE);

  • 对于某些int值,4个字符的缓冲区可能太小。您应该使用snprintf来避免缓冲区溢出。 snprintf返回缓冲区中生成的字符数,将其用作write的第三个参数。