Welt
Welt

Reputation: 41

Reading file from .csv in c++

I am writing a program that takes input from the .csv file. The program run but the problem is it only returns the last line of the .csv file and skips all the other 9 lines. It also does not display the average and the grade. Please help me figure out what I am doing wrong.

The professor is very specific about using what we have learned so far and that is loops and functions. I can only use loops and functions so I am not allowed to use arrays.

Here's the scores.csv file

enter image description here

#include <iostream>
#include <fstream>

using namespace std;
int testScore1, testScore2, testScore3, testScore4, testScore5;
double avg;
char grade;

double getAvg(int testScore1, int testScore2, int testScore3, int testScore4, int testScore5){
    avg = (testScore1 + testScore2 + testScore3 + testScore4 + testScore5)/5;
    return avg;
}
char getGrade(double avg){
    if (avg >= 90){
        grade = 'A';
        cout << 'A' << endl;
    }else if (avg >= 80){
        grade = 'B';
        cout << 'B' << endl;
    }else if (avg >= 70){
        grade = 'C';
        cout << 'C' << endl;
    }else if (avg >= 60){
        grade = 'D';
        cout << 'D' << endl;
    }else{
        grade = 'F';
        cout << 'F' << endl;
    }
    return grade;
}

int main(){
    
    ifstream myFile;
    myFile.open("scores.csv");
    
    
    if(!myFile.is_open()){
        cout << "Error" << endl;
    }
    string testScore1, testScore2, testScore3, testScore4, testScore5;
    while (myFile.good()) {
        
        getline(myFile, testScore1, ',');
        getline(myFile, testScore2, ',');
        getline(myFile, testScore3, ',');
        getline(myFile, testScore4, ',');
        getline(myFile, testScore5, '\n');

    }
    
        cout<< setw(15) <<" Test scores"<<endl;
        cout<<"--------------------"<<endl;
        cout<< " 1   2   3   4   5   Avg  Grade"<<endl;
        cout<<"=== === === === === ===== ====="<<endl;
        cout<< " "<< testScore1<< "  "<< testScore2 << "  "<< testScore3 << "  "<< testScore4 << "  "<< testScore5<< "  " << getAvg << "  " << getGrade <<endl;


    return 0;
}

Upvotes: 1

Views: 312

Answers (2)

A M
A M

Reputation: 15277

An answer has been given already and accepted.

To be complete, I will show a refactored and working version your code.

I uses no arrays. Just loops and functions.

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

double getAvg(int testScore1, int testScore2, int testScore3, int testScore4, int testScore5){
    double avg = (testScore1 + testScore2 + testScore3 + testScore4 + testScore5)/5.0;
    return avg;
}
char getGrade(double avg){
    char grade = 'F';
    if (avg >= 90){
        grade = 'A';
    }else if (avg >= 80){
        grade = 'B';
    }else if (avg >= 70){
        grade = 'C';
    }else if (avg >= 60){
        grade = 'D';
    }
    return grade;
}

int main(){
    
    std::ifstream myFile("scores.csv");

    if(!myFile){
        std::cerr << "\nError: Could not open input file\n";
    }
    else {

        std::cout<< std::setw(15) <<" Test scores\n--------------------\n 1   2   3   4   5   Avg  Grade\n=== === === === === ===== =====\n";
       
        int testScore1, testScore2, testScore3, testScore4, testScore5;
        char comma1, comma2, comma3, comma4;
        
        // Read all values in one line, then next line, next line and so on
        while (myFile >> testScore1 >> comma1 >> testScore2 >> comma2 >> testScore3 >> comma3 >> testScore4 >> comma4 >> testScore5) {
            
            // Calculate
            double average = getAvg(testScore1, testScore2, testScore3, testScore4, testScore5);
            char grade = getGrade(average);
            std::cout<< " "<< testScore1<< "  "<< testScore2 << "  "<< testScore3 << "  "<< testScore4 << "  "<< testScore5<< "  " << average << "  " << grade << '\n';
        }
    }
    return 0;
}

Upvotes: 1

Gummysaur
Gummysaur

Reputation: 114

You print the values outside of the while loop, meaning you never save the previous values. Your program is essentially saying:
"Set t1 to test score row 0, col 0, set t2 to row 1, col 0, etc..."
The loop restarts, and now it goes:
"Set t1 to test score row 0, col 1, set t2 to row 1, col 1, etc..."
Do you see the problem? You overwrite the variables each time the loop runs, without saving them. The program then only prints the final line, because that's what the variables are when the loop ends.

You probably want to solve this by using a 2D array. Then, you can use a nested loop to set each spot to the corresponding value. Is that enough information to figure out the rest? If not let me know.

general idea:

new int[amount of rows][amount of cols] array;
for(int i = 0; i = amount of rows; i++)
for(int j=0; j=amount of cols; j++)
array[i][j] = getline code here
close loops.

Upvotes: 2

Related Questions