请在错误中检查代码,因为它在文件中写入了两次记录。我认为错误可能是由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 :(得分:0)
看来你没有声明student
的实例,所以你必须在调用它的方法之前这样做;
student s;
s.input();
顺便说一句,该代码似乎看起来似乎乍一看起作用
答案 1 :(得分:0)
我认为代码太少而无法发表任何声明。是学生的实例吗?你是否试图以这种方式将它转换为char数组?我认为你应该首先使用一些序列化。
顺便说一句。这是我所见过的最丑陋的格式 - 非常难以理解
答案 2 :(得分:0)
您必须先在函数中声明类student
的对象/实例,然后才能调用它。您错误地认为通过创建类并为其指定别名,您现在可以使用s.input
来调用它。您必须在student stu;
函数开头的s stu;
或void add()
中使用它的函数中声明它。
此外,由于您使用的是C ++,我强烈建议您使用getline
甚至fgets()
代替gets
,因为后者是C函数它也是折旧和不安全的。如果你这样做,我建议你看看Using Cin and Getline together。如果你不想把它搞得一团糟,那么处理换行符非常重要。
答案 3 :(得分:0)
谢谢你们,但我想出了答案。事情是在使用eof()函数时存在某种缓冲,这就是我得到重复结果的原因。