gpt4 book ai didi

c++ - 从二进制文件中读取 double 类型的数据

转载 作者:太空狗 更新时间:2023-10-29 23:36:02 33 4
gpt4 key购买 nike

我想从 binary 文件中读取 double 值并将它们存储在一个 vector 中。我的值具有以下形式:73.6634、73.3295、72.6764 等等。我有这段代码可以在内存中读取和存储数据。它与 char 类型完美配合,因为 read 函数的输入是 char 类型 (istream& read (char* s, streamsize n ))。当我尝试将 char 类型转换为 double 时,我显然得到整数值 74、73、73 等等。是否有任何函数可以让我直接读取 double 值或任何其他方式?

如果我将 char * memblock 更改为 double * memblock 并将 memblock = new char[] 更改为 memblock = new double[ ] ,编译时出现错误,因为 read 函数只能有 char 类型的输入变量...

谢谢,我会感谢你的帮助:)

// reading an entire binary file
#include <iostream>
#include <fstream>
using namespace std;

int main () {
streampos size;
char * memblock;

int i=0;

ifstream file ("example.bin", ios::in|ios::binary|ios::ate);
if (file.is_open())
{
size = file.tellg();

cout << "size=" << size << "\n";

memblock = new char [size];
file.seekg (0, ios::beg);
file.read (memblock, size);
file.close();

cout << "the entire file content is in memory \n";

for(i=0; i<=10; i++)
{
double value = memblock [i];
cout << "value ("<<i<<")=" << value << "\n";
}

};

delete[] memblock;
}
else cout << "Unable to open file";
return 0;
}

最佳答案

(对不起,“我才 5 岁”的语气,我不知道你知道多少或不知道多少)

介绍二进制数据

您可能知道,您的计算机并不像您那样思考数字。

首先,计算机会考虑“以 2 为底”的系统中的所有数字。但它并不止于此。您的计算机还会将固定大小关联到所有数字。它创建数字的固定“宽度”。此大小(几乎总是)以字节或 4 位数字为单位。这(非常接近)相当于,当您对数字 [1,15,30002] 进行数学运算时,您将所有数字视为

[
00000001
00000015
00030002
]

( double 有点奇怪,但我稍后会谈到)。

让我们假设上面的每 2 个字符代表一个数据字节。这意味着,在计算机中,它会像这样考虑数字:

[
00,00,00,01
00,00,00,15
00,03,00,02
]

文件 IO 都是按照“字节”(字符)大小完成的:它通常不知道自己在读取什么。由您自己决定。将二进制数据写入文件(至少从数组)时,我们只是将其全部转储。所以在上面的例子中,如果我们像这样把它全部写入文件:

[00,00,00,01,00,00,00,15,00,03,00,02]

但你必须重新解释它,回到 4 字节的类型。

幸运的是,这在 C++ 中非常容易做到:

size = file.tellg();

cout << "size=" << size << "\n";

memblock = new char [size];
file.seekg (0, ios::beg);
file.read (memblock, size);
file.close();

cout << "the entire file content is in memory \n";
double* double_values = (double*)memblock;//reinterpret as doubles
for(i=0; i<=10; i++)
{
double value = double_values[i];
cout << "value ("<<i<<")=" << value << "\n";
}

这基本上是说,将这些字节 (char) 解释为 double 。

编辑:字节顺序

字节序是(同样是 LI5)计算机写入数字的顺序。您习惯于从左到右书写十五(25、二十五),但从右到左书写数字也同样有效(52、五-二十)。我们有 big-endian(最低地址的最高有效字节)和 little-endian(最高地址的 MSB)。

这在架构或虚拟机之间从未标准化...但如果他们不同意,你会得到奇怪的结果。

一个特例: double

与您的问题不太相符,但我必须指出 double 是一种特殊情况:虽然读写看起来相同,但底层数据不仅仅是一个简单的数字。我喜欢将 double 视为计算机的“科学记数法”。双重标准使用基础和权力来获取您的号码。 在与 long 相同的空间中,它存储 (sign)(a^x)。这提供了更大的值表示动态范围,但是您失去了字节的某种“人类可读性”感,并且您获得了相同数量的值,因此您可以降低精度(尽管它的相对精度,就像科学符号,因此您可能无法区分十亿和 1 与十亿和 2,但与数字相比,1 和 2 是 TINY)。

用C++写数据

我们不妨指出 C++ 的一个怪癖:您必须确保在写入数据时,它不会尝试将文件重新格式化为 ascii。 http://www.cplusplus.com/forum/general/21018/

关于c++ - 从二进制文件中读取 double 类型的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23066176/

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