Присвояване на файлови данни към масив от структури

В момента се опитвам да присвоя ред с данни от входен файл към масив от структури.

Ето моята структура:

struct student
    {
        int ID;
        int hours;
        float GPA;
    };

    student sStudents[MAX_STUDENTS]; // MAX_STUDENTS = 10

Където:

for (int i = 0; !inputFile.eof(); i++)
{
    getline(inputFile, dataLine);
    cout << dataLine << endl; // Everything outputs perfectly, so I know dataLine is getting the correct information from getline()
            //??
}

След един час обхождане на Google все още нямам представа как да вкарам моите getline() данни във всеки структурен масив.

Опитах,

sStudents[i] = dataLine;
sStudents[i] << dataLine;
sStudents.ID = dataLine;

Ето моя файл с данни:

1234  31  2.95
9999  45  3.82
2327  60  3.60
2951  68  3.1
5555  98  3.25
1111  120 2.23
2222  29  4.0

В този момент се разочаровах и просто не съм сигурен какво да правя. На този етап съм убеден, че го правя напълно неправилно, но не съм сигурен как да продължа оттук нататък. Знам, че съществуват 10 елемента на sStudents, така че това е добре, но как мога да получа стойностите от входния файл във всеки .ID, .hours, .GPA? Може би getline() се използва неправилно тук?


person Community    schedule 23.04.2013    source източник


Отговори (3)


Можете просто да направите следното:

int ID = 0;
int hours = 0;
float GPA = 0.0;
int i = 0;
ifstream inputFile("data.txt");
while (inputFile >> ID >> hours >> GPA)
{
   sStudents[i].ID = ID;
   sStudents[i].hours = hours;
   sStudents[i].GPA = GPA;
   i ++;
}
person taocp    schedule 23.04.2013
comment
Разочарован съм, че дори не обмислих няколко ››. Благодаря ти - person ; 23.04.2013
comment
@Legato Добре е, не знаех това, когато за първи път се научих да използвам ›› и ifstream също. - person taocp; 23.04.2013

Предложение за използване на стандартната библиотека.

#include<iostream>
#include<fstream>
#include<vector>

// your data structure
struct Student {
  int id;
  int hours;
  float gpa;
};

// overload the input stream operator
bool operator>>(std::istream& is, Student& s) {
  return(is>>s.id>>s.hours>>s.gpa);
}

// not necessary (but useful) to overload the output stream operator
std::ostream& operator<<(std::ostream& os, const Student& s) {
  os<<s.id<<", "<<s.hours<<", "<<s.gpa;
  return os;
}


int main(int argc, char* argv[]) {
  // a vector to store all students
  std::vector<Student> students;
  // the "current" (just-read) student
  Student student;

  { // a scope to ensure that fp closes                                     
    std::ifstream fp(argv[1], std::ios::in);    

    while(fp>>student) {
      students.push_back(student);
    }
  }

  // now all the students are in the vector
  for(auto s:students) {               
    std::cout<<s<<std::endl;
  }

  return 0;
}
person Escualo    schedule 23.04.2013
comment
Това е отвъд възможностите ми в момента и аз съм виновен, че не го заявих по-рано. Благодаря ти все пак приятел - person ; 23.04.2013
comment
Търпение - ще стигнете; вземете го стъпка по стъпка. - person Escualo; 23.04.2013

За да получите данни от входен поток, използвайте оператора >>. Така:

int i;
file >> i;

извлича едно цяло число от файла. По подразбиране е разделен с интервал. Използвайте това и вижте дали ще стигнете по-далеч.

person Peter R    schedule 23.04.2013