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

Пожалуйста, проверьте код на наличие ошибок, так как он дважды записывает запись в файл. Я думаю, что ошибка может быть из-за 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()
}

0

Решение

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

student s;
s.input();

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

0

Другие решения

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

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

0

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

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

0

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

0
По вопросам рекламы [email protected]