程序写入记录在 C++ 的二进制文件中两次

Program writing record twice in a binary file in c++

本文关键字:两次 二进制文件 记录 C++ 程序      更新时间:2023-10-16

请检查代码是否有错误,因为它在文件中写入了两次记录。我认为错误可能是由于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() 函数时有某种缓冲区,这就是我得到重复结果的原因。