【问题标题】:Getting the same output twice when reading a file读取文件时两次获得相同的输出
【发布时间】:2015-01-28 04:45:07
【问题描述】:

以下程序有问题,

#include<iostream>
#include<fstream>
#include<windows.h>

using namespace std;

class student
{
    int rollno;
    char name[50];
    int cls;
    int marks;
    char grade;
public:
    void getdata()
    {
        cout<<"Enter Roll No.: ";
        cin>>rollno;
        cout<<"Enter Name: ";
        cin>>name;
        cout<<"Enter Class: ";
        cin>>cls;
        cout<<"Enter Marks: ";
        cin>>marks;
        if(marks>=75)
        {
            grade='A';
        }
        if(marks>=60 && marks<75)
        {
            grade='B';
        }
        if(marks>=45 && marks<60)
        {
            grade='C';
        }
        if(marks>=35 && marks<45)
        {
            grade='D';
        }
        if(marks<35)
        {
            grade='F';
        }
    }

    void display()
    {
        cout<<"\nRoll No.: "<<rollno;
        cout<<"\nName: "<<name;
        cout<<"\nClass: "<<cls;
        cout<<"\nMarks: "<<marks;
        cout<<"\nGrade: "<<grade<<endl;
    }

    int rno()
    {
        return rollno;
    }
} s1, s2, s3;

void append()
{
    fstream fo ("STUDENT.DAT",ios::binary | ios::app | ios::out);
    if(!fo)
    {
        cout<<"CANNOT OPEN FILE!!!!!";
    }

    else
    {
        s1.getdata();
        fo.write((char*)&s1, sizeof(s1));
    }
    fo.close();

}

void sdisplay()
{
    fstream fi ("STUDENT.DAT",ios::binary | ios::in);
    if(!fi)
    {
        cout<<"\nNO RECORDS !!!!";

    }
    else
    {

        while(!fi.eof())
        {
            fi.read((char*)&s2, sizeof(s2));
            if(s2.rno()!='\0')
            {
                s2.display();
            }
        }
    }
    fi.close();
}

void rdisplay()
{
    int n, found;
    fstream fi ("STUDENT.DAT", ios::in | ios::binary);
    if(!fi)
    {
        cout<<"\nNO RECORDS !!!!";
    }

    else
    {
        cout<<"\nEnter Roll No. to be displayed: ";
        cin>>n;
        while(!fi.eof())
        {
            fi.read((char*)&s3, sizeof(s3));
            if(s3.rno()==n)
            {
                s3.display();
                found=1;
            }
        }
        if(found!=1)
        {
            cout<<"\nCannot find roll no!!";
        }
    }
    fi.close();
}

int main()
{
    char ch='y';
    int choice, n;

    while(ch=='y' || ch=='Y')
    {
        cout<<"\n1. Append Data to File";
        cout<<"\n2. Display Entire File";
        cout<<"\n3. Search & Display record based on Roll No.";
        cout<<"\n4. Exit";
        cout<<"\n\n Enter your choice (1-4): ";
        cin>>choice;
        switch(choice)
        {
        case 1:
            append();
            break;

        case 2:
            sdisplay();
            break;

        case 3:
            rdisplay();
            break;
        case 4:
            exit(0);
            break;

        default:
            cout<<"\nWrong Choice !!!!!";
            break;
        }
        cout<<"\n\nDo you want to continue? (Y/N)";
        cin>>ch;
    }
}

所以,在附加数据之后,当我转到显示数据(选项 2 和 3)时,它会输出相同的条目两次。

  1. 将数据附加到文件
  2. 显示整个文件
  3. 根据卷号搜索和显示记录
  4. 退出

    输入您的选择(1-4):2

没有记录!!!!

您要继续吗? (Y/N)y

  1. 将数据附加到文件
  2. 显示整个文件
  3. 根据卷号搜索和显示记录
  4. 退出

    输入您的选择 (1-4):1 输入卷号:23 输入姓名:James Enter 等级:12 输入分数:85

您要继续吗? (Y/N)y

  1. 将数据附加到文件
  2. 显示整个文件
  3. 根据卷号搜索和显示记录
  4. 退出

    输入您的选择(1-4):2

卷号:23 姓名:James 班级:12 分数:85 成绩:A

卷号:23 姓名:James 班级:12 分数:85 成绩:A

您要继续吗? (是/否)n

进程返回 0 (0x0) 执行时间:25.013 s 按任意键 继续。

有人可以帮助我吗? 谢谢

【问题讨论】:

    标签: c++ class fstream


    【解决方案1】:

    eof() 直到你读完结尾才会被设置,直到你第二次阅读才会发生。该读取不会执行任何操作,因此它不会覆盖 s2,它只会失败 - 所以您最终会再次打印该行。

    解决方案是不要循环 eof()。只需循环 read():

    while(fi.read((char*)&s2, sizeof(s2)))
    {
        s2.display();
    }
    

    【讨论】:

    • 谢谢老哥,成功了。它是为了我的考试而来的,我对 eof() 并不了解。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    • 2021-06-04
    • 1970-01-01
    相关资源
    最近更新 更多