【问题标题】:Reading file from .csv in c++在 C++ 中从 .csv 读取文件
【发布时间】:2021-11-19 06:07:34
【问题描述】:

我正在编写一个从 .csv 文件获取输入的程序。程序运行,但问题是它只返回 .csv 文件的最后一行并跳过所有其他 9 行。 它也不显示平均值和等级。请帮我弄清楚我做错了什么。

教授非常具体地使用了我们迄今为止所学的知识,即循环和函数。我只能使用循环和函数,所以我不能使用数组。

这是 score.csv 文件

#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;
}

【问题讨论】:

  • 你能走到这一步真是太棒了。我没有看到任何 OCR 代码,甚至没有调用 png 阅读器。
  • @user4581301 我认为图像只是 CSV 文件的图形表示/示例。 CSV 文件实际上会直接包含77,73,65,55,73 等,因此不需要条形码或任何东西。
  • 您也没有将字符串转换为整数。 (完整程序示例:onlinegdb.com/uyPXXMy2z)
  • @AnthonyD973 没错。
  • @PKramer 这会让我的工作更轻松,但问题是我仅限于使用函数和循环。我不允许使用任何数组。

标签: c++ function read.csv


【解决方案1】:

答案已经给出并被接受。

为了完整起见,我将展示你的代码的重构和工作版本。

我不使用数组。只是循环和函数。

#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;
}

【讨论】:

  • 谢谢。这个简单的调整创造了奇迹。我很感激你
【解决方案2】:

您在 while 循环之外打印值,这意味着您永远不会保存以前的值。您的程序本质上是在说:
“将 t1 设置为测试分数第 0 行、第 0 列,将 t2 设置为第 1 行、第 0 列等……”
循环重新开始,现在开始:
“将 t1 设置为测试分数第 0 行、第 1 列,将 t2 设置为第 1 行、第 1 列等……”
你看到问题了吗?每次循环运行时都覆盖变量,而不保存它们。然后程序只打印最后一行,因为这是循环结束时的变量。

您可能想通过使用二维数组来解决这个问题。然后,您可以使用嵌套循环将每个点设置为相应的值。这些信息足以弄清楚其余部分吗?如果不告诉我。

总体思路:

new int[行数][列数]数组;
for(int i = 0; i = 行数; i++)
for(int j=0; j=列数; j++)
array[i][j] = 此处获取行代码
闭环。

【讨论】:

  • 谢谢。我已经弄清楚了循环一。但是,我只能使用函数来求解平均值和等级。
  • 当然,不需要额外的功能。你只是在做类似的事情: new int[amount of rows][amount of cols] array; for(int i = 0; i = 行数; i++) for(int j=0; j=amount of cols; j++) array[i][j] = getline code here close loops。抱歉,我有一段时间没有编写 C++,所以它是伪代码而不是真正的语法,但你应该明白这一点。啊,而且 cmets 不允许空格,所以这看起来很垃圾。让我编辑我的原始帖子。
  • 我明白了。问题是我不允许使用任何数组,因为该主题更进一步。
  • 我明白了。我会编辑你的主要帖子,限制你的任务。是否允许使用指针数组(例如 int**)?
  • 没有。据我所知,我们已经介绍了基础知识、循环和函数。数组是我们讨论的下一个主题。
猜你喜欢
  • 2013-05-03
  • 1970-01-01
  • 1970-01-01
  • 2020-06-11
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
相关资源
最近更新 更多