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

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

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

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