2012-08-13 5 views
0

나는, 구조체 B는 내가 쓰기에게하고 싶은거야 구조체읽기/이진 파일에 복잡한 구조체 쓰기

typedef struct a_t 
{ 
    vector <int> a; 
    int p; 
}a; 

typedef struct b_t 
{ 
    a x; 
    int y; 
}b; 

구조체 A는 구조체 벡터를 포함하는 다음과 같은 구조체를 포함 한/A로 구조체 B를 읽어 이진 파일. 그것은 옆에 : 다음 코드는 오류 메시지가 입니다

int main() 
{ 

    b m; 
    m.x.a.push_back(1); 
    m.x.a.push_back(2); 
    m.x.a.push_back(3); 
    m.x.p = 5; 
    m.y = 7; 
    cout << sizeof(m.y) << endl; 
    cout << sizeof(m.x) << endl; 
    cout << sizeof(m) << endl; 
    ofstream outfile("model",ios::out|ios::binary); 
    outfile.write((char*)&m,sizeof(m)); 
    outfile.close(); 


    b p; 
    ifstream iffile("model", ios::in|ios::binary); 
    iffile.read((char*)&p,sizeof(a)); 
    iffile.close(); 

    cout << p.y << endl;; 
    cout << p.x.p << endl; 
    cout << p.x.a[0] << endl; 
    cout << p.x.a[1] << endl; 
    cout << p.x.a[2] << endl; 
    return 0; 
} 

작동하지 않습니다 "0x0000000000504010 * * 중단됨 (덤프 코어) * glibc에는 더블 무료 또는 손상 (상단) 감지" struct에 파일을 쓰지 않습니다.

+0

가능하면'std :: vector'에'std :: array'를 사용하십시오. 'std :: vector'는 동적으로 할당 된 메모리를 관리하지만'std :: array'는 동적으로 할당 된 메모리를 관리하지 않습니다. 이 경우이 작업을 수행하는 순진한 방법 (char * 및 write/read 캐스팅)을 수행하게됩니다. – Kevin

답변

1

힙에 데이터를 할당하므로 벡터를 쓰고 읽을 수 없습니다.

#define MAXARR_A 100 

typedef struct a_t 
{ 
    int a[MAXARR_A]; 
    int p; 
} a; 

그렇지 않으면 당신은 크기를 작성하여 벡터에는 직렬화해야하고 : 당신이 당신의 응용 프로그램에서 실제 제한이있는 경우는 보통의 C 배열을 사용하는 (속도와 선명도, 잠재적으로 희생 저장을위한) 더 나은 결정할 수있다 그런 다음 배열 데이터를 덤프합니다. 다시 읽으려면 크기를 읽은 다음 벡터 크기를 조정하고 바이트를 읽습니다.

: 일부 코드를 추가하기로 결정했습니다. ... 이 컴파일 될 수 있습니다! =) 나는 또한,이 것 ... 검사 오류를 포함하지 않은

void write_a(a& data, ostream& s) 
{ 
    size_t len = data.a.size(); 
    s.write((char*)&len, sizeof(len)); 
    s.write((char*)&data.a[0], len * sizeof(int)); 
    s.write((char*)&data.p, sizeof(int)); 
} 

void write_b(b& data, ostream& s) 
{ 
    write_a(data.x, s); 
    s.write((char*)&data.y, sizeof(int)); 
} 

void read_a(a& data, istream& s) 
{ 
    size_t len; 
    s.read((char*)&len, sizeof(len)); 
    data.a.resize(len); 
    s.read((char*)&data.a[0], len * sizeof(int)); 
    s.read((char*)&data.p, sizeof(int)); 
} 

void read_b(b& data, istream& s) 
{ 
    read_a(data.x, s); 
    s.read((char*)&data.y, sizeof(int)); 
} 

주 더 C++ - 구조에 readwrite 멤버 함수로 이러한 기능을 좋아합니다.

+0

사실, 실제로 파일에 벡터를 작성해야합니다. – David

+0

네, 편집장의 모든 추가 코드에 관한 것입니다. 벡터를 덤프 할 수는 없습니다. 내부 클래스가 메모리를 가리키는 클래스입니다. 그냥 쓰면 포인터가 쓰는 데이터가 아니라 포인터를 쓰게 될 것입니다. 그 포인터를 다시 읽을 때 유효한 메모리를 가리 키지 않습니다. 그리고 벡터가 범위를 벗어나면 벡터가 요청하지 않은 메모리를 해제하기 때문에 오류 메시지가 나타납니다. 내 솔루션은 벡터의 내용을 직렬화하여 크기 값을 포함하여 다시 읽을 요소의 수를 알 수 있습니다. – paddy

+0

제 대답의 첫 번째 코드 블록은 대안입니다 ... 내 코드 블록 두 번째 대답은 벡터를 사용하려는 경우 어떻게해야하는지입니다. – paddy