C++ 中的流类型,如何从 IstringStream 中读取?

Posted

技术标签:

【中文标题】C++ 中的流类型,如何从 IstringStream 中读取?【英文标题】:Stream types in C++, how to read from IstringStream? 【发布时间】:2013-07-03 13:32:50 【问题描述】:

我有一个包含数百万行的 txt 文件,每行有 3 个浮点数,我使用以下代码读取它:

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 没有得到实际的浮点数,而只是垃圾,并且在一次迭代之后,While 结束了。

我可能做错了什么

如何使用和解析内存映射文件中的数据? 我搜索了整个互联网,尤其是堆栈溢出,但找不到任何示例。

我使用的是 Windows 7 64 位。

【问题讨论】:

既然你已经在使用 boost,为什么不让它变得简单,使用 boost.iostreams 中的mapped_file_source 呢? (另外,while(!file.eof()) 在任何情况下都是错误的) 我对 boost 很陌生,我应该如何使用它以及如何使用它解析浮点数? 【参考方案1】:

Boost 有一个专门用于此目的的库: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';

【讨论】:

谢谢,奇怪的是,它并没有比使用微不足道的 ifstream 读取更快。也许我遗漏了一些东西,或者 str 填充 x,y,z 的解析非常慢...... @OopsUser 这是文件的单次传递,从头到尾。内存映射几乎没有什么好处(它会在智能操作系统上节省一个内存到内存的副本)

以上是关于C++ 中的流类型,如何从 IstringStream 中读取?的主要内容,如果未能解决你的问题,请参考以下文章

如何导出从另一个文件导入的流类型定义?

什么是 C++ 中的流?

C++ 介绍(十四)——IO流

小白学习C++ 教程十八C++ 中文件处理

如何从 .NET 中的流中获取 MemoryStream?

如何从 iOS 中的流中接收数据(swift)