使用 stringstream 在 C++ 中读取二进制文件

Reading a binary file in c++ with stringstream

我想write/read 文件中的数据。是否可以将文件(在代码内)分成多个Strings/Sections?或者读取数据直到特定行?

就像:"Read the Data untill line 32, put it inside a String, read the next 32 lines and put it into another string"

我已经知道如何使用 seekp 读取和查找数据,但我不太喜欢它,因为我的代码总是很长。

我已经找到了一些代码,但我不明白它是如何工作的:

dataset_t* DDS::readFile(std::string filename)
{
dataset_t* dataset = NULL;

std::stringstream ss;
std::ifstream fs;
uint8_t tmp_c;

try
{
    fs.open(filename.c_str(), std::ifstream::in);

    if (!fs)
    {
        std::cout << "File not found: " << filename << std::endl;
        return NULL;
    }

    while(fs.good())
    {
        fs.read((char*)&tmp_c, 1);
        if (fs.good()) ss.write((char*)&tmp_c, 1);
    }
    fs.close();

    dataset = new dataset_t();

    const uint32_t bufferSize = 32;
    char* buffer = new char[bufferSize];

    uint32_t count = 1;
    while(ss.good())
    {
        ss.getline(buffer, bufferSize);

        dataitem_t dataitem;
        dataitem.identifier = buffer;
        dataitem.count = count;
        dataset->push_back(dataitem);

        count++;
    }

    return dataset;
}
catch(std::exception e)
{
    cdelete(dataset);
    return NULL;
}

}

代码编辑二进制保存文件。

或者有人 link 可以给我一个网站,让我可以了解有关缓冲区和字符串流的更多信息吗?

您可以创建一些 class 来模拟您的需求:take<N> 用于 'grab 32 lines',lines_from 用于遍历行。

你的 lines_from class 可以接受任何 std::istream:编码的东西,压缩的东西,...只要它给你一系列字符。 take<N> 会将其转换为 array<string, N> 块。

这是一个说明它的片段:

int main(){
    auto lines = lines_from{std::cin};

    while(lines.good()){
        auto chunk = take<3>(lines);
        std::cout << chunk[0][0] << chunk[1][0] << chunk[2][0] << std::endl;
    }
}

下面是支持的 classes 和函数:

#include <iostream>
#include <array>

class lines_from {
public:
    std::istream &in;
    using value_type = std::string;

    std::string operator*() {
        std::string line;
        std::getline(in, line);
        return line;
    }

    bool good() const {
        return in.good();
    }
};

template<int N, class T>
auto take(T &range){
    std::array<typename T::value_type, N> value;
    for (auto &e: value) { e = *range; }
    return value;
}

(在 cpp.sh 上演示)