отсутствует строка при чтении данных из текстового файла в двоичном режиме - PullRequest
0 голосов
/ 08 мая 2018

Я создал class Ученый с атрибутами: string имя, int идентификатор, char оценка. Затем я записал данные в текстовый файл в режиме binary, используя программу P1 . У меня была другая программа P2 , которая вставляет новые данные между предыдущими данными.

Показывает данные (используя программу P1), когда я изначально создал текстовый файл с некоторыми объектами. Но когда я вставил новые данные (используя программу P2), появляются атрибуты id и grade, но атрибут name пропал.

Код класса Scholar:

#ifndef SCHOLAR_H
#define SCHOLAR_H
#include <iostream>
#include <cstdio>
using namespace std;

class Scholar {
    int id;
    string name;
    char grade;

public:
    void read_data() {
        cout << "\nEnter ID: ";
        cin >> id;
        string temp;
        getline(cin, temp);
        cout << "Enter name: ";
        getline(cin, name);
        cout << "Enter grade: ";
        cin >> grade;
    }

    void print_data() {
        cout << "\nID: " << id << " | Name: " << name << " | Grade: " << grade;
    }

    int modify_data();
    int _id() {
        return id;
    }

    string _name() {
        return name;
    }

    char _grade() {
        return grade;
    }
};

#endif // SCHOLAR_H

Программа P1:

#include "MyHeaderFiles/Scholar.h"
#include <fstream>
#include <cstdlib>
#include <cctype>

int main() {
    system("cls");

    Scholar sch;
    fstream fs;
    fs.open("SchDB.txt", ios::out | ios::in | ios::binary | ios::trunc);

    if(!fs) {
        cerr << "File not found!";
        system("PAUSE");
    }

    char reply;
    do {
        sch.read_data();
        fs.write((char*) &sch, sizeof(sch));

        cout << "Do you want to add another scholar (y/n) : ";
        cin >> reply;
    } while(tolower(reply) == 'y');

    fs.seekg(0);
    cout << "\nFile content\n------------" << endl;
    while(!fs.eof()) {
        fs.read((char*) &sch, sizeof(sch));
        if(fs.eof()) break;

        sch.print_data();
    }

    fs.close();
    cout << endl;
    return 0;
}

Исходное изображение вывода, когда я не вставил новых данных:

Initial Image Вы можете увидеть имена!

Программа P2:

#include "MyHeaderFiles/Scholar.h"
#include <fstream>
#include <cstdlib>

int main() {
    system("cls");
    Scholar sch;
    Scholar newSch;
    ofstream fout;
    ifstream fin;
    fout.open("Temp.txt", ios::out | ios::binary);
    fin.open("SchDB.txt", ios::in | ios::binary);

    char last = 'y';
    int pos;
    cout << "\nYou have to enter data of a new student." << endl;
    newSch.read_data();

    fin.seekg(0);
    cout << "\nFile content\n------------" << endl;
    while(!fin.eof()) {
        pos = fin.tellg();
        fin.read((char*) &sch, sizeof(sch));
        if(sch._id() > newSch._id()) {
            fout.write((char*) &newSch, sizeof(newSch));
            last = 'n';
            break;
        } else {
            fout.write((char*) &sch, sizeof(sch));
        }
    }

    if(last == 'y') {
        fout.write((char*) &newSch, sizeof(newSch));
    } else if(!fin.eof()) {
        fin.seekg(pos);
        while(!fin.eof()) {
            fin.read((char*) &sch, sizeof(sch));
            if(fin.eof()) break;
            fout.write((char*) &sch, sizeof(sch));
        }
    }

    fin.close();
    fout.close();

    remove("SchDB.txt");
    rename("Temp.txt", "SchDB.txt");
    fin.open("SchDB.txt", ios::in | ios::binary);

    fin.seekg(0);
    while(!fin.eof()) {
        fin.read((char*) &sch, sizeof(sch));
        if(fin.eof()) break;
        sch.print_data();
    }

    fin.close();
    cout << endl;
    return 0;
}

Позднее изображение, когда я использовал программу P2 для вставки новых данных:

Later Image И теперь вы можете видеть, что отсутствует только атрибут name!

Я использую Code :: Blocks IDE и компилятор GNU GCC.

Кто-нибудь может мне объяснить, почему строка не отображается?

...