我必须以8字节的块读取一些二进制文件,然后通过tcp socket发送这些块。 我可以使用C ++迭代器完成此任务吗?像:
FileIterator file("name_file.bin");
for(iter = file.begin(); iter != file.end(); iter++) {
sendTcp(iter);
}
类FileIterator
必须返回一些将被发送的结构。
在FileIterator
的构造函数中,我打开二进制文件并读取它。然后我创建了dinamic数组并在其中写入文件的内容。在每个步骤迭代器中,我必须从数组中读取下一个块并将其写入struct并返回。
答案 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
}