Программа записи записи дважды в двоичном файле на с ++

Пожалуйста, проверьте код на наличие ошибок, так как он дважды записывает запись в файл. Я думаю, что ошибка может быть из-за eof() функция. Я предоставил описание класса тоже на всякий случай.

class student
{
    int sno;
    char sname[20];
    float fees;
public:
    void input()
    {
        cout << "enter sno,sname and fees \n";
        cin >> sno;
        gets(sname);
        cin >> fees;
    }
    void output()
    {
        cout << sno << "\t" << sname << "\t" << fees << "\n";
    }
    int rsno()
    {
        return sno;
    }
}s;

void add()
{
    ofstream f1;
    f1.open("stu.dat", ios::binary | ios::app);
    s.input();
    f1.write((char*)&s, sizeof(s));
    f1.close();
}
void displayall()
{
    ifstream f2;
    f2.open("stu.dat", ios::binary);
    while (!f2.eof())
    {
        f2.read((char*)&s, sizeof(s));
        s.output();
    }
    f2.close();
}
void main()
{
    add();
    displayall()
}

4 ответа

Вы должны объявить объект / экземпляр класса student в функции, прежде чем вы можете вызвать его. Вы неправильно предполагаете, что, создав класс и присвоив ему псевдоним, теперь вы можете вызывать его с помощью s.input, Вы должны объявить это в функции, в которой собираетесь использовать. student stu; или же s stu; в начале void add() функция.

Кроме того, поскольку вы используете C++, я настоятельно рекомендую вам использовать getline или даже fgets() вместо gets поскольку последняя является функцией C, она также является устаревшей и небезопасной для использования. Если вы это сделаете, я бы посоветовал взглянуть на использование Cin и Getline вместе. Обработка символа новой строки очень важна, если вы не хотите испортить это.

Похоже, вы не объявили экземпляр student, так что вы должны сделать это перед вызовом его методов;

student s;
s.input();

Кстати, этот код не выглядит так, как будто он работает на первый взгляд

Я думаю, что слишком мало кода, чтобы дать какое-либо утверждение. Это студенческий пример? Вы пытаетесь преобразовать его в массив символов таким образом? Я думаю, что вы должны сначала использовать сериализацию.

КСТАТИ. Это самое уродливое форматирование, которое я когда-либо видел - довольно нечитаемое

Спасибо, ребята, но я разобрался с ответом. Дело в том, что при использовании функции eof() существует какой-то буфер, поэтому я получаю повторяющиеся результаты.

Другие вопросы по тегам