Как прочитать две строки и массив чисел из файла и сохранить их в векторе объектов - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть простая структура в моем коде для чтения значений из текстового файла. эта структура

struct read_data_into_file{
std::string Fname,Lname;
double score[5];
double sum;
};

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

void ReadFromFile(){
std::ifstream f;
read_data_into_file Newobj;
std::vector<read_data_into_file> obj;
f.open("/Users/vibhorsagar/Desktop/cslabs/cs-116lab1/cs-116lab1/input.txt");
if(!f.is_open())
{
    std::cout<<"error opening file";

}
else{
    while(!f.eof())
    {
        f>>Newobj.Fname>>Newobj.Lname;
        for(count=0;count<5;count++)
        {
        f>>Newobj.score[count];
            Newobj.sum+=Newobj.score[count];
        }
        obj.push_back(Newobj);
    }
        for(int i=0;i<obj.size();i++){
        std::cout<<obj[i]<<" "<<std::endl;

    }
}
f.close();

Я не совсем понимаю, как читать данные в векторе. Текстовый файл содержит кучу имен и цифр.

Андрия Сенгер 80 65 81 76

Натал ie Уизерспун 96 99 93

Марибель Даннер 94 53 96 91 60

Кара Хоган 52 75 93 97 95

Эллиот Кремер 74 50 96 68

Кина Шойрер 100 90 57 97 90

Синди Морфин 74 67

Джанет Сайто 81 60 60

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

Недопустимые операнды в двоичном выражении ('std :: __ 1 :: ostream' (он же 'basic_ostream') и 'std :: __ 1 :: __vector_base> :: value_type '(он же' read_data_into_file '))

Также числа в каждой строке не 5, но я использую это для размера массива, потому что это было наибольшее число в строке. Я не знаю, как динамически установить размер массива для каждой строки. Я использую Xcode на Ma c для записи и компиляции.

Если есть какой-либо другой способ сделать это, я могу воспользоваться помощью или если вы можете предложить лучший способ сделать это. Благодарю вас!

1 Ответ

0 голосов
/ 10 февраля 2020

Есть некоторые вещи, которые следует учитывать при решении вашей проблемы. Во-первых, вы должны учитывать различное количество баллов в каждой записи файла. Кроме того, вам придется иметь дело с пустыми строками в файле.

Приведенный ниже код поможет решить вашу проблему.

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <sstream>

void ReadFromFile(){
    std::vector<read_data_into_file> obj;

    std::ifstream inFile;
    inFile.open("input.txt");

    while(!inFile.eof())
    {
        std::string curLine;
        std::getline(inFile, curLine);

        if (!curLine.size())
            continue;

        std::stringstream curStr(curLine);

        read_data_into_file newObj;
        curStr >> newObj.Fname;
        curStr >> newObj.Lname;

        int i = 0;
        while (curStr.good()) {
            curStr >> newObj.score[i++];
        }

        newObj.sum = 0;
        while (i--) {
            newObj.sum += newObj.score[i];
        }

        obj.push_back(newObj);
    }

    inFile.close();

    for (auto& p : obj) {
        std::cout << p.Fname << " " << p.Lname << " " << p.sum << std::endl;
    }
}

Тем не менее, правильным решением было бы использование std::vector<double> score; вместо double score[5]; в вашей структуре read_data_into_file. Тогда ваш код будет:

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <sstream>

struct read_data_into_file{
std::string Fname,Lname;
std::vector<double> score;
double sum;
};

void ReadFromFile(){
    std::vector<read_data_into_file> obj;

    std::ifstream inFile;
    inFile.open("input.txt");

    while(!inFile.eof())
    {
        std::string curLine;
        std::getline(inFile, curLine);

        if (!curLine.size())
            continue;

        std::stringstream curStr(curLine);

        read_data_into_file newObj;
        curStr >> newObj.Fname;
        curStr >> newObj.Lname;

        while (curStr.good()) {
            double curScore;
            curStr >> curScore;
            newObj.score.push_back(curScore);
        }

        newObj.sum = 0;
        for (auto& s : newObj.score)
            newObj.sum += s;

        obj.push_back(newObj);
    }

    inFile.close();

    for (auto& p : obj) {
        std::cout << p.Fname << " " << p.Lname << " " << p.sum << std::endl;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...