- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 320Mb 的二进制文件 (data.dat),包含 32e7 行十六进制数:
1312cf60 d9 ff e0 ff 05 00 f0 ff 22 00 2f 00 fe ff 33 00 |........"./...3.|
1312cf70 00 00 00 00 f4 ff 1d 00 3d 00 6d 00 53 00 db ff |........=.m.S...|
1312cf80 b7 ff b0 ff 1e 00 0c 00 67 00 d1 ff be ff f8 ff |........g.......|
1312cf90 0b 00 6b 00 38 00 f3 ff cf ff cb ff e4 ff 4b 00 |..k.8.........K.|
....
原始数字是:
(16,-144)
(-80,-64)
(-80,16)
(16,48)
(96,95)
(111,-32)
(64,-96)
(64,-16)
(31,-48)
(-96,-48)
(-32,79)
(16,48)
(-80,80)
(-48,128)
...
我有一个 matlab 代码,可以将它们读取为实数并将它们转换为复数:
nsamps = (256*1024);
for i = 1:305
nstart = 1 + (i - 1) * nsamps ;
fid = fopen('data.dat');
fseek(fid,4 * nstart ,'bof');
y = fread(fid,[2,nsamps],'short');
fclose(fid);
x = complex(y(1,:),y(2,:));
我正在使用 C++ 并尝试以 vector<complex<float>>
的形式获取数据:
std::ifstream in('data.dat', std::ios_base::in | std::ios_base::binary);
fseek(infile1, 4*nstart, SEEK_SET);
vector<complex<float> > sx;
in.read(reinterpret_cast<char*>(&sx), sizeof(int));
而且使用 C++ 获取复杂数据时非常困惑。谁能帮帮我?
最佳答案
我将尝试使用您代码中的问题作为示例来解释一些要点。
让我们从代码的末尾开始。您尝试读取一个数字,该数字存储为四字节单精度 floating point number , 但你使用 sizeof(int)
作为大小参数。在具有现代编译器的现代 x86 平台上 sizeof(int)
趋于等于 sizeof(float)
, 不能保证。 sizeof(int)
依赖于编译器,所以请使用 sizeof(float)
相反。
在您阅读的 matlab 代码中 2*nsamps
数字,而在 C++ 代码中只读取四个字节(一个数字)。类似于 sizeof(float) * 2 * nsamps
会更接近 matlab 代码。
接下来,std::complex
是一个复杂的类,它(通常)可能具有任何实现定义的内部表示。但幸运的是,here我们读到
For any object
z
of typecomplex<T>
,reinterpret_cast<T(&)[2]>(z)[0]
is the real part ofz
andreinterpret_cast<T(&)[2]>(z)[1]
is the imaginary part ofz
.For any pointer to an element of an array of
complex<T>
namedp
and any valid array indexi
,reinterpret_cast<T*>(p)[2*i]
is the real part of the complex numberp[i]
, andreinterpret_cast<T*>(p)[2*i + 1]
is the imaginary part of the complex numberp[i]
.
所以我们可以投一个std::complex
在那里输入字符并读取二进制数据。但是std::vector
是一个类模板,它也是实现定义的内部表示!这意味着,我们不能只是 reinterpret_cast<char*>(&sx)
并将二进制数据写入指针,因为它指向 vector object 的开头,这不太可能是 vector data 的开头。获取数据开头的现代 C++ 方法是调用 sx.data()
. C++11 之前的方法是获取第一个元素的地址:&sx[0]
.从头开始覆盖对象几乎总是会导致段错误。
好的,现在我们有了数据缓冲区的开始,它能够接收复数的二进制表示。但是当你声明 vector<complex<float> > sx;
,它的大小为零,因为你不是 pushing或 emplacing它是元素, vector 不会“知道”它应该调整大小。再次出现段错误。所以只需调用resize
:
sx.resize(number_of_complex_numbers_to_store);
或使用适当的构造函数:
vector<complex<float> > sx(number_of_complex_numbers_to_store);
在将数据写入 vector 之前。请注意,这些方法使用存储元素数量的“高级”概念进行操作,而不是要存储的字节数。
将它们放在一起,代码的最后两行应该如下所示:
vector<complex<float> > sx(nsamps);
in.read(reinterpret_cast<char*>(sx.data()), 2 * nsamps * sizeof(float));
如果问题仍然存在,请先尝试更简单的沙箱代码。
例如,我们写六个float
s 到一个二进制文件:
std::ofstream ofs("file.dat", std::ios::binary | std::ios::out);
float foo[] = {1,2,3,4,5,6};
ofs.write(reinterpret_cast<char*>(foo), 6*sizeof(float));
ofs.close();
然后将它们读入复数 vector :
std::ifstream ifs("file.dat", std::ios::binary | std::ios::in);
std::vector<std::complex<float>> v(3);
ifs.read(reinterpret_cast<char*>(v.data()), 6*sizeof(float));
ifs.close();
最后,打印它们:
std::cout << v[0] << " " << v[1] << " " << v[2] << std::endl;
程序打印:
(1,2) (3,4) (5,6)
所以这种方法很有效。
这是我最初作为评论发布的关于二进制文件的评论。
二进制文件没有“行”的概念。二进制文件中“行”的数量完全取决于您在其中查看它的窗口的大小。将二进制文件想象成磁带,磁头的每个离散位置只能读取一个字节。这些字节的解释由您决定。
如果一切正常,但您得到奇怪的数字,请检查 fseek
中的位移称呼。多个字节的错误会产生随机值,而不是您希望获得的 float 。
当然,您可能只是读取 float
的 vector (或数组) s,观察上述注意事项,然后在循环中将它们转换为复数。此外,这是调试 fseek
的好方法。打电话确保您从正确的地方开始阅读。
关于c++ - 如何在 C++ 中读取复数的二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40392644/
我遇到以下问题。我想读取一个包含数百万行和数百列的大型 csv。我想向下转换列的数据类型。我的方法是读取 csv,然后使用 pd.to_numeric() 对其进行向下转换。我不知道列数及其类型。在读
目前,我从 SQL server (2008) 数据库获取数据。 cyurrent的方法是使用DataTable,然后将其传递并使用。 if (parameters != null)
我有以下问题。我有一个巨大的 csv 文件,想用多处理加载它。对于一个包含 500000 行和 130 列不同数据类型的示例文件,Pandas 需要 19 秒。我试过 dask 因为我想多处理阅读。但
是否有关于用于序列化各种 MFC 数据结构的二进制格式的明确文档?我已经能够在十六进制编辑器中查看我自己的一些类,并使用 Java 的 ByteBuffer 类读取它们(使用自动字节顺序转换等)。 但
我正在使用 Selenium 进行测试,我们用 HTML 文件编写测试用例,并用它们制作测试套件,我们的要求是编写足够健壮的测试用例,以根据测试环境改变自身。 为此,我不希望在 HTML 脚本本身中包
我需要一个 JavaScript 代码来读取存储为 .txt 文件的字典(或者也可以保存为任何其他类型的文件。它也可以在线获得)并将其内容存储在一个变量中。我不能找到一种让 JavaScript 像
我正在尝试遍历包含 SSH 登录和其他日志的日志文本文件。 程序正在返回 SSH 登录的总数。 我的解决方案确实有效,但似乎有点慢(在 200mo 文件上大约需要 3.5 秒)。我想知道是否有任何方法
我正在将大量数据从一个电子表格复制到工作簿中的其他 160 个电子表格。目前,Excel (2013) 遇到错误,因为它没有足够的资源来完成操作。 我的目标是将工作表 4 中 V13:XI1150 范
我正在尝试读取一个有 1147 行的文本文件。下面的代码仅读取第 1050-1147 行。我的目标是读取整个文件并提取位于不同行的特定值以在脚本中使用。一个示例是包含“BlockList: 2”的行中
我正在为游戏编写解释器。用户将其移动输入解释器,程序执行该移动。 现在我想为每个决定实现一个时间限制。玩家不应该能够思考超过 30 秒来写一个移动并按下回车。 call_with_time_limit
以this file例如,我正在尝试读取 data.frame 中的数据。来自 the doc (pdf 文件,表 1),它遵循一些 fortran 约定。我尝试了以下但收效甚微: dir 0' 将
我正在使用 R 阅读 Outlook 附件。我的引用在这里:Download attachment from an outlook email using R 这是我的电子邮件的截图: 这每天都会发送
我不会从表格中读取行来将主题放在列表中 php脚本 $url_obj='http://'.$host.':8069/xmlrpc/object'; $sock=new xmlrpc_client($u
我有一个这样的 csv 文件: id,name,value 1,peter,5 2,peter\,paul,3 我如何读取此文件并告诉 R "\," 不表示新列,仅表示 ","。 我必须添加该文件
我正在尝试读取 ~/Library/Preferences/com.apple.mail.plist (在 Snow Leopard 上)以获取电子邮件地址和其他信息以进入“关于”对话框。我使用以下代
This question already has answers here: How do I use floating-point division in bash? (19个回答) 5个月前关闭
本练习的目标是读取输入文件并将其存储到表中,然后验证输入中的某些字段并输出任何错误记录。我需要读取并存储每个策略组,以便表中一次仅存储 5 条记录,而不是整个文件。 所以我需要读取一个包含 5 条记录
据我了解,LWT 插入始终以 SERIAL 一致性级别完成。如果为 true,这是否意味着读取作为 LWT 插入的行可以安全地以 ANY 的一致性级别读取? 换句话说,我假设 LWT 插入是完全一致的
我看到很多很多通过java脚本读取cookie的函数,但我只想在变量中使用它一次,我是JS新手。 这是我的代码 var TheNumber = (Math.random() + '') * 10000
我正在使用 asp.net 和 C#。我在服务器上部署了一个应用程序[已发布],现在我想查看该网站的代码,据我所知,我可以阅读程序集来查看代码。 请告诉我如何实现它。 提前致谢。 最佳答案 您可以使用
我是一名优秀的程序员,十分优秀!