많은 변수가 포함 된 클래스가 있습니다. 예를 들어 거기에 몇 가지 다차원 벡터가 있습니다.파일에 데이터 저장 및로드 C++ (초보자)
데이터를 파일에 직접 저장하고로드 할 수 있다고 들었는데 어느 정도까지 확장 할 수 있습니까?
예를 들어이 클래스의 인스턴스를 만든 다음이를 파일에 저장하면 동일한 방식으로로드 할 수 있습니까? 어떻게 작동합니까? 한 번에 모두 저장합니까 아니면 어떻게 든 데이터를 분할해야합니까?
많은 변수가 포함 된 클래스가 있습니다. 예를 들어 거기에 몇 가지 다차원 벡터가 있습니다.파일에 데이터 저장 및로드 C++ (초보자)
데이터를 파일에 직접 저장하고로드 할 수 있다고 들었는데 어느 정도까지 확장 할 수 있습니까?
예를 들어이 클래스의 인스턴스를 만든 다음이를 파일에 저장하면 동일한 방식으로로드 할 수 있습니까? 어떻게 작동합니까? 한 번에 모두 저장합니까 아니면 어떻게 든 데이터를 분할해야합니까?
. 어느 쪽이든 당신이 가기로 결정한 경우, 직접 구현해야합니다.
당신은 스트림을 사용하는<<
>>
연산자를 오버로드 선택 수도 있고, 당신이 (당신 같은 적절한 가입시 선택하신 이름이나,
Serialize
/
Deserialize
) 자신의
Load
및
Store
방법으로 이동 할 수 있습니다. 나는 개인적으로 자신의 기능을 만들고 운영자를 사용하지 않는 것을 선호하지만 그것은 나뿐입니다.
#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::binary
및
ifstream:binary
플래그를 사용해야하고 추가 분리 기호 (예 :
' '
및
endl
)를 사용할 필요가 없습니다. 직렬화 스트림).
일반적으로 직렬화에 대해 생각할 때 스트림의 버전을 생각해 보는 것이 좋습니다. 이는 또 다른 개별 주제입니다.
스트림 연산자를 구현할 수 있습니다. 다음으로
당신은 단순히 읽고 쓰기 다음 사용할 수 있습니다 기본적으로 >> 연산자의
fileStream >> yourObject
fileStream << yourObject
, 당신은 스트림을 읽고 발견 된 데이터와 객체를 구성합니다. < < 연산자에서 스트림을 읽는 것과 같은 형식으로 개체를 스트림에 씁니다.
이 작업 방법을 사용하면 가지고있는 모든 객체를 직렬화 할 수 있습니다.
Google은 "오버로드 스트림 운영자"가 이러한 연산자를 구현하는 방법을 알고 있습니다.
그게 전부입니다. 동일한 연산자를 오버로드하는 직렬화 프레임 워크가 있습니다. 나는 어떤 사람들이 말할 것이라고 확신합니다. 바퀴를 다시 발명하지 말고 부스트 등을 사용하십시오. 나는 근본적인 것을하는 코드를 제어하는 것을 좋아한다. –
클래스의 모든 멤버를 반복하고 (중요하지 않은 클래스를 건너 뛰고 다른 클래스를 변환하는) 코드를 제공하고 연속적인 데이터 스트림을 준비 할 수 있습니다. 좁은 의미에서의 직렬화입니다. 읽을 때 똑같은 것을 역순으로 수행해야합니다.
C++에서 CopyMemory(ptr, sizeof(*ptr)
과 같은 바이너리 덤프를 수행 할 수도 있습니다. 데이터에 포인터가 포함되어 있지 않으면 (특히 가상 메소드가있는 클래스의 숨겨진 포인터가 포함 된 경우에만) 작동 할 수 있습니다. 그것의 유일한 단점은 단순성과 엄청난 속도입니다. 이 접근법은 데이터가 메모리에 연속적으로 존재할 때가끔 자신에게 유익한 것이 무엇인지를 요구합니다.
C++는/저장 파일로/개체를로드하는 자동화 된 방법이 없습니다 아니다
데이터를 일련의 바이트로 변환하거나 반대로 변환해야합니다. "직렬화"에 대해 읽어보십시오. – aschepler
"serialization"및 "deserialization"을 찾고 있습니다. 어떤 프레임 워크를 사용하고 있습니까? 아니면이 순수 STL입니까? – 0xC0000022L
STL, VS2010도 사용합니다. –