2011-11-02 94 views
0

從文件中使用類似這樣的方式讀取序列化數據(已知格式+字節序)是否有什麼特別不好或天真?我並不擔心可移植性,實際上它只會被我使用。我知道有一個問題會試圖提取到非壓縮的POD結構,儘管我總是可以爲每個這樣的結構定義一個單獨的operator>從std :: fstream反序列化

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

Eh?你已經改變了'operator>'的含義?爲什麼不使用'operator >>'? – Nim

回答

2

我不確定你在問什麼。您發佈的代碼不讀取 序列化數據「已知格式或字節序」。它將 文件中的字節複製到永遠可能導致未定義行爲的位置,並且 很可能不會導致正確的值,除非運行某些奇怪的位 ,「已知格式」與內部使用的完全對應 在你的機器上。我遇到很多情況,實際上,這可能會導致 程序崩潰;例如,如果嘗試讀取的結構包含指針,可能會發生什麼情況。

我可能會添加重載'>',因爲這是可怕的過載濫用;如果您想要讀取特殊格式的 ,邏輯路徑是 定義一個對應的類(例如ixdrstream),併爲它過載 '>>'。 (ixdrstream可能會從 std::basic_ios<char>獲得,當然,幾乎肯定會使用 標準streambuf實際輸入。)

和當然,你永遠不超載就std::fstream,而是在 std::istream(或std::ostream輸出)。 (FWIW,我不認爲 我曾經使用過std::fstream這個流成語真的不支持 混合讀寫優雅。)