- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想从 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 视为计算机的“科学记数法”。双重标准使用基础和权力来获取您的号码。 在与 long 相同的空间中,它存储 (sign)(a^x)。这提供了更大的值表示动态范围,但是您失去了字节的某种“人类可读性”感,并且您获得了相同数量的值,因此您可以降低精度(尽管它的相对精度,就像科学符号,因此您可能无法区分十亿和 1 与十亿和 2,但与数字相比,1 和 2 是 TINY)。
我们不妨指出 C++ 的一个怪癖:您必须确保在写入数据时,它不会尝试将文件重新格式化为 ascii。 http://www.cplusplus.com/forum/general/21018/
关于c++ - 从二进制文件中读取 double 类型的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23066176/
我正在尝试编写一个相当多态的库。我遇到了一种更容易表现出来却很难说出来的情况。它看起来有点像这样: {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE
谁能解释一下这个表达式是如何工作的? type = type || 'any'; 这是否意味着如果类型未定义则使用“任意”? 最佳答案 如果 type 为“falsy”(即 false,或 undef
我有一个界面,在IAnimal.fs中, namespace Kingdom type IAnimal = abstract member Eat : Food -> unit 以及另一个成功
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
在 C# 中,default(Nullable) 之间有区别吗? (或 default(long?) )和 default(long) ? Long只是一个例子,它可以是任何其他struct类型。 最
假设我有一个案例类: case class Foo(num: Int, str: String, bool: Boolean) 现在我还有一个简单的包装器: sealed trait Wrapper[
这个问题在这里已经有了答案: Create C# delegate type with ref parameter at runtime (1 个回答) 关闭 2 年前。 为了即时创建委托(dele
我正在尝试获取图像的 dct。一开始我遇到了错误 The function/feature is not implemented (Odd-size DCT's are not implemented
我正在尝试使用 AFNetworking 的 AFPropertyListRequestOperation,但是当我尝试下载它时,出现错误 预期的内容类型{( “应用程序/x-plist” )}, 得
我在下面收到错误。我知道这段代码的意思,但我不知道界面应该是什么样子: Element implicitly has an 'any' type because index expression is
我尝试将 SignalType 从 ReactiveCocoa 扩展为自定义 ErrorType,代码如下所示 enum MyError: ErrorType { // .. cases }
我无法在任何其他问题中找到答案。假设我有一个抽象父类(super class) Abstract0,它有两个子类 Concrete1 和 Concrete1。我希望能够在 Abstract0 中定义类
我想知道为什么这个索引没有用在 RANGE 类型中,而是用在 INDEX 中: 索引: CREATE INDEX myindex ON orders(order_date); 查询: EXPLAIN
我正在使用 RxJava,现在我尝试通过提供 lambda 来订阅可观察对象: observableProvider.stringForKey(CURRENT_DELETED_ID) .sub
我已经尝试了几乎所有解决问题的方法,其中包括。为 提供类型使用app.use(express.static('public'))还有更多,但我似乎无法为此找到解决方案。 index.js : imp
以下哪个 CSS 选择器更快? input[type="submit"] { /* styles */ } 或 [type="submit"] { /* styles */ } 只是好
我不知道这个设置有什么问题,我在 IDEA 中获得了所有注释(@Controller、@Repository、@Service),它在行号左侧显示 bean,然后转到该 bean。 这是错误: 14-
我听从了建议 registering java function as a callback in C function并且可以使用“简单”类型(例如整数和字符串)进行回调,例如: jstring j
有一些 java 类,加载到 Oracle 数据库(版本 11g)和 pl/sql 函数包装器: create or replace function getDataFromJava( in_uLis
我已经从 David Walsh 的 css 动画回调中获取代码并将其修改为 TypeScript。但是,我收到一个错误,我不知道为什么: interface IBrowserPrefix { [
我是一名优秀的程序员,十分优秀!