2010-08-19 31 views
7

Tôi đang cố gắng tuần tự hóa một tập hợp các cấu trúc trong C++. Điều này làm việc tuyệt vời cho tất cả dữ liệu ngoại trừ một vector chứa trong cấu trúc của tôi. Tôi có thể ghi dữ liệu vào đĩa, và sau đó đọc tất cả dữ liệu vào bộ nhớ. Vấn đề duy nhất là khi tôi cố gắng truy cập vào một phần tử của vector, tôi nhận được một lỗi phân đoạn. Mã của tôi là dưới đây. Bất kỳ trợ giúp nào cũng được đánh giá rất cao.Việc tuần tự hóa các cấu trúc phức tạp trong C++

Chương trình để ghi vào đĩa Chương trình

int main { 
    struct Student one; 
    strcpy(one.FullName, "Ernestine Waller"); 
    strcpy(one.CompleteAddress, "824 Larson Drv, Silver Spring, MD 20910"); 
    one.Gender = 'F'; 
    one.LivesInASingleParentHome = true; 
    one.grades.push_back(80); 
    one.grades.push_back(90); 

    ofstream ofs("fifthgrade.ros", ios::binary); 
    ofs.write((char *)&one, sizeof(one)); 
    ofs.close(); 
} 

để đọc từ đĩa

int main { 
    struct Student *two = (struct Student *) malloc(sizeof(struct Student));  
    ifstream ifs("fifthgrade.ros", ios::binary); 
    //cout << "Size of struct: " << size << endl; 
    ifs.read((char *)two, sizeof(struct Student)); 
    cout << "Student Name: " << two->FullName << endl; 
    cout << "First Grade: " << two->grades[0] << endl; 
    cout << "Second Grade: " << two->grades[1] << endl; 
    ifs.close(); 
    return 0; 
} 
+0

http://www.parashift.com/c++-faq-lite/serialization.html – DumbCoder

+0

Tăng cường tuần tự hóa: http://www.boost.org/doc/libs/1_44_0/libs/serialization/doc/index. html – karlphillip

+0

Vui lòng bao gồm khai báo cho 'Student' –

Trả lời

7

gì bạn đang làm đang sao chép một vùng tiếp giáp bộ nhớ trong mà bạn đã lưu trữ one và viết nó để đĩa. Điều này sẽ làm việc tốt cho các kiểu dữ liệu đơn giản (POD trong C++ jargan). Vấn đề với vectơ là một vector là một đối tượng phức tạp với các con trỏ đến các vùng khác của bộ nhớ. Các vùng bộ nhớ khác không tồn tại khi bạn de-serialize one thành two do đó lỗi phân đoạn của bạn.

Rất tiếc, không có lối tắt, một số biểu mẫu trên mã tuần tự tùy chỉnh sẽ cần phải được viết để hoàn thành công việc.

Như một số đã đề cập Boost Serialization có thể trợ giúp. Ngoài ra, hãy tự mình tung ra.

5

Có lẽ phiên bản đơn giản của serializing một vector mà đứng một cơ hội làm việc là một cái gì đó như:

your_stream << your_vector.size(); 
std::copy(your_vector.begin(), your_vector.end(), 
    std::ostream_iterator<your_vector::value_type>(your_stream, "\n")); 

Đọc nó lại đi một cái gì đó như:

size_t size; 
your_stream >> size; 
vector_two.resize(size); 
for (size_t i=0; i<size; i++) 
    your_stream >> vector_two[i]; 

Lưu ý rằng đây không phải là đặc biệt hiệu quả - đặc biệt, nó (về cơ bản) giả định dữ liệu sẽ được lưu trữ ở định dạng văn bản, thường khá chậm và chiếm nhiều không gian hơn (nhưng dễ đọc, thao tác, vv, bởi các chương trình bên ngoài, thường hữu ích) .

Các vấn đề liên quan