使用类似的东西从文件中读取序列化数据(已知格式+字节序)是否有什么特别糟糕或天真的东西?我并不担心可移植性,而且实际上它只会被我使用。我知道有一个问题是尝试提取到非打包的POD结构,尽管我总是可以为每个这样的结构定义一个单独的operator>
。
template<typename T> inline std::fstream& operator> (std::fstream& fs, T& i) {
static_assert(std::is_pod<T>::value, "Not POD");
fs.read(reinterpret_cast<char*>(&i), sizeof i);
return fs;
}
template<typename T> inline std::fstream& operator> (std::fstream& fs, std::vector<T>& v) {
static_assert(std::is_pod<T>::value, "Not POD");
fs.read(reinterpret_cast<char*>(&v[0]), sizeof(T) * v.size());
return fs;
}
template<typename T> inline std::fstream& operator> (std::fstream& fs, std::vector<std::vector<T>>& v) {
for (auto& i : v)
fs > i;
return fs;
}
inline std::fstream& operator> (std::fstream& fs, std::string& s) {
fs.read(reinterpret_cast<char*>(&s[0]), s.size());
return fs;
}
std::fstream f("file", std::ifstream::in | std::ifstream::out | std::ifstream::binary);
int i;
char j;
std::vector<std::vector<char>> vec(5, std::vector<char>(8));
f > i > j > vec;
答案 0 :(得分:2)
我不确定你在问什么。您发布的代码无法阅读 序列化数据“已知格式或字节序”。它从中复制字节 文件到哪里,可能导致未定义的行为,是 除非通过一些奇怪的位,否则不太可能产生正确的值 幸运的是,“已知格式”完全对应于内部使用的格式 在你的机器上。我很多情况下,事实上,它可能会导致 程序崩溃;想想如果结构你可能会发生什么 例如,尝试读取包含指针。
我可能会补充说重载'&gt;'因为这是可怕的超负荷滥用;如果
你想要阅读一种特殊的格式,理所当然的就是去做
定义一个相应的类(例如ixdrstream
)和重载
'&GT;&GT;'为了它。 (ixdrstream
可能来自
std::basic_ios<char>
,当然,几乎肯定会使用
标准streambuf
用于实际输入。)
当然,你永远不会在std::fstream
上过载,而是在过载
std::istream
(或std::ostream
输出)。 (FWIW,我不认为
我曾用过std::fstream
。流成语真的没有
支持优雅地混合读写。)