2

经过大量寻找解决方案后,我决定实际寻求帮助!

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

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

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

4

5 回答 5

2

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

于 2009-12-09T20:40:49.160 回答
0

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

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

所有这一切的一个单独组成部分是从块中提取有用的数据。我实际上并没有仔细研究过从 istringstream 中读取的内容,因此根据情况可能会决定我希望从 istringstream 的 std::vector 进程中进行处理。

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

于 2009-12-09T22:46:15.937 回答
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
于 2009-12-09T20:39:55.057 回答
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 );
于 2009-12-23T07:53:22.977 回答
0

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

一种优雅的方法是实现自己的流,使用 std::streambuf 等作为基础。然后您将在输入端读取和缓冲块,处理或不处理压缩,并在输出端有一个数据流,您可以使用通常的运算符将数据正确地读取为字符串、整数等。

否则,您将无法使用流读取方法,就像将数据读入缓冲区的系统调用一样。在这种情况下,我建议将数据读入向量,并且不再使用额外的字符串流来减慢速度。

您可以在网上找到实现自己的流类的示例,例如 gzstream。Standard C++ Iostreams and Locales 这本书也很有用。

于 2009-12-23T08:18:57.830 回答