我想double从binary文件中读取 值并将它们存储在向量中.我的值具有以下形式:73.6634,73.3295,72.6764等.我有这个代码,可以在内存中读取和存储数据.它与char类型完美配合,因为read函数具有chartype(istream& read (char* s, streamsize n))作为输入.当我尝试将char类型转换为doubleI时,显然会得到整数值74,73,73等等.是否有任何功能允许我直接读取双值或任何其他方式?
如果我改为char * memblockto double * memblock和memblock = new char[]to 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;
}
Run Code Online (Sandbox Code Playgroud)
Ide*_*Hat 11
(对不起"喜欢我5岁"的语气,我不知道你知道或不知道多少)
您可能知道,您的计算机并不像您那样考虑数字.
首先,计算机会考虑"基础2"系统中的所有数字.但它并不止于此.您的计算机还将固定大小与所有数字相关联.它创建了数字的固定"宽度".此大小(几乎总是)以字节为单位,或4位数组.这是(非常接近)相当于,当您对数字[1,15,30002]进行数学计算时,您将所有数字视为
[
00000001
00000015
00030002
]
Run Code Online (Sandbox Code Playgroud)
(双打有点怪异,但我会在一秒钟内完成).
让我们假装出于演示目的,上面每2个字符代表一个字节的数据.这意味着,在计算机中,它会考虑这样的数字:
[
00,00,00,01
00,00,00,15
00,03,00,02
]
Run Code Online (Sandbox Code Playgroud)
文件IO都是按照"字节"(字符)大小完成的:它通常不知道它在读什么.您可以自己解决这个问题.将二进制数据写入文件(至少从一个数组中)时,我们只需将其全部转储.所以在上面的例子中,如果我们将它全部写入文件,如下所示:
[00,00,00,01,00,00,00,15,00,03,00,02]
Run Code Online (Sandbox Code Playgroud)
但你必须重新解释它,回到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";
}
Run Code Online (Sandbox Code Playgroud)
这基本上就是说,将那些字节(char)解释为double.
Endianness(再次,LI5)计算机写入数字的顺序.您习惯于从左到右(25,25)写入十五个,但从右到左(52,五十二)编写数字同样有效.我们有big-endian(最低地址的最高有效字节)和little-endian(最高地址的MSB).
这在架构或虚拟机之间从未标准化......但如果他们不同意,您可能会得到奇怪的结果.
不完全符合你的问题,但我必须指出双打是一种特殊情况:虽然阅读和写作看起来相同,但基础数据不仅仅是一个简单的数字.我喜欢将双打视为计算机的"科学记法".双重标准使用底座和电源来获取您的号码.在长度相同的空间中存储(符号)(a ^ x).这给出了一个更大的动态范围的值表示,但是你松散了字节的"人类可读性",并且你获得了相同数值的值,因此你可以放松精度(尽管它的相对精度,就像科学一样)符号,所以你可能无法区分十亿和一十亿和二十,但是1和2是TINY与数字相比).
我们不妨指出一个C++的怪癖:你必须确保在编写数据时,它不会尝试将文件重新格式化为ascii.http://www.cplusplus.com/forum/general/21018/
| 归档时间: |
|
| 查看次数: |
8667 次 |
| 最近记录: |