二进制文件的大小不一致,双精度 (C/C++)
Inconsistent size of binary file with doubles (C/C++)
我在将双精度数组写入和读取二进制文件时遇到问题。在某些情况下,文件大小大于预期。以下代码:
int main()
{
int i, j, size=13;
FILE *fid = fopen("C:\Group0\Night0\Imanti\test.dat", "w");
double *arr = (double *)malloc(sizeof(double)* size);
for (i = 0; i < size; i++) {
arr[i] = size / (i + 1.0);
printf("%fn", arr[i]);
}
fwrite(arr, sizeof(double), size, fid);
free(arr);
fclose(fid);
printf("nn");
fid = fopen("C:\Group0\Night0\Imanti\test.dat", "r");
arr = (double *)malloc(sizeof(double)* size);
fread(arr, sizeof(double), size, fid);
for (i = 0; i < size; i++) {
printf("%fn", arr[i]);
}
free(arr);
fclose(fid);
return 0;
}
显示了我问题的简单示例。如果我使用例如size = 10
运行它,文件大小为 80 字节,写入和读取时的数字相同。如果我用size = 13
运行它,文件的大小是 105 字节(当它应该是 104 字节时),数字完全不同。带有size = 13
的案例的输出为:
13.000000
6.500000
4.333333
3.250000
2.600000
2.166667
1.857143
1.625000
1.444444
1.300000
1.181818
1.083333
1.000000
13.000000
-6108112916776316800000000000000000000000000000000000000000000000000.000000
-6277438562204192500000000000000000000000000000000000000000000000000.000000
-6277438562204192500000000000000000000000000000000000000000000000000.000000
-6277438562204192500000000000000000000000000000000000000000000000000.000000
-6277438562204192500000000000000000000000000000000000000000000000000.000000
-6277438562204192500000000000000000000000000000000000000000000000000.000000
-6277438562204192500000000000000000000000000000000000000000000000000.000000
-6277438562204192500000000000000000000000000000000000000000000000000.000000
-6277438562204192500000000000000000000000000000000000000000000000000.000000
-6277438562204192500000000000000000000000000000000000000000000000000.000000
-6277438562204192500000000000000000000000000000000000000000000000000.000000
-6277438562204192500000000000000000000000000000000000000000000000000.000000
第一个数字 (13) 或第二个数字 (6.5) 使用额外的字节写入,导致文件变大且读取失败。我知道双重表示会导致精度错误,但据我所知,这与精度无关,因为文件中双精度变量的大小正在发生变化。
我不确定我是否在这里错过了一些非常明显的东西,但它已经让我发疯了。我在 i7 计算机上使用 vs2013。
由于您正在使用二进制数据,因此可能需要为文件操作指定二进制模式:
FILE *fid = fopen("C:\Group0\Night0\Imanti\test.dat", "wb");
fid = fopen("C:\Group0\Night0\Imanti\test.dat", "rb");
相关文章:
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 正在将csv文件读取为双精度矢量
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 如何在C++中的同一函数中使用字符串和双精度
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 检查是否以特定精度给出双精度
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- C 字符串返回字符串的整数/双精度/长整型值
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- 如何使双精度值的 C++ 和 C# 中的结果相同
- 使用浮点数和双精度数的非常小数字的数学
- 使用 Xcode 将双精度存储在数组C++中
- 在 C++ 中将双精度变量写入二进制文件
- 如何从字符串转换为双精度*
- 为什么我的数组双精度函数不起作用?
- 高精度双精度的 Sprintf 格式化问题
- C++ cout 将双精度对齐到精度 2 并正确对齐
- 将指针数组分配给双精度
- C++如何将字符串逐行转换为双精度
- 长双精度C++是IEEE二进制128的实现吗?