문제

Pointer Magikry를 사용하여 바이트 데이터를 파일에 쓴 다음 메소드를 사용하여 C ++ 클래스를 저장하고 싶습니다.

result Osp::Io::File::Write (const void *buffer, int length);
.

  • 매개 변수 :

    • buffer - 작성 될 바이트 데이터가 포함 된 사용자가 제공 한 버퍼에 대한 포인터
    • length - 버퍼 길이는 바이트 길이
    • 예외 :

      • E_SUCCESS - 메서드가 성공했습니다.
      • E_INVALID_STATE - 파일이 아직 열리지 않았습니다.
      • E_ILLEGAL_ACCESS - 쓰기 작업을 위해 파일이 열리지 않거나 허가가 충분하지 않아 액세스가 거부됩니다.
      • generacodicicetagcode - 다음 조건 중 하나가 발생했습니다.
        • 지정한 버퍼에는 널 포인터가 들어 있습니다.
        • 지정된 버퍼 길이는 0보다 같거나 작습니다.
        • 파일 핸들이 유효하지 않습니다 (다른 방법으로 파일이 닫히거나 메모리가 손상됨).
        • E_INVALID_ARG - 디스크 공간이 가득 차 있습니다.
        • E_STORAGE_FULL - 갑자기 배출 된 미디어 또는 파일 손상이 감지되면 예기치 않은 장치 오류가 발생했습니다.

          나는 오히려 어떤 종류의 버퍼링이있을 것이라고 가정하지 않는다고 생각하지 않지만, 나는 자신감이있다. 클래스의 데이터 필드 (그리고 예를 들어, 객체에 대한 포인터 (E_IO)에 의해 (예 : 정적 필드)?

도움이 되었습니까?

해결책

C ++에서 "원시"객체를 파일에 쓰지 않고 오히려 직렬화 을 직렬화합니다.마술이 없습니다. 직렬화 코드를 직접 작성해야합니다 (오버로드 연산자 <<>>).

메모리를 덤핑하는 것만으로 오래된 C 스타일을 할 수 있지만 문제가 일반적으로 C (정렬, 엔디안 문제가 시스템 간의 데이터를 전송할 때) C ++에서 소개 된 문제가 발생합니다 (내부 클래스 표현은 V-TABLE 등의 "숨겨진"데이터 구성원 등을 포함합니다.

다른 시스템과 / 또는 다른 소프트웨어간에 전송할 수있는 안정적인 데이터를 읽고 쓰려는 경우 직렬화를 더 잘 구현하고 바로 가기를 찾지 못합니다.

"Nofollow"> Boost.Serialization 와 같은 라이브러리를 사용할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top