经过大量寻找解决方案之后,我决定要求一些帮助!
我有一个由多个块组成的文件,其中每个块可能会也可能不会被压缩。在每个块之前指示块的大小以及块是否被压缩。每个块内都有一个标识块的字符串。给定一个块名称,我想从文件中获取相关的块。
我的第一个想法是读取压缩标志和块的大小,只将块读入istringstream,如果需要,解压缩istringstream,然后搜索块名称。我可以读取压缩标志和块的大小,但我不知道如何将文件数据块读入istringstream。我看到人们将整个文件读入istringstream的地方,但我不想这样做,因为每个块可能需要也可能不需要解压缩。
我错过了任何想法或解决方案的链接?还是有更好的算法?感谢您的任何意见。
答案 0 :(得分:2)
为什么需要将数据读入内存流;为什么不把它读成数组或std::vector
?
答案 1 :(得分: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 :(得分:0)
我更喜欢流,因为我的解压缩程序使用了C风格的字符串。
但是,我应该能够将std :: vector转换为压缩/解压缩例程所需的内容,所以一旦我将读取部分工作,我就会调查它。
所有这一切的单独组件是从块中提取有用数据。我实际上并没有仔细查看istringstream的读取,所以取决于它如何可能决定我希望从istringstream处理std :: vector的进程。
感谢你们两位。看起来我必须解释Bjarne关于pubsetbuf的说法:)。
答案 3 :(得分: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 );
答案 4 :(得分:0)
Streams,顾名思义是用于流式文本或二进制处理。您对读取块感兴趣,因此将数据放入字符串流对我来说没有多大意义。
一种优雅的方法是使用std :: streambuf等作为基础来实现自己的流。然后,您将在输入处读取和缓冲块,处理压缩与否,并在输出处有一个数据流,您可以使用常规运算符将数据正确读取到字符串,整数等中。
否则,您将无法使用流读取方法,就像系统调用将数据读入缓冲区一样。在这种情况下,我建议将数据读入矢量,而不是通过使用额外的字符串流来减慢速度。
您可以找到在网络上实现自己的流类的示例,例如gzstream。 “标准C ++ Iostreams和Locales”一书也很有用。