Пожалуйста, проверьте код на наличие ошибок, так как он дважды записывает запись в файл. Я думаю, что ошибка может быть из-за 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()
}
Похоже, вы не объявили экземпляр student
, так что вы должны сделать это перед вызовом его методов;
student s;
s.input();
Кстати, этот код не выглядит так, как будто он работает на первый взгляд
Я думаю, что слишком мало кода, чтобы дать какое-либо утверждение. Это студенческий экземпляр? Вы пытаетесь преобразовать его в массив символов таким образом? Я думаю, что вы должны сначала использовать сериализацию.
КСТАТИ. Это самое уродливое форматирование, которое я когда-либо видел — довольно нечитаемое
Вы должны объявить объект / экземпляр класса student
в функции, прежде чем вы можете вызвать его. Вы неправильно предполагаете, что, создав класс и присвоив ему псевдоним, теперь вы можете вызывать его с помощью s.input
, Вы должен объявите это в функции, в которой вы собираетесь использовать его. student stu;
или же s stu;
в начале void add()
функция.
Кроме того, поскольку вы используете C ++, я настоятельно рекомендую вам использовать getline
или даже fgets()
вместо gets
поскольку последняя является функцией C, она также является устаревшей и небезопасной для использования. Если вы это сделаете, я бы посоветовал взглянуть на Использование Cin и Getline вместе. Обработка символа новой строки очень важна, если вы не хотите испортить это.
Спасибо, ребята, но я разобрался с ответом. Дело в том, что при использовании функции eof () существует какой-то буфер, поэтому я получаю повторяющиеся результаты.