【问题标题】:Copying Part of Fstream to Istringstream将 Fstream 的一部分复制到 Istringstream
【发布时间】:2010-12-25 00:01:48
【问题描述】:

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

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

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

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

【问题讨论】:

标签: c++ fstream stringstream


【解决方案1】:

未经测试,但这样的东西应该可以工作:

// 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

    【讨论】:

    • 如果你的解压程序使用的是 C 风格的字符串,并且你事先知道缓冲区大小,那么你肯定应该只是读入一个 char 数组。
    【解决方案3】:

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

    但是,我应该能够将 std::vector 转换为压缩/解压缩例程所需的内容,因此一旦读取部分正常工作,我将对其进行研究。

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

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

    【讨论】:

    • 你可以转换一个 std::vector v;到一个 C 风格的字符串就好了: &v[0] 和大小 v.size() 。请注意,它们不会缩小。
    【解决方案4】:

    使用迭代器。

    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 );
    

    【讨论】:

      【解决方案5】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-04
        • 1970-01-01
        • 2013-07-12
        • 2017-01-11
        • 1970-01-01
        • 2017-12-27
        • 1970-01-01
        相关资源
        最近更新 更多