이것은 교수가 자신의 스크립트에서 우리에게 보여준 것입니다. 필자가 작성한 코드에서이 메서드를 사용하지 않았습니다. 기본적으로구조체 또는 클래스를 파일로 저장하기 위해 재 해석 캐스팅 사용
, 우리는 클래스 또는 구조체를 가지고, 그것을 reinterpret_cast 그래서 같은 전체 구조체 오프 저장 : 이것은 (파일에) 출력을 생성
struct Account
{
Account()
{ }
Account(std::string one, std::string two)
: login_(one), pass_(two)
{ }
private:
std::string login_;
std::string pass_;
};
int main()
{
Account *acc = new Account("Christian", "abc123");
std::ofstream out("File.txt", std::ios::binary);
out.write(reinterpret_cast<char*>(acc), sizeof(Account));
out.close();
ÍÍÍÍChristian ÍÍÍÍÍÍ ÍÍÍÍabc123 ÍÍÍÍÍÍÍÍÍ
I을 혼란스러워. 이 방법은 실제로 작동합니까, 아니면 UB가 발생합니까? 개별 컴파일러의 변덕에 속하는 클래스와 구조체 내에서 불가사의 한 일이 발생하기 때문입니다.
Yikes. 이것은, 예를 들어'std :: string'의 내부 표현에 의존하는 것처럼 보입니다. 게다가'struct' 패딩과 컴파일러가 할 수있는 다른 것들을 고려하지 않습니다. – Nate
사실,'std :: string'의 구현이 동적으로 버퍼를 할당하면, 이것은 작동하지 않습니다. 표준 라이브러리가'std :: string' 객체 자체에 짧은 문자열을 캐시하는 것처럼 보이지만, 긴 문자열에는 실패 할 것입니다. – Nate
이 방법을 사용하여 "무언가"를 저장할 수 있지만 같은 방식으로 다시 읽을 때 POD가 아닌 필드가 생존 할 것으로 기대하지 마십시오. – Blastfurnace