读取二进制文件的迭代器

时间:2016-02-17 20:03:35

标签: c++ iterator

我必须以8字节的块读取一些二进制文件,然后通过tcp socket发送这些块。 我可以使用C ++迭代器完成此任务吗?像:

 FileIterator file("name_file.bin");

for(iter = file.begin(); iter != file.end(); iter++) {
    sendTcp(iter);
}

FileIterator必须返回一些将被发送的结构。 在FileIterator的构造函数中,我打开二进制文件并读取它。然后我创建了dinamic数组并在其中写入文件的内容。在每个步骤迭代器中,我必须从数组中读取下一个块并将其写入struct并返回。

2 个答案:

答案 0 :(得分:3)

是的,你可以!

您可以将fstream与istream_iterator一起使用,如下所示:

auto f = std::ifstream("lol.bin", std::ios::binary | std::ios::in);
f.exceptions(std::ios::badbit);
for (auto start = std::istream_iterator<char>{ f }, end = std::istream_iterator<char>{}; start != end; ++start)
{
    ...
}

修改 我没有注意到你要求8字节块。你可以解决它的方式是这样的:

首先定义运算符&gt;&gt;例如:

struct My8Bytes {
    char bytes[8];
};

std::istream& operator>>(std::istream& s, My8Bytes& bytes) {
    s.read(bytes.bytes, sizeof(bytes.bytes));
    return s;
}

并且以与以前相同的方式使用迭代器,现在只使用您的特定类型:

for (auto start = std::istream_iterator<My8Bytes>{ f }, end = std::istream_iterator<My8Bytes>{}; start != end; ++start)
{
    ...
}

答案 1 :(得分:0)

I see this as an X-Y problem.是的,它可以用迭代器完成,但迭代器并不是这项工作的最佳解决方案。使用迭代器是一种有趣的教育体验,但是老上学解决了这个问题几乎没有大惊小怪,更容易解决错误。

#include <iostream>
#include <fstream>

// simple 8 byte struct
struct EightByteStruct
{
    uint32_t a;
    uint32_t b;
};

// quick hack send routine. Added capacity for some simple error checking.
bool sendTcp(EightByteStruct & test)
{
    bool rval = false;
    // send test. Set rval true if success
    return rval;
}

//main event: read file into struct, write struct to socket
int main()
{
    std::ifstream in("filename", std::ios::binary);
    EightByteStruct test;
    while (in.read((char*)&test, sizeof(test)))
    { // will not enter if sizeof(test) bytes not read from file
        if (sendTcp(test))
        {
            // handle send error
        }
    }
    // test here for any file error conditions you wish to have special handling
}