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

时间:2016-01-26 14:10:58

标签: c++ stream inputstream fileinputstream turbo-c++

请在错误中检查代码,因为它在文件中写入了两次记录。我认为错误可能是由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()
}

4 个答案:

答案 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()函数时存在某种缓冲,这就是我得到重复结果的原因。