我编写了一个程序,创建一个结构变量,然后使用函数将其写入文件中fwrite。返回的代码是1(我只写了一个结构体变量)。当我尝试使用函数读取文件时,fread它返回0并且变量未完全填充。
此问题仅针对 Windows。我在 Linux(Ubuntu 虚拟机)上尝试了相同的代码,效果很好。
结构如下:
struct MyStruct
{
char comment[40];
int nbpts;
float time[4096];
float value[4096];
};
FILE* fp = fopen(fileTrace, "w");
fwrite(&var, sizeof(struct MyStruct), 1, fp);
fread(&var, sizeof(struct MyStruct), 1, fp);
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
您还需要打开文件进行读取:
fopen(..., "w+")
Run Code Online (Sandbox Code Playgroud)
并且您应该以二进制模式打开它,因此fwrite/fread不会执行任何时髦的字符转换(例如 Windows 平台特定的行结尾):
fopen(..., "w+b")
Run Code Online (Sandbox Code Playgroud)
如果你想fread直接在 a 之后,fwrite你必须重置文件指针位置,这样fread从写入数据的位置开始读取。
总结一下:
if ((fp = fopen("var.dat", "w+b")) != NULL) {
fwrite(&var, sizeof(var), 1, fp);
rewind(fp);
memset(&var, 0, sizeof(var)); // reset var
fread(&var, sizeof(var), 1, fp);
// ...
fclose(fp);
}
Run Code Online (Sandbox Code Playgroud)
(此示例用于rewind将文件指针设置为开头,您可能必须使用fseek代替)
需要注意的是:为了可移植,您不应该将结构直接写入磁盘,而应实际序列化它(即手动将每个字段写入文件,可能以一个小标头为前缀),因为编译器特定的填充可能(或将)导致问题。