结构学生记录计划

时间:2013-12-06 09:45:04

标签: c++

我在尝试从输入文件进行打印时遇到了一些麻烦,而且我的输出没有打印任何内容。我已经尝试循环打印整个文件,但我试图读取第一个名称,它仍然作为一个错误出现。 (关于平均和成绩信息的代码不完整)我一直在努力学习这个项目,这是我第一次使用结构。这是一个菜单程序,有很多选项,我无法完成我的项目,因为我有可怕的时间试图找出如何实际阅读列表。需要一些重大帮助!谢谢

这是我的代码:

#include <iostream>
#include <string>
#include<fstream>
#include <iomanip>
#define CAP 30
using namespace std ;

struct Student{
    string Course_Name,Course_Id, Course_Location;
    string  FirstName, LastName;
    float   Quiz, Test[6] ;
    int Id;

} ;

bool Open_File(ifstream &fin);
void Read_Student(Student Temp, ifstream & fin);
int Read_list(Student List[], int Max_Size);
void Print_List(Student List[], int Size);

int main()
{
    Student Temp;
    Student stu[CAP];
    int     Logical_Size = 0 ;
    Logical_Size = Read_list(stu,CAP);
    if (Logical_Size > 0 ){
        Print_List(stu,Logical_Size);
    }
    else
        cout << "Empty file\n\n";
    return 0 ;


}
void Read_Student(Student Temp , ifstream & fin){

    fin >>Temp.FirstName >> Temp.LastName;
    fin >> Temp.Id;
    fin >> Temp.Quiz;
    for (int i = 0 ; i < 6 ; i++)
        fin >> Temp.Test[6];
    fin.ignore(10,'\n');
}

int Read_list(Student List[], int Max_Size)
{

    Student Temp;
    ifstream fin;
    int     i = 0;

    if (Open_File(fin))
    {

        getline(fin, List[i].Course_Name);
        getline(fin, List[i].Course_Id);
        getline(fin, List[i].Course_Location);
        Read_Student(List[i],fin);
        while(!fin.eof())
        {
            i++ ;
            if (i == Max_Size){
                cout << "\nArray is full.\n" ;
                break;
            }
        }
        Read_Student(List[i],fin);
    }
    else
    {
        cout <<"\nBad file. Did not open. Program terminated.\n";
        exit(0);
    }
    return (i);
}


void Print_List(Student List[], int Size){
    Student Temp;
    int i = 0;
    cout << "Course Name: " << List[i].Course_Name << endl;
    cout << "Course ID:  " << List[i].Course_Id << endl;
    cout << "Course Location: " << List[i].Course_Location << endl;

    cout <<left << fixed << setprecision(2) <<showpoint <<endl <<endl ;
    cout << setw(20) << "\nName" << setw(20) << "ID" << setw(25) << "Average" << setw(20)
    << "Grade" << endl;
    cout << "===========================================================================" << endl;


        cout << setw(19) << List[i].LastName +", "+ List[i].FirstName << setw(20) << List[i].Id << setw(20) ;



}
bool Open_File(ifstream &fin)
{
    string    File_Name;
    cout <<"Enter file name: ";
    getline(cin, File_Name);
    fin.open(File_Name.c_str());
    if(fin.fail())
        return false ;
    else
        return true ;
}

示例输入文件:

Intro To Computer C++
SAL 343
JHG 344
John Adams
111223333 100 87 93 90 90 89 91 
Willy Smith Jr.
222114444 90 73 67 77 70 80 90 
Phil Jordan
777886666 100 80 70 -50 60 90 100

2 个答案:

答案 0 :(得分:1)

你有一些问题,我会先从一个问题开始,然后继续努力。这里...

for (int i = 0 ; i < 6 ; i++)
    fin >> Temp.Test[6];

...你总是在数组的第七个元素(从零开始)上运行,但这并不好,你知道b / c你已经将这个事实用作for控件。你需要的是Temp.Test[i]。但这并不是全部,因为你没有通过Temp作为参考,所以你做了所有的努力工作,因为变化不会持续。你需要的是void Read_Student(Student &Temp , ifstream &fin)

除非我错过了这个......

while(!fin.eof())
{
    i++ ;
    if (i == Max_Size){
        cout << "\nArray is full.\n" ;
        break;
    }
}
Read_Student(List[i],fin);

......似乎并没有按照你的意愿行事。它基本上递增i直到它到达MAX_SIZE,中断然后尝试读取超出边界的元素。我确定你打算根据你的示例文件阅读其他学生,直到达到eof,但你可以看到你真的只读了一个。你可能意味着里面while

在阅读这些学生方面,我同意另一个答案,建议删除你的ignore()。可能有一种更好的方式来处理它,比如只是读一行并解析它,当然是恕我直言

你也可以参加Course课程。您设计struct的方式,每个学生都有所有课程信息,但您只提取一次,因为它只在文件中提取一次。

我知道你问到了打印问题,在这些问题得到解决之前我无论如何都无法解决这个问题。

答案 1 :(得分:0)

删除这行代码以查看它是否已修复,

fin.ignore(10,'\n');

而且,您提供的输入存在一个问题。此行中有一个冗余字符串,

Willy Smith Jr.

这将导致后续cin读数出错。