fwrite/fread 在 Windows 中效果不佳
fwrite/fread doesn't work well in Windows
我写了一个程序,创建一个结构变量,然后使用函数 fwrite
将它写入文件。返回码是1(我只写了一个结构变量)。当我尝试使用 fread
函数读取文件时,它 returns 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);
有什么想法吗?
您也需要打开文件进行阅读:
fopen(..., "w+")
并且您应该以二进制模式打开它,因此 fwrite
/fread
不会进行任何古怪的字符转换(例如 Windows 的平台特定 line-endings) :
fopen(..., "w+b")
如果您想在 fwrite
之后直接 fread
您必须重置文件指针位置,以便 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);
}
(此示例使用 rewind
将文件指针设置为开头,您可能必须改用 fseek)
提醒一句:为了便携,你不应该将结构直接写入磁盘,而是实际序列化它(即手动将每个字段写入文件,也许以小 header 为前缀),因为 compiler-specific 填充可能(或将)导致问题。
int main()
{
const char *pFIle = "test.txt";
char var[sizeof(struct MyStruct)] = {0};
int ret = 0;
FILE* fp = fopen(pFIle, "w+");
ret = fwrite(&var, sizeof(struct MyStruct), 1, fp);
printf("fwrite ret =%d;\r\n", ret);
fflush(fp);
fseek(fp, 0, SEEK_SET);
ret = fread(&var, sizeof(struct MyStruct), 1, fp);
printf("fread ret =%d;\r\n", ret);
return 0;
}
我有测试,在 windows 上一切正常。如果您还有其他问题,请告诉我。
我写了一个程序,创建一个结构变量,然后使用函数 fwrite
将它写入文件。返回码是1(我只写了一个结构变量)。当我尝试使用 fread
函数读取文件时,它 returns 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);
有什么想法吗?
您也需要打开文件进行阅读:
fopen(..., "w+")
并且您应该以二进制模式打开它,因此 fwrite
/fread
不会进行任何古怪的字符转换(例如 Windows 的平台特定 line-endings) :
fopen(..., "w+b")
如果您想在 fwrite
之后直接 fread
您必须重置文件指针位置,以便 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);
}
(此示例使用 rewind
将文件指针设置为开头,您可能必须改用 fseek)
提醒一句:为了便携,你不应该将结构直接写入磁盘,而是实际序列化它(即手动将每个字段写入文件,也许以小 header 为前缀),因为 compiler-specific 填充可能(或将)导致问题。
int main()
{
const char *pFIle = "test.txt";
char var[sizeof(struct MyStruct)] = {0};
int ret = 0;
FILE* fp = fopen(pFIle, "w+");
ret = fwrite(&var, sizeof(struct MyStruct), 1, fp);
printf("fwrite ret =%d;\r\n", ret);
fflush(fp);
fseek(fp, 0, SEEK_SET);
ret = fread(&var, sizeof(struct MyStruct), 1, fp);
printf("fread ret =%d;\r\n", ret);
return 0;
}
我有测试,在 windows 上一切正常。如果您还有其他问题,请告诉我。