自定义数据的iostream
-
20-09-2019 - |
题
我有定义为
的数据结构struct myDataStruct
{
int32_t header;
int16_t data[8];
}
和我想利用字符流并把它变成一个myData的流。我应该扩展什么流类?我想创建一个自定义流类,这样我可以做这样的事情。
myDataStruct myData;
myDataStruct myDataArray[10];
myDataStream(ifstream("mydatafile.dat"));
myDataStream.get(myData);
myDataStream.read(myDataArray, 10);
解决方案
相反myDataStream.get(myData)
的,你要做的就是超载operator>>
为您的数据类型:
std::istream& operator>>(std::istream& is, myDataStruct& obj)
{
// read from is into obj
return is;
}
如果要读入的阵列,只写一个循环:
for( std::size_t idx=0; idx<10; ++idx )
{
myDataStruct tmp;
if( is >> tmp )
myDataArray[idx] = tmp;
else
throw "input stream broken!";
}
使用函数模板,你应该能够重载运算符的右侧阵列还(但我从来没有尝试过):
template< std::size_t N >
std::istream& operator>>(std::istream& is, myDataStruct (&myDataArray)[N])
{
// use loop as above, using N instead of the 10
}
但我不能确定这是否是华丽还是卑鄙。
其他提示
如果您正在使用未格式化的输入工作,你或许应该直接以二进制形式读取。通常你会使用一些特定的编译器指令来创建没有填充数据结构,然后只是读/写从文件。
// Gcc
#pragma pack(1) // option 1: pragmas
struct frame {
std::uint32_t header;
std::uint16_t data[8];
} __attribute((packed)); // option 2: packed attribute
#pragma pack(0)
bool operator==( data const & lhs, data const & rhs )
{
bool result = lhs.header == rhs.header;
for ( int i = 0; i < 8; ++i )
{
result &= lhs.data[i] == rhs.data[i];
}
return result;
}
int main()
{
frame data = { 10, 1, 2, 3, 4, 5, 6, 7, 8 };
std::ofstream out( "data.bin", ofstream::binary );
out.write( reinterpret_cast<char*>(&data), sizeof(data) );
out.close();
std::ifstream in( "data.bin", ifstream::binary );
frame readed;
in.read( reinterpret_cast<char*>(&readed), sizeof(readed) );
in.close();
std::cout << (readed == data) << std::endl; // 1
}
在编译器指令禁用填充为VS可能是不同的(我相信编译指令都在GCC和VS的作品,但我一直使用的属性)。
不隶属于 StackOverflow