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

pgccezyw  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(96)

这个问题已经有答案了

How can I read and parse CSV files in C++?(39个回答)
7天前关闭
我在vscode的终端中正确解析和显示CSV文件时遇到了问题。学生姓名和卷号显示正确,但其余条目显示不正确。这背后的原因可能是什么?此外,我的项目的下一部分是使用这些条目计算GPA,该程序将采取从用户输入有关的重量和应用相应的公式。2请帮助我如何能够实现这一点。
我尝试了这个

#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

11dmarpk

11dmarpk1#

学生姓名和卷号显示正确,但其余的参赛作品却显示不正确。这背后的原因可能是什么?
RollNumbers后面有一个逗号,您的程序没有阅读它。它保留在流中,并且是您尝试读取Mid时遇到的第一个字符(另一个int)。因此,Mid的提取失败,并且字符串流inputString被置于失败状态。之后,从inputString的所有后续提取都失败,因为它处于失败状态。
幸运的是,有一个简单的解决方案:解密一个char类型的伪变量,并使用它来读取逗号。

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

字符串

加权得分

我的项目的下一部分是计算GPA使用这些条目,该程序将采取从用户输入有关的权重和应用相应的公式.请帮助我如何能够实现这一点.
输入文件的前两行包含字段名和MidFinalProject的“完美分数”信息。您需要在读取学生记录的循环之前读取该字段。
数据文件似乎没有任何加权信息,因此提示用户从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.在结构StudentRecord中,成员函数display_info应该声明为const(在参数列表之后)。
1.函数displayStudents中的循环应该使用const&,即应该是:for (auto const& student : students)
1.考虑将字段RollNumbersint更改为std::string。作为字符串,您不会丢失字段开头的前导零(如果有的话)。
1.使用final作为参数名并没有什么错。但是,您应该注意,“final是一个标识符,在成员函数声明或类头中使用时具有特殊含义。在其他上下文中,它不是保留的,可以用于命名对象和函数。”- CppReference
1.考虑到大量的教科书使用using namespace std;,你可能会惊讶地发现,专业程序员在生产代码中不使用using namespace std;。你也不应该。相反,专业人员每次需要引用标准库中的名称时只需键入std::。有一些例外,主要围绕着所谓的 * 参数依赖查找 ,但是这里没有足够的空间来介绍它们。( 提示:* std::swap的重载经常使用ADL。)

相关问题