gpt4 book ai didi

c - fwrite 追加,即使文件位置指针位于正确的位置

转载 作者:行者123 更新时间:2023-11-30 20:48:22 24 4
gpt4 key购买 nike

我想覆盖二进制文件中的结构。这是我的代码:

struct my_st {
char value[10];
};

void replace(char value[10]){
FILE *fpointer;
fpointer = fopen("data.dat", "rb+");
struct my_st x;
struct my_st new;
new.value="test";
while(1) {
fread(&x,sizeof(x),1,fpointer);
if(strcmp(x.value,value)==0)
break;
}
fwrite(&new,sizeof(x),1,fpointer);
}

我什至通过在 fwrite 之前打印它的值来检查文件位置指针的位置,它是正确的,但它只是在文件末尾附加新数据并且不替换。

有什么建议吗?

最佳答案

如果您打开一个文件进行更新(+)并且执行一次或多次读取操作,则必须在执行此操作之前执行一次定位操作(例如fseek())你做任何写操作。如果执行一个或多个写入操作,则必须在执行任何读取之前执行定位操作(例如 rewind())。请参阅 POSIX 的规范 fopen()例如。

When a file is opened with update mode ('+' as the second or third character in the mode argument), both input and output may be performed on the associated stream. However, the application shall ensure that output is not directly followed by input without an intervening call to fflush() or to a file positioning function (fseek(), fsetpos(), or rewind()), and input is not directly followed by output without an intervening call to a file positioning function, unless the input operation encounters end-of-file.

您在读取和写入之间没有执行任何定位操作。这本身就会导致未定义的行为。

假设您的实现通过不竭尽全力地表现出“未定义的行为”,那么在最后一个 fread() 之后,您将覆盖下一个条目 - 或者附加一个新条目,如果最后一次读取位于文件末尾。

  • 决定要将数据写入的位置。
  • 寻找正确的位置(如果您不想移动读/写指针,请使用fseek(fp, 0L, SEEK_CUR))。
  • 写。
  • 如果您接下来要阅读,请再进行一次搜索 - 如果需要的话,再进行一次无操作。

关于c - fwrite 追加,即使文件位置指针位于正确的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41668455/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com