2016-10-27 4 views
0

바이너리 파일에 잘못 쓰고 있다고 생각합니다. 학년, 단위 등의 세부 정보가있는 목록에 대학 과정을 추가 할 수있는 프로그램을 만들어야합니다. 배열에 항목을 추가 할 때마다 배열 용량을 배가해야합니다 (따라서 doubleArrayCapacity 함수)C++ 동적 배열 직렬화

void doubleArrayCapacity(Course*&, int&, int); 

    ... 

    int cap = 2; 
    int size = 0; 
    Course* courses = new Course[cap]; 

    fstream fin; 
    fin.open("myCollegeCourses.9.bat", ios::binary|ios::in); 
    if (fin.good()) 
    { 
    fin.read(reinterpret_cast<char*>(&size), sizeof(size)); 
    doubleArrayCapacity(courses, cap, size); 
    fin.read(reinterpret_cast<char*>(courses), cap * sizeof(Course)); 
    } 
    fin.close(); 

    ... 

    fstream fout; 
    fout.open("myCollegeCourses.9.bat", ios::binary|ios::out); 
    fout.write(reinterpret_cast<char*>(&size), sizeof(size)); 
    fout.write(reinterpret_cast<char*>(courses), cap * sizeof(Course)); 
    fout.close(); 

    ... 

    void doubleArrayCapacity(Course*& array, int& capacity, int newCapacity) 
    { 
    Course* temp = new Course[2 * capacity]; 
    for (int i = 0; i < capacity; i++) 
     temp[i] = array[i]; 
    delete [ ] array; 
    array = temp; 
    capacity = newCapacity * 2; 
    } 

내 배열에 4 개의 항목을 추가하면 프로그램이 올바르게 작동합니다. 5 개의 객체를 얻으면 오류가 발생합니다. 파일을 올바르게 다시 읽지 않고 다섯 번째 항목을 null 또는 0으로 읽습니다. 내 바이너리 파일에 내 데이터를 제대로 출력하지 않는 것 같습니다. 누구든지 내가 뭘 잘못하고 있는지 알 수 있니?

+0

는 일반적으로 만 두 배 용량,하지 때마다 당신이 항목을 추가합니다. 매번 크기를 두 배로 늘리면 배열에 초기화되지 않은 데이터가 효과적으로 삽입됩니다. – Meixner

+0

BTW :이 데이터를 디스크에 쓰는 것은 번호가 다른 표현 (큰 리틀 엔디안 대 리틀 엔디안)을 가질 수 있고 데이터 유형의 정렬이 구조에 다른 패딩으로 이어지는 다양한 요구 사항을 가질 수 있으므로 다른 플랫폼에서 전혀 이식 가능하지 않습니다. – Meixner

답변

1

내가 볼 수 있듯이, 당신이 잠재적 여기에 문제

  1. 첫 번째 문제는 직렬화에, 직렬화의 fout.write(reinterpret_cast<char*>(courses), cap * sizeof(Course)); 정확성이 Course 개체의 데이터 멤버의 내부 배치 및 정렬에 따라 달라집니다 있습니다.
  2. 두 번째 잠재적 인 문제는 void doubleArrayCapacity 함수의 구현에 있습니다. temp[i] = array[i]; 문구가 원하는대로 처리 되려면 Course 할당 연산자를 구현해야합니다. '코스는'더 복잡한 데이터 멤버 포인터가 없음을 확인

    1. 검토 '과정'
    2. 의 데이터 멤버의 정렬을 :

    어쨌든, 난 당신을 추천합니다.

또 다른 옵션은 Course 클래스와 비 직렬화 생성자에 serialize 메서드를 추가하는 것입니다.

+0

조언 해 주셔서 감사합니다. 이것은 나의 코스 구조체'struct course { char title [13]; int year; int 단위; char 등급; };' – Norse

+0

그리고'Course' 할당 연산자를 구현하여 두 번째 요령에 대해 자세히 설명해 주시겠습니까? – Norse

+0

그런 구조체에 대해서는'Course & operator = (const course & other);)가 필요하지 않습니다. ' –

0

파일에 size이라고 쓰면 몇 개의 항목이 있는지 알려줍니다. 그런 다음 파일을 열고 size을 읽습니다. 그러나 size을 사용하는 것을 잊었습니다.

변경 cap 여기 size에 : 새로운 항목이 기존의 용량에 맞지 않을 때

fin.read(reinterpret_cast<char*>(&size), sizeof(size)); 
doubleArrayCapacity(courses, cap, size); 

//fin.read(reinterpret_cast<char*>(courses), cap * sizeof(Course));  
fin.read(reinterpret_cast<char*>(courses), size * sizeof(Course)); 
+0

내가 할 때'Segmentation fault (core dumped) '라는 오류가 발생합니다. – Norse

+0

나머지 코드는 표시하지 않았습니다. 질문을 업데이트하여 [Minimal Complete Verifiable Example] (http://stackoverflow.com/help/mcve)을 만드십시오. –