gpt4 book ai didi

c++ - 内存将由空格分隔的 float 文本文件映射到 float vector

转载 作者:行者123 更新时间:2023-11-30 02:46:01 25 4
gpt4 key购买 nike

我有一个文本文件,其中包含数千个由空格分隔的 float 。我试图使用内存映射将所有这些数据从文本文件复制到使用 C++ 的 Visual Studio 2010 中的 float vector 。以下是我为将文本文件读取到内存而编写的代码。代码只是读取没有意义的随机数。任何人都可以帮助我修复它并将数据复制到一个浮点 vector

#include<boost\iostreams\device\mapped_file.hpp>
#include<iostream>
int main()
{
boost::iostreams::mapped_file_source file;
int numberofElements = 1000000;
int numberofBytes = numberofElements*sizeof(float);
file.open("ReplayTextFile.txt",numberofBytes);

if(file.is_open())
{
float* data = (float*)file.data();
for(int i = 0;i <numberofElements;i++)
std::cout<<data[i]<<", ";

file.close();
} else
{
std::cout<<std::cout<<" couldnt map the file"<<std::endl;
}
system("pause");
return 0;
}

最佳答案

首先,术语问题:您不是将文件中的数据复制到浮点 vector 中,而是将数据内存映射到 float 组中。

其次,当您对文件进行内存映射时,内存中的内容实际上与磁盘上文件的内容相同。因此,如果一个文件的编号为 2.203 而其中没有其他内容,当您对其进行内存映射并尝试将元素 0 读取为 float 时,您将读取(假设 sizeof(float) ==4) 字节(十六进制)32 2e 32 30。这些将被解释为 float ,不是您想要的。

相反,您需要在某个时候处理输入并将字符串表示形式转换为将该数字表示为 float 的字节。为此,您可以使用 ifstream 打开文件,然后使用 >>> 运算符读入 float 。

但是,如果您想要内存映射文件带来的运行时效率,您可能不希望每次运行程序时都解析 float 。在这种情况下,您需要先预处理文件,将其从一系列数字转换为字符串,而不是包含代表您想要的 float 的原始字节。

在我的代码中,我使用下面的函数将字节写出到使用 ios_base::binary 打开的 ostream

void writeFloat(std::ostream &out, float f) {
char *pt = reinterpret_cast<char*>(&f);
out.put(pt[0]);
out.put(pt[1]);
out.put(pt[2]);
out.put(pt[3]);
}

准备好文件后,您应该能够像您的代码一样内存映射并从中读取数据。

关于c++ - 内存将由空格分隔的 float 文本文件映射到 float vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23943300/

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