I am having a problem with readin input data, my program is reading the last name in my .txt document twice and inserting it into each one of my functions an extra time. here is the out put

Enter the name of the .txt file that you want to open for input.
Do not put spaces in the file name : lab10data1.txt

**Input file lab10data1.txt is open for reading.

Number of student records read = 17

The following student(s) have the highest score

 Einstein, Albert
List of All the Students in the class

 Student Name          Test Score     Grade
 ------------------------------------------
 Fibonacci, Leonardo        63         D
      Huffman, David        79         C
        Augusta, Ada        91         A
 Goldbach, Christian        81         B
          Venn, John       100         A
      Church, Alonzo        72         C
    Einstein, Albert       105         F
      Fermat, Pierre        84         B
     Kruskal, Joseph        66         D
       Cantor, Georg        67         D
        Turing, Alan        85         B
      Chebysheva, PL       100         A
  DeMorgan, Augustus        79         C
   Karnaugh, Maurice        72         C
    Babbage, Charles        98         A
       Hooper, Grace        95         A
       Hooper, Grace        95         A // RIGHT HERE it reads grace twice for some reason


Please hit the enter key to continue...

here is the actual code

#include<iostream>
#include<fstream>
#include<string>
#include<iomanip>


using namespace std;

struct StudentType
{
    string studentName;
    int testScore;//Between 0 and 100
    char grade;
};

void PrintNameHeader(ostream& out);
bool OpenInputFile(ifstream& inFile, string& infilename ); //OPEN input file
void Pause();// Pause
void ReadStudentData(ifstream& infile, StudentType student[], int& );// Read student infp including first and last name and test score
void AssignGrades(StudentType student[], int);//assign grades to each student
int HighestScore(const StudentType student[], int );//Get the highest scores
void PrintNamesWithHighestScore(const StudentType student[], int);//Print name/s with highest Scores
void DisplayAllStudents(const StudentType student[], int);//Display all students
void GetLowHighRangeValues(const StudentType student[], int, int& , int&);//for example a student types 50 100 , it will get all students within that range
void DisplayStudentsInRange(const StudentType student[], int, int, int);// display students in that range
void SortStudentsByName(StudentType student[], int);// sort students by name
void SortStudentsByScore(StudentType student[], int);// sort students by test score highest to lowest
void FormatNameScoreGrade(ostream& out);


const int NUM_STUDENTS = 20;

int main()
{
    ifstream infile;
    string inFilename;
    StudentType student[NUM_STUDENTS];
    int numStudents = 0;

    PrintNameHeader(cout);

    if(!OpenInputFile(infile,inFilename)) return 1;

    ReadStudentData(infile, student, numStudents);
    infile.close();

    AssignGrades(student, numStudents);

    PrintNamesWithHighestScore(student, numStudents);

    cout <<"List of All the Students in the class" << endl;
    DisplayAllStudents(student, numStudents);

    Pause();//Pause

    int lownum, highnum;
    char answer;

    do {

    GetLowHighRangeValues(student, numStudents, lownum, highnum);

    DisplayStudentsInRange(student, numStudents, 70, 90);
    cout <<"Do you want to see another range of scores [y/n]?";
    cin >> answer;
    } while( answer == 'y' || answer == 'Y');

    SortStudentsByName(student, numStudents);
    Pause();//Pause

    SortStudentsByScore(student, numStudents);

    return 0;
}

//Function definitions

void PrintNameHeader(ostream& out)
{
    //Display name header on screen
    out <<"My name" << endl;

}

void FormatNameScoreGrade(ostream& out)
{
    out  << setw(10) << " Student Name" << setw(20) <<"Test Score" << setw(10) <<"Grade" << endl;
    out <<" ------------------------------------------" << endl;
}

bool OpenInputFile(ifstream& inFile, string& infilename) 
{
    cout << "Enter the name of the .txt file that you want to open for input.\n";
    cout << "Do not put spaces in the file name : ";
    cin >> infilename;
    cout << endl;

    inFile.open(infilename.c_str());
    if (inFile.fail())
    {
        cout << "Sorry, the input file " << infilename <<" was not found"<< endl;\
            return false;
    }

    cout << "Input file " << infilename << " is open for reading.\n\n";
    return true;
}

void Pause()
{
    cout << endl;
    cin.ignore(80, '\n');
    cout<<"Please hit the enter key to continue...\n";
    cin.get();
}

void ReadStudentData(ifstream& infile, StudentType student[], int& numStudents)
{
    string firstName, lastName, testScore;
    int count = 0;

    while(!infile.eof())
    {
        infile >> firstName >> lastName >> testScore;
        student[count].studentName = lastName + ", " + firstName;
        student[count].testScore = atoi(testScore.c_str());
        count++;
    }

    numStudents = count;
    cout << "Number of student records read = " << numStudents << endl;
}

void AssignGrades(StudentType student[], int numStudents)
{

    int testscore;
    char grade;

    for(int i = 0; i < numStudents; i++)
    {
        testscore = student[i].testScore;

        if(testscore >= 90 && testscore <=100)
            grade = 'A';
        else if(testscore >= 80 && testscore <90)
            grade = 'B';
        else if(testscore >= 70 && testscore <80)
            grade = 'C';
        else if(testscore >= 60 && testscore <70)
            grade = 'D';
        else
            grade = 'F';

        student[i].grade = grade;
    }
}

int HighestScore(const StudentType student[], int numStudents)
{
    int highest = student[0].testScore;

    for(int i = 1; i < numStudents; i++)
    {
        if(highest < student[i].testScore) highest = student[i].testScore;
    }

    return highest;
}

void PrintNamesWithHighestScore(const StudentType student[], int numStudents)
{
    int highest = HighestScore(student, numStudents);
    cout << endl << "The following student(s) have the highest score" << endl << endl;
    for(int i = 0; i < numStudents; i++)
    {
        if (student[i].testScore == highest)
        {
            cout << " " << student[i].studentName;
        }
    }

    cout << endl;
}

void DisplayAllStudents(const StudentType student[], int numStudents)
{
    cout << endl;

    FormatNameScoreGrade(cout);

    for(int i = 0; i < numStudents; i++)
    {

        cout << setw(20) << student[i].studentName << setw(10) << student[i].testScore << setw(10) << student[i].grade << endl;
    }

    cout << endl;
}

void GetLowHighRangeValues(const StudentType student[], int numStudents, int& lowRange, int& highRange)
{
    int lowest = student[0].testScore;

    for(int i = 1; i < numStudents; i++)
    {
        if(lowest > student[i].testScore) lowest = student[i].testScore;
    }

    lowRange = lowest;
    highRange = HighestScore(student, numStudents);
}

void DisplayStudentsInRange(const StudentType student[], int numStudents, int lownum, int highnum)
{
    cout <<"Enter two vales for the range of scores you want to look at: ";
    cin >> lownum >> highnum;






    cout << endl << "List of students with scores in the range " << lownum << " to " << highnum << endl << endl;
    FormatNameScoreGrade(cout);


    for(int i = 0; i < numStudents; i++)
    {
        if(student[i].testScore >= lownum && student[i].testScore <= highnum)
        {

            cout << setw(20) << student[i].studentName << setw(10) << student[i].testScore << setw(10) << student[i].grade << endl;
        }
    }
    cout << endl;
}

void SortStudentsByName(StudentType student[], int numStudents)
{
    StudentType temp;

    for(int i = 0;i < numStudents - 1;i++)
    {
        for(int j = i + 1; j < numStudents;j++)
        {
            if(student[i].studentName > student[j].studentName)
            {
                temp = student[i];
                student[i] = student[j];
                student[j] = temp;
            }
        }
    }

    cout << endl;
    cout << "List of Students sorted by Name" << endl;
    DisplayAllStudents(student, numStudents);
}

void SortStudentsByScore(StudentType student[], int numStudents)
{
    StudentType temp;

    for(int i = 0;i < numStudents - 1;i++)
    {
        for(int j = i + 1; j < numStudents;j++)
        {
            if(student[i].testScore < student[j].testScore)
            {
                temp = student[i];
                student[i] = student[j];
                student[j] = temp;
            }
        }
    }

    cout <<"List of Students sorted by Score" << endl;
    DisplayAllStudents(student, numStudents);
}

thanks for looking!

Recommended Answers

All 4 Replies

Make sure you did not put a new line in the lab10data1.txt after the last entry. Like this:

Babbage, Charles 98 A
Hooper, Grace 95 A/do not press enter here/

Hope that helps :)

this is the text file i am reading

    Leonardo Fibonacci   63
    David Huffman        79
    Ada Augusta          91
    Christian Goldbach   81
    John Venn           100
    Alonzo Church        72
    Albert Einstein     105
    Pierre Fermat        84
    Joseph Kruskal       66
    Georg Cantor         67
    Alan Turing          85
    PL Chebysheva       100
    Augustus DeMorgan    79
    Maurice Karnaugh     72
    Charles Babbage      98
    Grace Hooper         95

Ok so I tested your code with the text file above and worked fine for me when after "Grace Hooper 95" has no new line(pressing enter key). So make sure in your text file there is no new line after the last entry which is Grace Hooper 95

The text file should be like this at the end:

    Leonardo Fibonacci   63
    David Huffman        79
    Ada Augusta          91
    Christian Goldbach   81
    John Venn           100
    Alonzo Church        72
    Albert Einstein     105
    Pierre Fermat        84
    Joseph Kruskal       66
    Georg Cantor         67
    Alan Turing          85
    PL Chebysheva       100
    Augustus DeMorgan    79
    Maurice Karnaugh     72
    Charles Babbage      98
    Grace Hooper         95/*Stop here. Do not press enter key.In other words cursor should end there.*/
    /*No new line*/
Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.