如何在C++中解析和显示包含字符串和数字条目的CSV文件? [重复]

问题描述 投票:0回答:1

我在 vscode 的终端中正确解析和显示 CSV 文件时遇到了问题。 学生姓名和卷号显示正确,但其余条目显示不正确。这背后的原因可能是什么? 此外,我的项目的下一部分是使用这些条目计算 GPA,程序将获取用户关于权重的输入并相应地应用公式。请帮助我如何才能实现这一目标。

我试过这个

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;

struct StudentRecord{
    public:
    StudentRecord(
        string studentnames,
        int rollnumbers,
        int mid,
        int final,
        int project
    ){
        StudentNames = studentnames;
        RollNumbers = rollnumbers;
        Mid = mid;
        Final = final;
        Project = project;
    }

    void displayInfo(){//method (function inside a struct)
        cout << "Student Name: " << StudentNames << endl;
        cout << "Roll Number: " << RollNumbers << endl;
        cout << "Mid: " << Mid << endl;
        cout << "Final: " << Final << endl;
        cout << "Project: " << Project << endl;
    }

    string StudentNames;
    int RollNumbers;
    int Mid;
    int Final;
    int Project;
};

void displayStudents(vector<StudentRecord>& students){
    for(auto student : students){
        student.displayInfo();
    }
}

int main(){
ifstream inputFile;
inputFile.open("C:\\Users\\hasan\\Desktop\\file_handling project\\NCA.csv");
string line = "";

vector<StudentRecord> students;

while(getline(inputFile, line)){
    stringstream inputString(line);

    string StudentNames;
    int RollNumbers;
    int Mid;
    int Final;
    int Project;
    string tempString;

    getline(inputString, StudentNames, ',');
    inputString >> RollNumbers;
    inputString >> Mid;
    inputString >> Final;
    inputString >> Project;

    StudentRecord student(StudentNames, RollNumbers,
     Mid, Final, Project);
students.push_back(student);
line = "";     
    
}

displayStudents(students);

return 0;
}

这似乎不起作用。除了学生姓名和卷号之外,它无法正确显示其余条目。

  • 这是从记事本读取的 csv 文件。
Student Names,Roll Numbers,Mid,Final,Project
,Total Out of,100,100,40
Muhammad Abdullah Khan,190536,65,54,29  
Abdullah Khan,210355,31,57,25  
Saram Rehman Qureshi,210764,80,59,1  
Hassam Ahsan,211216,97,44,22  
Safwan Sami,211243,30,86,16  
Huzaifa Munir Janjua,211264,42,37,6  
Muhammad Zeeshan Khan,212087,51,45,37  
Hamza Shoaib,212125,39,66,9  
Armaghan Hussain,221119,100,76,36  
Hira Nusrat,221123,82,55,1  
Areeba Gulzar,221125,77,54,14  
Rohma Binte Azeem,221127,80,70,33  
Sohail Zafar,221131,100,87,17  
Muhammad Majid Sajjad,221133,80,69,31  
Urwa Hassan,221135,100,93,30  
Humda Fatima,221137,83,34,19  
Shaheer Ahmad Sherazi,221139,83,39,1  
Abuzar Khan,221143,96,35,30  
Syed Muhammad Hamza,221145,72,31,16  
Abdul Rehman,221151,30,41,40  
Nimra Waheed,221153,59,92,28  
Talha Mehmood,221155,100,90,6  
Muhammad Obaidullah Aqil,221157,87,52,8  
Muhammad Nauman,221159,85,51,12  
Abdul Wasey,221161,79,47,27  
Syed Abdul Rafay,221165,78,49,34  
Maham Azam,221167,75,83,35  
Muhammad Abdur Rafay,221175,89,77,17  
Muhammad Haseeb Ullah,221179,73,41,22  
Huzaifa,221187,52,73,29  
Kehkshan Zafar,221195,81,68,30  
Hassan Siddique Malik,221199,40,88,16  
Muhammad Bilal,221203,34,43,13  
Muhammad Huzaifa Shahzad,221207,57,77,3  
Wasi Haider,221209,62,99,37  
Muhammad Waqar Ashraf,221213,67,38,18  
Sarim Badar,221605,44,79,16  
Tehreem Khan,221643,91,73,23  
Maher Shuja,221698,55,79,20  
Abdul Ahad,221725,56,52,19  
Taqi Faza,221752,35,41,27  
Ayesha Ansar,222584,96,88,34  
  • 这是我在终端中收到的输出,期望有相同的输出,但具有正确的条目。
Student Name: Student Names
Roll Number: 0
Mid: 0
Final: 212
Project: -1300236016       
Student Name: 
Roll Number: 0
Mid: 0
Final: 212
Project: -1300236016
Student Name: Muhammad Abdullah Khan
Roll Number: 190536
Mid: 0
Final: 212
Project: -1300236016
Student Name: Abdullah Khan
Roll Number: 210355
Mid: 0
Final: 212
Project: -1300236016
Student Name: Saram Rehman Qureshi
Roll Number: 210764
Mid: 0
Final: 212
Project: -1300236016
Student Name: Hassam Ahsan
Roll Number: 211216
Mid: 0
Final: 212
Project: -1300236016
Student Name: Safwan Sami
Roll Number: 211243
Mid: 0
Final: 212
Project: -1300236016
Student Name: Huzaifa Munir Janjua
Roll Number: 211264
Mid: 0
Final: 212
Project: -1300236016
Student Name: Muhammad Zeeshan Khan
Roll Number: 212087
Mid: 0
Final: 212
Project: -1300236016
Student Name: Hamza Shoaib
Roll Number: 212125
Mid: 0
Final: 212
Project: -1300236016
Student Name: Armaghan Hussain
Roll Number: 221119
Mid: 0
Final: 212
Project: -1300236016
Student Name: Hira Nusrat
Roll Number: 221123
Mid: 0
Final: 212
Project: -1300236016
Student Name: Areeba Gulzar
Roll Number: 221125
Mid: 0
Final: 212
Project: -1300236016
Student Name: Rohma Binte Azeem
Roll Number: 221127
Mid: 0
Final: 212
Project: -1300236016
Student Name: Sohail Zafar
Roll Number: 221131
Mid: 0
Final: 212
Project: -1300236016
Student Name: Muhammad Majid Sajjad
Roll Number: 221133
Mid: 0
Final: 212
Project: -1300236016
Student Name: Urwa Hassan
Roll Number: 221135
Mid: 0
Final: 212
Project: -1300236016
Student Name: Humda Fatima
Roll Number: 221137
Mid: 0
Final: 212
Project: -1300236016
Student Name: Shaheer Ahmad Sherazi
Roll Number: 221139
Mid: 0
Final: 212
Project: -1300236016
Student Name: Abuzar Khan
Roll Number: 221143
Mid: 0
Final: 212
Project: -1300236016
Student Name: Syed Muhammad Hamza
Roll Number: 221145
Mid: 0
Final: 212
Project: -1300236016
Student Name: Abdul Rehman
Roll Number: 221151
Mid: 0
Final: 212
Project: -1300236016
Student Name: Nimra Waheed
Roll Number: 221153
Mid: 0
Final: 212
Project: -1300236016
Student Name: Talha Mehmood
Roll Number: 221155
Mid: 0
Final: 212
Project: -1300236016
Student Name: Muhammad Obaidullah Aqil
Roll Number: 221157
Mid: 0
Final: 212
Project: -1300236016
Student Name: Muhammad Nauman
Roll Number: 221159
Mid: 0
Final: 212
Project: -1300236016
Student Name: Abdul Wasey
Roll Number: 221161
Mid: 0
Final: 212
Project: -1300236016
Student Name: Syed Abdul Rafay
Roll Number: 221165
Mid: 0
Final: 212
Project: -1300236016
Student Name: Maham Azam
Roll Number: 221167
Mid: 0
Final: 212
Project: -1300236016
Student Name: Muhammad Abdur Rafay
Roll Number: 221175
Mid: 0
Final: 212
Project: -1300236016
Student Name: Muhammad Haseeb Ullah
Roll Number: 221179
Mid: 0
Final: 212
Project: -1300236016
Student Name: Huzaifa
Roll Number: 221187
Mid: 0
Final: 212
Project: -1300236016
Student Name: Kehkshan Zafar
Roll Number: 221195
Mid: 0
Final: 212
Project: -1300236016
Student Name: Hassan Siddique Malik
Roll Number: 221199
Mid: 0
Final: 212
Project: -1300236016
Student Name: Muhammad Bilal
Roll Number: 221203
Mid: 0
Final: 212
Project: -1300236016
Student Name: Muhammad Huzaifa Shahzad
Roll Number: 221207
Mid: 0
Final: 212
Project: -1300236016
Student Name: Wasi Haider
Roll Number: 221209
Mid: 0
Final: 212
Project: -1300236016
Student Name: Muhammad Waqar Ashraf
Roll Number: 221213
Mid: 0
Final: 212
Project: -1300236016
Student Name: Sarim Badar
Roll Number: 221605
Mid: 0
Final: 212
Project: -1300236016
Student Name: Tehreem Khan
Roll Number: 221643
Mid: 0
Final: 212
Project: -1300236016
Student Name: Maher Shuja
Roll Number: 221698
Mid: 0
Final: 212
Project: -1300236016
Student Name: Abdul Ahad
Roll Number: 221725
Mid: 0
Final: 212
Project: -1300236016
Student Name: Taqi Faza
Roll Number: 221752
Mid: 0
Final: 212
Project: -1300236016
Student Name: Ayesha Ansar
Roll Number: 222584
Mid: 0
Final: 212
Project: -1300236016
c++ csv file-handling
1个回答
1
投票

学生姓名和卷号显示正确,但其余条目显示不正确。这背后的原因可能是什么?

RollNumbers
后面有一个逗号,表示你的程序没有读取。它保留在流中,并且是您尝试读取
Mid
(另一个
int
)时遇到的第一个字符。因此,
Mid
的提取失败,并且字符串流
inputString
被置于失败状态。之后,所有后续从
inputString
的提取都会失败,因为它处于失败状态。

幸运的是,有一个简单的解决方案。声明一个类型为

char
的虚拟变量,并用它来读取逗号。

        char c;
        inputString >> RollNumbers >> c;
        inputString >> Mid >> c;
        inputString >> Final >> c;
        inputString >> Project;  // No comma here!

我的项目的下一部分是使用这些条目计算 GPA,程序将获取用户关于权重的输入并相应地应用公式。

输入文件的前两行包含字段名称以及有关

Mid
Final
Project
的“满分”的信息。您需要在读取学生记录的循环之前阅读该内容。

数据文件似乎没有任何权重信息,所以从

std::cin

输入。

假设您的体重是:

double weightMid = 0.3; double weightFinal = 0.4; double weightProject = 0.3
请注意,这些加起来为 100%。这意味着最高的

score

(在下面计算)应该是100%。

进一步假设满分存储在这些变量中:

double perfectMid, perfectFinal, perfectProject;
您从文件中读取值。 (它们分别是 100、100 和 40。)

那么,给定学生的加权分数为:

double score = weightMid * Mid / perfectMid + weightFinal * Final / perfectFinal + weightProject * Project / perfectProject;
旁注

  1. Student::display_info

     应声明 
    const
    (在参数列表之后)。

  2. 函数

    displayStudents

    中的循环应该使用
    const&
    ,即它应该是:
    for (auto const& student : students)

  3. 鉴于有大量使用它的教科书,您可能会惊讶地发现专业程序员不在生产代码中使用

    using namespace std;

    。你也不应该。相反,专业人士每次需要引用标准库中的名称时只需键入 
    std::
     即可。有一些例外,主要围绕所谓的“参数依赖查找”,但这里没有足够的空间来讨论它们。 (
    提示: 经常使用 ADL 的std::swap 重载。)
    
        

© www.soinside.com 2019 - 2024. All rights reserved.