2012-07-06 2 views
4

많은 변수가 포함 된 클래스가 있습니다. 예를 들어 거기에 몇 가지 다차원 벡터가 있습니다.파일에 데이터 저장 및로드 C++ (초보자)

데이터를 파일에 직접 저장하고로드 할 수 있다고 들었는데 어느 정도까지 확장 할 수 있습니까?

예를 들어이 클래스의 인스턴스를 만든 다음이를 파일에 저장하면 동일한 방식으로로드 할 수 있습니까? 어떻게 작동합니까? 한 번에 모두 저장합니까 아니면 어떻게 든 데이터를 분할해야합니까?

+1

데이터를 일련의 바이트로 변환하거나 반대로 변환해야합니다. "직렬화"에 대해 읽어보십시오. – aschepler

+2

"serialization"및 "deserialization"을 찾고 있습니다. 어떤 프레임 워크를 사용하고 있습니까? 아니면이 순수 STL입니까? – 0xC0000022L

+0

STL, VS2010도 사용합니다. –

답변

4

. 어느 쪽이든 당신이 가기로 결정한 경우, 직접 구현해야합니다.

당신은 스트림을 사용하는 << >> 연산자를 오버로드 선택 수도 있고, 당신이 (당신 같은 적절한 가입시 선택하신 이름이나, Serialize/ Deserialize) 자신의 LoadStore 방법으로 이동 할 수 있습니다. 나는 개인적으로 자신의 기능을 만들고 운영자를 사용하지 않는 것을 선호하지만 그것은 나뿐입니다.

#include <fstream> 
#include <iostream> 

using namespace std; 

class MyClass 
{ 
public: 
    MyClass (int x) : m_x(x), m_y(x+1) {} 

    friend istream& operator >> (istream& in, MyClass& obj); 
    friend ostream& operator << (ostream& out, const MyClass& obj); 

private: 
    int m_x; 
    int m_y; 
}; 

istream& operator >> (istream& in, MyClass& obj) 
{ 
    in >> obj.m_x; 
    in >> obj.m_y; 
    return in; 
} 

ostream& operator << (ostream& out, const MyClass& obj) 
{ 
    out << obj.m_x << ' '; 
    out << obj.m_y << endl; 
    return out; 
} 

int main(int argc, char* argv[]) 
{ 
    MyClass myObj(10); 
    MyClass other(1); 
    cout << myObj; 
    ofstream outFile ("serialized.txt"); 
    outFile << myObj; 
    outFile.close(); 
    ifstream inFile ("serialized.txt"); 
    inFile >> other; 
    inFile.close(); 
    cout << other; 
    return 0; 
} 

그것은 가치가 당신이 직렬화 형식에 대해주의를 기울여야 언급하기 : 여기

은 (과부하 <<>> 사업자와) 간단한 예입니다. 위의 예에서 텍스트 일뿐입니다. 하지만 이러한 객체를 많이 저장하려는 경우 파일을 여는 동안 ofstream::binaryifstream:binary 플래그를 사용해야하고 추가 분리 기호 (예 : ' 'endl)를 사용할 필요가 없습니다. 직렬화 스트림).

일반적으로 직렬화에 대해 생각할 때 스트림의 버전을 생각해 보는 것이 좋습니다. 이는 또 다른 개별 주제입니다.

0

스트림 연산자를 구현할 수 있습니다. 다음으로

당신은 단순히 읽고 쓰기 다음 사용할 수 있습니다 기본적으로 >> 연산자의

fileStream >> yourObject 
fileStream << yourObject 

, 당신은 스트림을 읽고 발견 된 데이터와 객체를 구성합니다. < < 연산자에서 스트림을 읽는 것과 같은 형식으로 개체를 스트림에 씁니다.

이 작업 방법을 사용하면 가지고있는 모든 객체를 직렬화 할 수 있습니다.

Google은 "오버로드 스트림 운영자"가 이러한 연산자를 구현하는 방법을 알고 있습니다.

+0

그게 전부입니다. 동일한 연산자를 오버로드하는 직렬화 프레임 워크가 있습니다. 나는 어떤 사람들이 말할 것이라고 확신합니다. 바퀴를 다시 발명하지 말고 부스트 등을 사용하십시오. 나는 근본적인 것을하는 코드를 제어하는 ​​것을 좋아한다. –

0

클래스의 모든 멤버를 반복하고 (중요하지 않은 클래스를 건너 뛰고 다른 클래스를 변환하는) 코드를 제공하고 연속적인 데이터 스트림을 준비 할 수 있습니다. 좁은 의미에서의 직렬화입니다. 읽을 때 똑같은 것을 역순으로 수행해야합니다.

C++에서 CopyMemory(ptr, sizeof(*ptr)과 같은 바이너리 덤프를 수행 할 수도 있습니다. 데이터에 포인터가 포함되어 있지 않으면 (특히 가상 메소드가있는 클래스의 숨겨진 포인터가 포함 된 경우에만) 작동 할 수 있습니다. 그것의 유일한 단점은 단순성과 엄청난 속도입니다. 이 접근법은 데이터가 메모리에 연속적으로 존재할 때가끔 자신에게 유익한 것이 무엇인지를 요구합니다.

이 정확히 C에서 초보자의 주제 ++

C++는/저장 파일로/개체를로드하는 자동화 된 방법이 없습니다 아니다

관련 문제