首页 > 解决方案 > 如何显示我输入到文本文件中的所有数据?

问题描述

以下是将学生的一些详细信息输入到文本文件中的代码,用户可以从主菜单中使用选项 2 显示它们。我的问题在于它应该显示所有“学生所学课程”的部分。当我选择显示所有数据时,“提到的部分使用the for loop仅显示我在写入文件时输入的最后一个值。如何让它显示我的所有条目?问题出在showdataanddisplaydata函数下。

    //Project on Student Management
#include<iostream>
#include<fstream>
#include<iomanip>
#include<stdlib.h>

using namespace std;

class Student
{
    int id;
    int year;
    char grade[50];
    float cgpa;
    int NumberOfcourses;
    char courseName[100];
    char academic_advisor[100];
    char status[100];
    
    public:
        void getData();
        void showData();
        int getID(){return id;}
}s;

void Student::getData()
{
    cout<<"\n\nEnter Student Details......\n";
    cout<<"Enter ID No.     : "; cin>>id;
    cout << "Enter Intake Year of the Student: "; cin >> year;
    cout << "Enter number of Taken courses: ";
    cin >> NumberOfcourses;
        for(int a=1; a<=s.NumberOfcourses; a++)
        {
            cout<<"\nEnter Subject Name: ";
            cin.ignore();
            cin.getline(courseName, 100);
            
            cout << "Enter Grade of Subject: ";
            cin >> grade;
            
            cout<<"\nEnter Subject Status: ";
            cin.ignore();
            cin.getline(status, 100);
            }
    cout << "Enter student CGPA: ";
    cin >> s.cgpa;
    cout << endl;
    cout << "Enter Name of Academic Advisor of Student: "; cin.ignore();
    cin.getline(s.academic_advisor, 100);
}

void Student::showData()
{
    cout << "\n\n.......Student Details......\n";
        cout << "ID No.                                   : " << id << endl;
        cout << "Intake Year                              : " << year << endl;
        cout << "Subjects Taken in Previous Semester      : " << endl;
        for(int t=1; t<=NumberOfcourses; t++)
        {
           cout << "\t" << courseName << ": " << grade << " ("<< status << ") ";
           cout << endl;
          }
        cout << "CGPA                                     : " << cgpa << endl;
        cout << "Name of academic advisor of Student      : " << academic_advisor << endl;
        cout << endl;
}


void addData()
{
    ofstream fout;
    fout.open("Students.txt", ios::out|ios::app);
    s.getData();
    fout.write((char*)&s,sizeof(s));
    fout.close();
    cout<<"\n\nData Successfully Saved to File....\n";
}


void displayData()
{
    ifstream fin;
    fin.open("Students.txt",ios::in);
    while(fin.read((char*)&s,sizeof(s)))
    {
        s.showData();
    }
    fin.close();
    cout<<"\n\nData Reading from File Successfully Done....\n";
}


void searchData()
{
    int n, flag=0;
    ifstream fin;
    fin.open("Students.txt",ios::in);
    cout<<"Enter ID Number you want to search for : ";
    cin>>n;
    
    while(fin.read((char*)&s,sizeof(s)))
    {
        if(n==s.getID())
        {
            cout<<"The Details of ID No. "<<n<<" are: \n";
            s.showData();
            flag++;
        }
    }
    fin.close();
    if(flag==0)
        cout<<"The ID No. "<<n<<" not found....\n\n";
    cout<<"\n\nData Reading from File Successfully Done....\n";
}

void deleteData()
{
    int n, flag=0;
    ifstream fin;
    ofstream fout,tout;

    fin.open("Students.txt",ios::in);
    fout.open("TempStud.txt",ios::out|ios::app);
    tout.open("TrashStud.txt",ios::out|ios::app);

    cout<<"Enter ID Number you want to delete : ";
    cin>>n;
    
    while(fin.read((char*)&s,sizeof(s)))
    {
        if(n==s.getID())
        {
            cout<<"The Following ID No. "<< n <<" has been deleted:\n";
            s.showData();
            tout.write((char*)&s,sizeof(s));
            flag++;
        }
        else
        {
            fout.write((char*)&s,sizeof(s));
        }
    }
    fout.close();
    tout.close();
    fin.close();
    if(flag==0)
        cout<<"The ID No. "<< n <<" not found....\n\n";
    remove("Students.dat");
    rename("tempStud.txt","Students.txt");
}


void modifyData()
{
    int n, flag=0, pos;
    fstream fio;

    fio.open("Students.txt", ios::in|ios::out);
    
    cout<<"Enter ID Number you want to Modify : ";
    cin>>n;
    
    while(fio.read((char*)&s,sizeof(s)))
    {
        pos=fio.tellg();
        if(n==s.getID())
        {
            cout<<"The Following ID No. "<<n<<" will be modified with new data:\n";
            s.showData();
            cout<<"\n\nNow Enter the New Details....\n";
            s.getData();
            fio.seekg(pos-sizeof(s));
            fio.write((char*)&s,sizeof(s));
            flag++;
        }
    }
    fio.close();
    
    if(flag==0)
        cout<<"The ID No. "<<n<<" not found....\n\n";
}

void project()
{
    int ch;
    do
    {
        system("cls");
        cout<<"...............STUDENT MANAGEMENT SYSTEM..............\n";
        cout<<"======================================================\n";
        cout<<"0. Exit from Program\n";
        cout<<"1. Write Data to File\n";
        cout<<"2. Read Data From File\n";
        cout<<"3. Search Data From File\n";
        cout<<"4. Delete Data From File\n";
        cout<<"5. Modify Data in File\n";
        cout<<"Enter your choice  : ";
        cin>>ch;
        system("cls");
        switch(ch)
        {
            case 1: addData(); break;
            case 2: displayData(); break;
            case 3: searchData(); break;
            case 4: deleteData(); break;
            case 5: modifyData(); break;
        }
        system("pause");
    }while(ch);
}

int main()
{
    project();
}

控制台显示有问题

标签: c++c++11

解决方案


您的Student班级只能保存一组课程信息。您的getData()循环一遍又一遍地覆盖相同的变量,这就是为什么您只看到最后一门课程的原因。您需要分配一个数组(或者更好的是使用 a std::vector)来为每个Student.

您的代码还有其他问题。

尝试更多类似的东西:

//Project on Student Management
#include <iostream>
#include <fstream>

using namespace std;

struct Course
{
    char courseName[100];
    char grade[50];
    char status[100];
};

class Student
{
    int id;
    int year;
    float cgpa;
    int NumberOfcourses;
    Course *courses;
    char academic_advisor[100];
    
public:
    Student();
    ~Student();

    void getData();
    void showData() const;
    int getID() const { return id; }

    friend ostream& operator<<(ostream &out, const Student &s);
    friend istream& operator>>(istream &in, Student &s);
};

ostream& operator<<(ostream &out, const Course &c)
{
    out.write(c.courseName, sizeof(c.courseName));
    out.write(c.grade, sizeof(c.grade));
    out.write(c.status, sizeof(c.status));
    return out;
}

istream& operator>>(istream &in, Course &c)
{
    in.read(c.courseName, sizeof(c.courseName));
    in.read(c.grade, sizeof(c.grade));
    in.read(c.status, sizeof(c.status));
    return in;
}

ostream& operator<<(ostream &out, const Student &s)
{
    out.write((char*)&s.id, sizeof(s.id));
    out.write((char*)&s.year, sizeof(s.year));
    out.write((char*)&s.cgpa, sizeof(s.cgpa));
    out.write(s.academic_advisor, sizeof(s.academic_advisor));
    out.write((char*)&s.NumberOfcourses, sizeof(s.NumberOfcourses));

    for(int i = 0; i < s.NumberOfcourses; ++i)
    {
        out << s.courses[i];
    }

    return out;
}

istream& operator>>(istream &in, Student &s)
{
    delete[] s.courses;
    s.courses = NULL;
    s.NumberOfcourses = 0;

    in.read((char*)&s.id, sizeof(s.id));
    in.read((char*)&s.year, sizeof(s.year));
    in.read((char*)&s.cgpa, sizeof(s.cgpa));
    in.read(s.academic_advisor, sizeof(s.academic_advisor));

    int NumberOfcourses;
    if (in.read((char*)&NumberOfcourses, sizeof(NumberOfcourses)))
    {
        s.courses = new Course[NumberOfcourses];

        for(int i = 0; i < NumberOfcourses; ++i)
        {
            if (in >> s.courses[i])
                s.NumberOfcourses++;
            else
                break;
        }
    }

    return in;
}

Student::Student()
{
    id = 0;
    year = 0;
    cgpa = 0.0f;
    NumberOfcourses = 0;
    courses = NULL;
    academic_advisor[0] = '\0';
}

Student::~Student()
{
    delete[] courses;
}

void Student::getData()
{
    cout << "\n\nEnter Student Details......\n";
    cout << "Enter ID No.     : "; cin >> id;
    cout << "Enter Intake Year of the Student: "; cin >> year;
    cout << "Enter number of Taken courses: ";
    cin >> NumberOfcourses;
    cin.ignore();

    delete[] courses;
    courses = new Course[NumberOfcourses];

    for(int a = 0; a < NumberOfcourses; ++a)
    {
        cout << "\nEnter Subject Name: ";
        cin.getline(courses[a].courseName, 100);
            
        cout << "Enter Grade of Subject: ";
        cin.getline(courses[a].grade, 50);
            
        cout << "\nEnter Subject Status: ";
        cin.getline(courses[a].status, 100);
    }

    cout << "Enter student CGPA: ";
    cin >> cgpa;
    cin.ignore();

    cout << endl;
    cout << "Enter Name of Academic Advisor of Student: ";
    cin.getline(academic_advisor, 100);
}

void Student::showData() const
{
    cout << "\n\n.......Student Details......\n";
    cout << "ID No.                                   : " << id << endl;
    cout << "Intake Year                              : " << year << endl;
    cout << "Subjects Taken in Previous Semester      : " << endl;
    for(int t = 0; t < NumberOfcourses; ++t)
    {
        cout << "\t" << courses[t].courseName << ": " << courses[t].grade << " (" << courses[t].status << ") ";
        cout << endl;
    }
    cout << "CGPA                                     : " << cgpa << endl;
    cout << "Name of academic advisor of Student      : " << academic_advisor << endl;
    cout << endl;
}

void addData()
{
    Student s;
    s.getData();

    ofstream fout("Students.txt", ios::binary|ios::app);
    if (fout << s)
        cout << "\n\nData Successfully Saved to File....\n";
    else
        cerr << "\n\nError Saving Data to File!\n";
}

void displayData()
{
    ifstream fin("Students.txt", ios::binary);

    Student s;
    while (fin >> s)
    {
        s.showData();
    }

    if (!fin)
        cerr << "\n\nError Reading Data from File!\n";
    else
        cout << "\n\nData Reading from File Successfully Done....\n";
}

void searchData()
{
    int n;
    cout << "Enter ID Number you want to search for : ";
    cin >> n;    

    ifstream fin("Students.txt", ios::binary);

    Student s;
    bool flag = false;

    while (fin >> s)
    {
        if (n == s.getID())
        {
            cout << "The Details of ID No. " << n << " are: \n";
            s.showData();
            flag = true;
            break;
        }
    }

    if (!fin)
    {
        cerr << "\n\nError Reading Data from File!\n";
    }
    else
    {
        if (!flag)
            cout << "The ID No. " << n << " not found....\n\n";

        cout << "\n\nData Reading from File Successfully Done....\n";
    }
}

void deleteData()
{
    int n;
    cout << "Enter ID Number you want to delete : ";
    cin >> n;
    
    ifstream fin("Students.txt", ios::binary);
    ofstream fout("TempStud.txt", ios::binary);
    ofstream tout("TrashStud.txt", ios::binary|ios::app);

    Student s;
    bool flag = false;

    while (fin >> s)
    {
        if (n == s.getID())
        {
            cout << "The Following ID No. " << n << " will be deleted:\n";
            s.showData();
            tout << s;
            flag = true;
        }
        else
        {
            fout << s;
        }
    }

    if (!fin)
    {
        cerr << "\n\nError Reading Data from File!\n";
    }
    else if (!fout)
    {
        cerr << "\n\nError Saving Data to File!\n";
    }
    else
    {
        fin.close();
        fout.close();

        if (!flag)
        {
            cout << "The ID No. " << n << " not found....\n\n";
            remove("tempStud.txt");
        }
        else
        {
            remove("Students.txt");
            rename("tempStud.txt", "Students.txt");

            cout << "\n\nData Successfully Deleted from File....\n";
        }
    }
}


void modifyData()
{
    int n;    
    cout << "Enter ID Number you want to Modify : ";
    cin >> n;
    
    ifstream fin("Students.txt", ios::binary);
    ofstream fout("TempStud.txt", ios::binary);

    Student s;
    bool flag = false;

    while (fin >> s)
    {
        if (n == s.getID())
        {
            cout << "The Following ID No. " << n << " will be modified with new data:\n";
            s.showData();
            cout << "\n\nNow Enter the New Details....\n";
            s.getData();
            flag = true;
        }

        fout << s;
    }
    
    if (!fin)
    {
        cerr << "\n\nError Reading Data from File!\n";
    }
    else if (!fout)
    {
        cerr << "\n\nError Saving Data to File!\n";
    }
    else
    {
        fin.close();
        fout.close();

        if (!flag)
        {
            cout << "The ID No. " << n << " not found....\n\n";
            remove("TempStud.txt");
        }
        else
        {
            remove("Students.txt");
            rename("TempStud.txt", "Students.txt");

            cout << "\n\nData Successfully Updated in File....\n";
        }
    }
}

void project()
{
    int ch;
    do
    {
        system("cls");
        cout << "...............STUDENT MANAGEMENT SYSTEM..............\n";
        cout << "======================================================\n";
        cout << "0. Exit from Program\n";
        cout << "1. Write Data to File\n";
        cout << "2. Read Data From File\n";
        cout << "3. Search Data From File\n";
        cout << "4. Delete Data From File\n";
        cout << "5. Modify Data in File\n";
        cout << "Enter your choice  : ";
        cin >> ch;
        system("cls");
        switch (ch)
        {
            case 1: addData(); break;
            case 2: displayData(); break;
            case 3: searchData(); break;
            case 4: deleteData(); break;
            case 5: modifyData(); break;
        }
        system("pause");
    }
    while (ch != 0);
}

int main()
{
    project();
}

或者:

//Project on Student Management
#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

struct Course
{
    string courseName;
    string grade;
    string status;
};

class Student
{
    int id;
    int year;
    float cgpa;
    vector<Course> courses;
    string academic_advisor;
    
public:
    Student();

    void getData();
    void showData() const;
    int getID() const { return id; }

    friend ostream& operator<<(ostream &out, const Student &s);
    friend istream& operator>>(istream &in, Student &s);
};

void writeStr(ostream &out, const string &str)
{
    size_t size = str.size();
    out.write((char*)&size, sizeof(size));
    if (size)
        out.write(str.c_str(), size);
}

void readStr(istream &in, string &str)
{
    str.clear();

    size_t size;
    if (in.read((char*)&size, sizeof(size)))
    {
        if (size > 0)
        {
            str.resize(size);
            in.read(&str[0], size);
        }
    }
}

ostream& operator<<(ostream &out, const Course &c)
{
    writeStr(out, c.courseName);
    writeStr(out, c.grade);
    writeStr(out, c.status);
    return out;
}

istream& operator>>(istream &in, Course &c)
{
    readStr(in, c.courseName);
    readStr(in, c.grade);
    readStr(in, c.status);
    return in;
}

ostream& operator<<(ostream &out, const Student &s)
{
    out.write((char*)&s.id, sizeof(s.id));
    out.write((char*)&s.year, sizeof(s.year));
    out.write((char*)&s.cgpa, sizeof(s.cgpa));
    writeStr(out, s.academic_advisor);

    size_t NumberOfcourses = s.courses.size();
    out.write((char*)&NumberOfcourses, sizeof(NumberOfcourses));

    for(int i = 0; i < NumberOfcourses; ++i)
    {
        if (!(out << s.courses[i]))
            break;
    }

    return out;
}

istream& operator>>(istream &in, Student &s)
{
    s.courses.clear();

    in.read((char*)&s.id, sizeof(s.id));
    in.read((char*)&s.year, sizeof(s.year));
    in.read((char*)&s.cgpa, sizeof(s.cgpa));
    readStr(in, s.academic_advisor);

    size_t NumberOfcourses;
    if (in.read((char*)&NumberOfcourses, sizeof(NumberOfcourses)))
    {
        s.courses.reserve(NumberOfcourses);
        Course c;

        for(size_t i = 0; i < NumberOfcourses; ++i)
        {
            if (in >> c)
                s.courses.push_back(c);
            else
                break;
        }
    }

    return in;
}

Student::Student()
{
    id = 0;
    year = 0;
    cgpa = 0.0f;
}

void Student::getData()
{
    courses.clear();

    cout << "\n\nEnter Student Details......\n";
    cout << "Enter ID No.     : "; cin >> id;
    cout << "Enter Intake Year of the Student: "; cin >> year;
    cout << "Enter number of Taken courses: ";

    size_t NumberOfcourses;
    cin >> NumberOfcourses;
    cin.ignore();

    courses.reserve(NumberOfcourses);
    Course c;

    for(int a = 0; a < NumberOfcourses; ++a)
    {
        cout << "\nEnter Subject Name: ";
        getline(cin, c.courseName);
            
        cout << "Enter Grade of Subject: ";
        getline(cin, c.grade);
            
        cout << "\nEnter Subject Status: ";
        getline(cin, c.status);

        s.courses.push_back(c);
    }

    cout << "Enter student CGPA: ";
    cin >> cgpa;
    cin.ignore();

    cout << endl;
    cout << "Enter Name of Academic Advisor of Student: ";
    getline(cin, academic_advisor);
}

void Student::showData() const
{
    cout << "\n\n.......Student Details......\n";
    cout << "ID No.                                   : " << id << endl;
    cout << "Intake Year                              : " << year << endl;
    cout << "Subjects Taken in Previous Semester      : " << endl;
    for(size_t t = 0; t < courses.size(); ++t)
    {
        cout << "\t" << courses[t].courseName << ": " << courses[t].grade << " (" << courses[t].status << ") ";
        cout << endl;
    }
    cout << "CGPA                                     : " << cgpa << endl;
    cout << "Name of academic advisor of Student      : " << academic_advisor << endl;
    cout << endl;
}

void addData()
{
    Student s;
    s.getData();

    ofstream fout("Students.txt", ios::binary|ios::app);
    if (fout << s)
        cout << "\n\nData Successfully Saved to File....\n";
    else
        cerr << "\n\nError Saving Data to File!\n";
}

void displayData()
{
    ifstream fin("Students.txt", ios::binary);

    Student s;
    while (fin >> s)
    {
        s.showData();
    }

    if (!fin)
        cerr << "\n\nError Reading Data from File!\n";
    else
        cout << "\n\nData Reading from File Successfully Done....\n";
}

void searchData()
{
    int n;
    cout << "Enter ID Number you want to search for : ";
    cin >> n;    

    ifstream fin("Students.txt", ios::binary);

    Student s;
    bool flag = false;

    while (fin >> s)
    {
        if (n == s.getID())
        {
            cout << "The Details of ID No. " << n << " are: \n";
            s.showData();
            flag = true;
            break;
        }
    }

    if (!fin)
    {
        cerr << "\n\nError Reading Data from File!\n";
    }
    else
    {
        if (!flag)
            cout << "The ID No. " << n << " not found....\n\n";

        cout << "\n\nData Reading from File Successfully Done....\n";
    }
}

void deleteData()
{
    int n;
    cout << "Enter ID Number you want to delete : ";
    cin >> n;
    
    ifstream fin("Students.txt", ios::binary);
    ofstream fout("TempStud.txt", ios::binary);
    ofstream tout("TrashStud.txt", ios::binary|ios::app);

    Student s;
    bool flag = false;

    while (fin >> s)
    {
        if (n == s.getID())
        {
            cout << "The Following ID No. " << n << " will be deleted:\n";
            s.showData();
            tout << s;
            flag = true;
        }
        else
        {
            fout << s;
        }
    }

    if (!fin)
    {
        cerr << "\n\nError Reading Data from File!\n";
    }
    else if (!fout)
    {
        cerr << "\n\nError Saving Data to File!\n";
    }
    else
    {
        fin.close();
        fout.close();

        if (!flag)
        {
            cout << "The ID No. " << n << " not found....\n\n";
            remove("tempStud.txt");
        }
        else
        {
            remove("Students.txt");
            rename("tempStud.txt", "Students.txt");

            cout << "\n\nData Successfully Deleted from File....\n";
        }
    }
}


void modifyData()
{
    int n;    
    cout << "Enter ID Number you want to Modify : ";
    cin >> n;
    
    ifstream fin("Students.txt", ios::binary);
    ofstream fout("TempStud.txt", ios::binary);

    Student s;
    bool flag = false;

    while (fin >> s)
    {
        if (n == s.getID())
        {
            cout << "The Following ID No. " << n << " will be modified with new data:\n";
            s.showData();
            cout << "\n\nNow Enter the New Details....\n";
            s.getData();
            flag = true;
        }

        fout << s;
    }
    
    if (!fin)
    {
        cerr << "\n\nError Reading Data from File!\n";
    }
    else if (!fout)
    {
        cerr << "\n\nError Saving Data to File!\n";
    }
    else
    {
        fin.close();
        fout.close();

        if (!flag)
        {
            cout << "The ID No. " << n << " not found....\n\n";
            remove("TempStud.txt");
        }
        else
        {
            remove("Students.txt");
            rename("TempStud.txt", "Students.txt");

            cout << "\n\nData Successfully Updated in File....\n";
        }
    }
}

void project()
{
    int ch;
    do
    {
        system("cls");
        cout << "...............STUDENT MANAGEMENT SYSTEM..............\n";
        cout << "======================================================\n";
        cout << "0. Exit from Program\n";
        cout << "1. Write Data to File\n";
        cout << "2. Read Data From File\n";
        cout << "3. Search Data From File\n";
        cout << "4. Delete Data From File\n";
        cout << "5. Modify Data in File\n";
        cout << "Enter your choice  : ";
        cin >> ch;
        system("cls");
        switch (ch)
        {
            case 1: addData(); break;
            case 2: displayData(); break;
            case 3: searchData(); break;
            case 4: deleteData(); break;
            case 5: modifyData(); break;
        }
        system("pause");
    }
    while (ch != 0);
}

int main()
{
    project();
}

推荐阅读