После записи двоичного файла и чтения записи (объекта) из двоичного файла тип последнего атрибута записи enum type равен NULL (значение по умолчанию) - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь написать код C ++, который читает из текстового файла, записывает все содержимое в двоичный файл и читает запись из двоичного файла. Для хранения записей я создал класс Student, который является одним из его Атрибут имеет тип enum. Я успешно читаю из текстового файла, я успешно записываю записи Student (проверяю его во время отладки), но у меня возникает проблема с чтением одной N-й записи из двоичного файла. Хотя все атрибуты успешно приняты, последний Атрибут whi c является типом enum и не изменяется по умолчанию даже для всех записей. Хотя в VS 2017 нет ошибок, при отладке я обнаружил, что проблема в binaryRead и readRecord parts (Данные в "this" показывают атрибут enum как NONE. Также sizeOfOneStudentRecord в seekg , read , readRecord , binaryRead et c. Может быть неверным. Мне нужна помощь друзей. Код приведен ниже. Я буду признателен за вашу помощь.

</p>

<code>enum Category { NONE = 0, Honor=1, High_Honor = 2 };
class Student
{
private:
    string name;
    double weight;
    int age;
    Category degree;

public:
    Student();
    Student(string _name, double _weight, int _age, Category _degree);
    Student* txtRead(ifstream& myFile);
    size_t sizeOfOneStudentRecord(Student* a);
    void binaryWrite(fstream& myFile);
    void binaryRead(fstream& myFile);
    void readRecord(fstream& binmyFile, int order);
    friend ostream& operator<<(ostream& output, Student& s) {
    ..
    }
};
Student::Student()
{
    name = "";
    weight = 0.0;
    age = 0;
    degree = NONE;
}
Student::Student(string _name, double _weight, int _age, Category _degree)
{
    name = _name;
    weight = _weight;
    age = _age;
    degree = _degree;
}
size_t Student::sizeOfOneStudentRecord(Student* c) {
    return sizeof(this->name) + sizeof(this->weight) + sizeof(this->age) + sizeof(this->degree);
}
Student* Student::txtRead(ifstream& myFile) {
...

}
void Student::binaryWrite(fstream& myFile) {
    myFile.write((char *)this, sizeOfOneStudentRecord(this));
}
void Student::binaryRead(fstream& myFile) {
    myFile.read((char*)this, sizeOfOneStudentRecord(this));
}
void Student::readRecord(fstream& binmyFile, int order) {
    binmyFile.seekg((order)*sizeOfOneStudentRecord(this));
    binaryRead(binmyFile);
    name = this->name;
    age = this->age;
    weight = this->weight;
    degree = this->degree;
}
int main() {
    Student *StudentArr[20];
    ifstream myFile("Student.txt", ios::in);
    ofstream txtmyFile("newStudentFile.txt", ios::out | ios::trunc);  
    fstream binmyFile("StudentBin.bin", ios::out | ios::in | ios::trunc | ios::binary);

    for (int i = 0; i < 20; i++) {
        StudentArr[i] = new Student();
        StudentArr[i]->txtRead(myFile);
        txtmyFile << *StudentArr[i];
        StudentArr[i]->binaryWrite(binmyFile);
    }
    myFile.close();
    txtmyFile.close();
    Student s1;
    s1.readRecord(binmyFile, 8);
    std::cout << s1 << endl;
    binmyFile.close();
    return 0;}
</code>

...