Нужно добавить значения разделенных запятыми в текстовом файле к членам структуры - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть текстовый файл с двумя значениями, именем и оценкой.У меня есть студенческая структура, которая имеет 4 члена, которые показаны ниже.

Я ищу, чтобы добавить значения в текстовом файле к соответствующим членам в структуре, разделяющей запятую.

Первые пять строк файла student.txt;

Nubia,Dufrene,70
Louisa,Trippe,49
Aline,Deniz,34
Shery,Munk,63
Angila,Ping,89

Мой текущий код;

struct studentType {
    string studentFName;
    string studentLName;
    int testScore;
    char grade;
};


int main()
{
    vector<studentType> studentVector;
    studentType student;


    ifstream inFile("students.txt");

    while (getline(inFile, student.studentFName, ',' )) {
        cout << student.studentFName << endl;
    }



        printStudents(studentVector);
}


void printStudents(vector<studentType>& passedVect) {

    for (studentType element : passedVect) {
        cout << element.studentFName << " " << element.studentLName << "\tGrade: " << element.testScore << " (" << element.grade << ")" << endl;
    }

}

Исправление Я заменилцикл while с циклом for.Мне также пришлось изменить структуру с int на строку, чтобы она работала с getline.Простая функция convertString использует std :: stoi для преобразования его обратно в int, как планировалось изначально.


int main()
{
    vector<studentType> studentVector;


    studentType student;

    ifstream inFile("students.txt");

    for (studentType i;
        getline(inFile, i.studentFName, ',')
        && getline(inFile, i.studentLName, ',')
        && getline(inFile, i.testScore)
        ; ) 
    {

        int testScore = convertString(i.testScore);
        i.grade = assignGrade(testScore);

        studentVector.push_back(i);
    }
    printStudents(studentVector);
}


int convertString(string number) {

    return stoi(number);
}

Вывод

Struct Exercises!
Nubia Dufrene           Grade: 70 (B)
Louisa Trippe           Grade: 49 (D)
Aline Deniz             Grade: 34 (F)
Shery Munk              Grade: 63 (C)
Angila Ping             Grade: 89 (A)
Laila Hollmann          Grade: 10 (F)
Sherrill Piller         Grade: 47 (D)
Minna Dimitri           Grade: 26 (F)
Song Kornreich          Grade: 97 (A)
Frank Dammann           Grade: 36 (F)
Isaac Abee              Grade: 24 (F)
Tiffaney Lukach         Grade: 75 (B)
Carmelina Sink          Grade: 85 (A)
Matthew Benes           Grade: 34 (F)
Fleter Aichele          Grade: 78 (B)
Sergio Ewan             Grade: 56 (C)
Izetta Armes            Grade: 42 (D)
Olen Tee                Grade: 89 (A)
Leona Mozee             Grade: 54 (D)
Britta Pegrast          Grade: 34 (F)

Еще раз спасибо!

Ответы [ 2 ]

0 голосов
/ 02 апреля 2019
struct studentType {
    string studentFName;
    string studentLName;
    string testScore;
    char grade;
};

void printStudents(vector<studentType>& passedVect );

int main()
{
    vector<studentType> studentVector;
    studentType student;


    ifstream inFile("students.txt");

    while (getline(inFile, student.studentFName, ',' ) 
        && getline(inFile, student.studentLName, ',') 
        && getline(inFile, student.testScore) ) {
        cout << student.studentFName << " " 
             << student.studentLName << " " 
             << student.testScore << endl;
    }
}

Я просто констатировал их и изменил testScore на строку

0 голосов
/ 02 апреля 2019

Вы можете использовать std::stringstream, чтобы сначала сохранить каждую строку, а затем использовать ту же стратегию

getline(inFile, student.studentFName, ',' )

кроме теперь в потоке строки, чтобы заполнить 3 переменные. Теперь, когда ученик заполнен, вы можете push_back ввести его в vector, а затем вызвать функцию printStudents.

Я удалил using namespace std;, так как это плохая практика (вы можете прочитать здесь почему). Вы также не указали grade в своем текстовом файле, поэтому я удалил эту часть при печати студентов.

#include <string>
#include <fstream>
#include <iostream>
#include <vector>
#include <sstream> //std::stringstream


struct studentType {
    std::string studentFName;
    std::string studentLName;
    int testScore;
    char grade;
};

void printStudents(const std::vector<studentType>& passedVect) { //also: const&!

    for (studentType element : passedVect) {
        std::cout << element.studentFName << " " << element.studentLName << "\tScore: " << element.testScore << '\n';
    }

}

int main() {
    std::vector<studentType> studentVector;
    studentType student;


    std::ifstream inFile("students.txt");
    if (!inFile.good()) {
        std::cerr << "couldn't find student.txt file\n";
        return -1;
    }

    std::string line;

    while (std::getline(inFile, line)) {
        std::stringstream stream(line);

        std::getline(stream, student.studentFName, ','); //get first name
        std::getline(stream, student.studentLName, ','); //get last name

        std::string score_str; //since testScore is an int, first save it as a string
        std::getline(stream, score_str, ',');
        student.testScore = std::stoi(score_str); //convert string to int

        studentVector.push_back(student); //push it into vector
    }

    printStudents(studentVector);
}

выход: * * тысяча двадцать-один

Nubia Dufrene   Score: 70
Louisa Trippe   Score: 49
Aline Deniz     Score: 34
Shery Munk      Score: 63
Angila Ping     Score: 89
...