请检查代码是否有错误,因为它在文件中写入了两次记录。我认为错误可能是由于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();
顺便说一下,该代码乍一看似乎不起作用
我认为代码太少,无法给出任何声明。s 是学生实例吗?您是否尝试以这种方式将其转换为字符数组?我认为您应该首先使用一些序列化。
顺便说一句。这是我见过的最丑陋的格式 - 非常不可读
必须先在函数中声明类student
的对象/实例,然后才能调用它。您错误地假设通过创建类并为其提供别名,您现在可以使用 s.input
调用它。您必须在要使用的函数中声明它。 student stu;
或s stu;
在void add()
函数开始时。
另外,由于您使用的是C++,我强烈建议您使用getline
甚至fgets()
而不是gets
因为后者是 C 函数,并且使用起来也很旧且不安全。如果你这样做,我建议你看看一起使用Cin和Getline。如果您不想搞砸换行符,处理换行符非常重要。
谢谢大家,但我想出了答案。问题是在使用 eof() 函数时有某种缓冲区,这就是我得到重复结果的原因。