2011-11-02 5 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

나는 당신이 무엇을 요구하고 있는지 확실하지 않습니다. 게시 한 코드는 "알려진 형식 또는 엔디 언"의 일련 번호가 지정된 데이터 을 읽지 않습니다. 그것은 파일을 에서 정의되지 않은 동작을 초래할 수있는 파일에 복사합니다. 은 이상한 비트 운이 좋으면 "올바른 형식"이 내부적으로 사용 된 것과 정확하게 일치하지 않는 한 올바른 값이 될 가능성이 거의 없습니다 귀하의 컴퓨터에. 사실 많은 경우에 실제로는 프로그램이 중단됩니다. 예를 들어, 의 구조에 포인터가 들어 있으면 어떤 일이 일어날 지 생각해보십시오.

"overloading '>'이것은 끔찍한 과부하 악용입니다. 특수 형식을 읽고 싶다면 에 해당하는 클래스 (예 : ixdrstream)를 정의하고 에 >> >> 과부하를 지정해야합니다. (ixdrstream 아마도 물론, std::basic_ios<char>에서 파생되며, 거의 확실하게 실제 입력에 대한 표준 streambuf을 사용합니다.)

그리고 물론

, 당신은 std::fstream에 과부하가 결코 아니라에 std::istream (또는 std::ostream 출력). (FWIW, 나는 생각하지 않는다 나는 std::fstream을 사용했다. 스트림 관용어는 실제로 이 읽고 쓰기를 우아하게 섞어서 지원하지 않는다.)