在 fseek 开始后重读文件?

问题描述

我有这个测试程序:

#include "stdio.h"
int main()
{
   FILE* read;
   FILE* write;

   write = fopen("file.txt","w");

   fwrite("Hallo",1,6,write);
   fflush(write);

   read = fopen("file.txt","r");
   //--------------------------------------
   // setbuf(read,NULL); // read unbuffered
   //--------------------------------------
   char buf[6];
   fread(buf,read);
   printf("Should be -Hallo-: %s\n",buf);

   fseek(write,SEEK_SET);
   fwrite("Welt",4,write);
   fflush(write);

   fseek(read,SEEK_SET);    
   fread(buf,read);
   printf("Should be -Welto-: %s\n",buf);

   fclose(read);
   fclose(write);
}

https://godbolt.org/z/Ysn4cs

它将“Hallo”写入文件,然后读取“Hallo”。然后我们寻找开头并用“Welt”覆盖文件。这应该导致下一次阅读(也寻求开头)阅读“Welto”,“o”是“Hallo”的剩余部分。

代码适用于 Linux 和 Windows,但不适用于 VxWorks(第二个 fread() 再次给出“Hallo”)。它适用于所有 3 个操作系统,当我

  • 将读取设置为无缓冲(见评论
  • 在第二个 fread() 之前重新打开读取。

我阅读了有关 fseek() 的文档,我认为这不是错误,而是真正未定义的行为。没有定义操作系统是否必须重新读取文件或是否可以保留缓冲区。

我的母语不是英语(也许我误解了一些东西)所以我问你这是否属实。
另外,以上两个有没有其他解决方案?我想保持缓冲阅读,不想重新打开的开销。是否有重置缓冲区一次的功能

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)