使用stringstream读取c ++中的二进制文件

时间:2016-02-13 11:26:19

标签: c++ stringstream

我想从文件中写入/读取数据。是否可以在多个字符串/节中划分文件(在代码内)?或读取数据直到特定行?

就像:"读取数据直到第32行,将其放在一个字符串中,读取接下来的32行并将其放入另一个字符串"

我已经知道如何使用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;
}

}

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

或者有人可以链接我一个我可以了解缓冲区和字符串流的网站吗?

1 个答案:

答案 0 :(得分:0)

您可以创建一些类来模拟您的需求:delete用于“抓取32行”,而take<N>用于迭代行。

您的lines_from课程会接受任何lines_from:编码的内容,压缩的内容,......只要它能为您提供一系列字符。 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;
    }
}

cpp.sh上的演示)