2013-07-03 27 views
0

我有了數百萬行的txt文件,每行有3輛彩車,我讀它使用下面的代碼:C++中的流類型,如何從IstringStream讀取?

ifstream file(path) 
float x,y,z; 
while(!file.eof()) 
    file >> x >> y >> z; 

和我的作品完美。

現在我想嘗試使用Boost映射文件做同樣的事情,所以我下面

string filename = "C:\\myfile.txt"; 
file_mapping mapping(filename.c_str(), read_only); 
mapped_region mapped_rgn(mapping, read_only); 
char* const mmaped_data = static_cast<char*>(mapped_rgn.get_address()); 
streamsize const mmap_size = mapped_rgn.get_size(); 

istringstream s; 
s.rdbuf()->pubsetbuf(mmaped_data, mmap_size); 
while(!s.eof()) 
    mystream >> x >> y >> z; 

它編譯沒有任何問題,但不幸的是在X,Y,Z並沒有得到實際的浮點數,但只是垃圾,經過一次迭代後,結束。

我可能做一些可怕的錯誤

我如何使用和分析數據的內存映射文件裏面? 我搜索了整個互聯網,尤其是堆棧溢出,找不到任何例子。

我使用的是Windows 7 64位。

+1

由於您使用升壓已經,爲什麼不把它簡單,使用[mapped_file_source](http://www.boost.org/ doc/libs/release/libs/iostreams/doc/classes/mapped_file.html#mapped_file_source)從boost.iostreams? (同時,'while(!file.eof())'在任何情況下都是錯誤的) – Cubbi

+0

我很興奮,應該如何使用它,以及如何解析使用它的浮點數? – OopsUser

回答

3

升壓剛剛爲此目的而庫:boost.iostreams

#include <iostream> 
#include <boost/iostreams/stream.hpp> 
#include <boost/iostreams/device/mapped_file.hpp> 
namespace io = boost::iostreams; 

int main() 
{ 
    io::stream<io::mapped_file_source> str("test.txt"); 
    // you can read from str like from any stream, str >> x >> y >> z 
    for(float x,y,z; str >> x >> y >> z;) 
     std::cout << "Reading from file: " << x << " " << y << " " << z << '\n'; 
} 
+0

謝謝,奇怪的是,使用瑣碎的ifstream閱讀並不會更快。也許我錯過了一些東西,或者str填充x,y,z的解析非常緩慢...... – OopsUser

+0

@OopsUser這是一個單遍文件,從頭到尾。內存映射幾乎沒有什麼收穫(它會在智能操作系統上節省一個內存到內存的拷貝) – Cubbi