将字符写入文件并替换之前的字符,而无需每次打开和关闭

Write characters to file and replace the previous one without opening and closing everytime

每当我有一个新字符串时,我都想在文件中写入并替换一个字符串。 例如

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

我只想打开和关闭文件一次。 我想在不附加到文件末尾的情况下编写字符串。 这是用于测试写系统调用的代码

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?或者,如果您对此有任何其他建议,请告诉我。 谢谢。

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

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

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

  • 根据 OS,在您 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);

  • 4 个字符的缓冲区对于某些 int 值来说可能太小了。您应该使用 snprintf 以避免缓冲区溢出。 snprintf returns 缓冲区中产生的字符数,将其用作 write.

  • 的第三个参数