簡體   English   中英

內存將由空格分隔的浮點文本文件映射到浮點數的向量

[英]memory mapping a text file of floats separated by space to a vector of floating point numbers

我有一個文本文件,其中有數千個由空格分隔的浮點數。我試圖使用內存映射將所有這些數據從文本文件復制到Visual Studio 2010中使用c ++的浮點數向量。以下是代碼我用來讀取文本文件到memory.Code只是讀取隨機數,這是沒有意義的。 任何人都可以幫我修復它並將數據復制到浮點數向量中

#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;
}

這基本上是查看輸入文本的基礎表示,獲取其中的sizeof(float)字節並嘗試將其視為實際的float

在典型的情況下, float將是4個字節,因此給定輸入如1.23456 ,它將需要1.23 ,查看基礎表示(通常為0x31,0x23,0x32,0x33)並將其解釋為float

然后它將需要456 (0x34,0x35,0x36,0x20)並將其解釋為第二個float

顯然,您需要將一個數字的數字轉換為一個浮點數,忽略空格,然后將下一個數字的數字轉換為下一個float

最簡單的方法是將文件作為流打開,然后從文件初始化的istream_iterator初始化vector<float>

std::ifstream in("ReplayTextFile.txt");

std::vector<float> floats { std::istream_iterator<float>(in),
                            std::istream_iterator<float>()};

首先,術語狡辯:你不是將文件中的數據復制到浮點數向量中,而是將數據內存映射到浮點數組中。

其次,當您對內存映射文件時,內存的內容實際上與磁盤上文件的內容相同。 因此,如果一個文件的編號為2.203並且其中沒有其他內容,當你的內存映射它並嘗試將元素0作為浮點數讀取時,你將讀取(假設sizeof(float)==4 )字節(十六進制) 32 2e 32 30 這些將被解釋為浮點數,這不是你想要的。

相反,您需要在某個時刻處理輸入並將字符串表示轉換為表示該數字作為浮點的字節。 您可以通過使用ifstream打開文件然后使用>>運算符讀取浮點數來實現。

但是,如果您希望內存映射文件所帶來的運行時效率,則可能不希望每次運行程序時都解析浮點數。 在這種情況下,您需要首先預處理文件,將其從一系列數字轉換為字符串,而不是包含表示所需浮點數的原始字節。

在我的代碼中,我使用下面的函數將字節寫入使用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]);
}

准備好文件后,您應該能夠存儲映射並從中讀取數據,因為代碼已經存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM