2009-12-09 62 views
2

经过大量搜索解决方案后,我决定实际寻求一些帮助!将Fstream的一部分复制到Istringstream中

我有一个由多个块组成的文件,其中每个块都可能被压缩,也可能不被压缩。在每个块之前显示块的大小以及块是否被压缩。每个块内有一个标识块的字符串。给定一个块名称,我想从文件中获取相关的块。

我的第一个想法是读取压缩标志和块的大小,只将块读入istringstream,如果需要解压缩istringstream,然后搜索块名称。我可以读取压缩标志和块的大小,但是我不知道如何将文件数据块读入istringstream。我看到人们将整个文件读入istringstream,但我不想这样做,因为每个块可能需要或可能不需要解压缩。

任何想法或链接到我错过的解决方案?还是有更好的算法?感谢您的任何意见。

+0

这是一个重复关闭:http://stackoverflow.com/questions/132358/how-to-read-file-content-into-istringstream/138645 – 2009-12-09 20:46:53

+0

不,他特别要求只部分读取文件。 – Potatoswatter 2009-12-23 08:02:47

回答

0

未经检验的,但这样的事情应该工作:

// open file, and seek to the appropriate position 
// read 'length', the size of your chunk in bytes 
std::vector<char> buffer(length); 
file.read(&buffer[0],length); 
file.close(); 
// decompress or manipulate the buffer as needed 
std::istringstream iss; 
iss.rdbuf()->pubsetbuf(&buffer[0],length); // here's the magic 
2

为什么需要将数据读入内存流;为什么不把它读入数组或std::vector

+0

如果你的解压缩例程使用C风格的字符串,并且你知道前面的缓冲区大小,那么你应该只是读入一个字符数组。 – mrkj 2009-12-23 17:09:38

0

我喜欢一个流,因为我的解压缩例程使用C风格的字符串。

但是,我应该能够将std :: vector转换为压缩/解压缩例程所需的东西,所以一旦我读取部分工作,我会研究它。

一个单独的组件将所有这些从块中拉出有用的数据。我实际上并没有仔细研究istringstream的读法,因此取决于如何去决定可能决定我希望从istringstream的std :: vector过程中进行处理。

感谢你们俩。看起来我必须解释Bjarne关于pubsetbuf的说法:)。

+0

您可以施放std :: vector v;到一个C风格的字符串就好:&v [0]和size v.size()。请注意,它们不会缩小。 – piotr 2009-12-23 09:09:12

0

使用迭代器。

my_fstream >> compressed_size; 
stringstream compressed_data; 
istream_iterator<char> file_fetch_iter(my_fstream); 
ostream_iterator<char> buffer_put_iter(compressed_data); 

for (size_t i = 0; i < compressed_size; ++ i) { 
    * buffer_put_iter ++ = * file_fetch_iter ++; 
} 

legacy_decompressor(compressed_data); 
0

流,顾名思义是用于流式文本或二进制处理。您对读取块感兴趣,因此将数据导入字符串流对我来说没有多大意义。

一个优雅的方法是实现自己的流,使用std :: streambuf等作为基础。然后你将在输入处读取和缓冲块,处理压缩与否,并在输出处有一个数据流,在这里你可以用普通的操作符正确地读取数据到字符串,整数等。

否则你是使用流读取方法卡住,就像系统调用将数据读入缓冲区一样。在这种情况下,我建议将数据读入矢量中,不要使用额外的字符串流来减慢速度。

你可以找到在网络上实现你自己的流类的例子,比如gzstream。本书Standard C++ Iostreams和Locales书籍也很有用。

相关问题