Вектор структур и я не знаю что делать - PullRequest
0 голосов
/ 31 октября 2011

Для каждой строки текста:

-Get first name
-Get last name
-Get Student Number

(Будет неизвестное количество строк, каждая из которых будет выглядеть одинаково по формату.)
Формат:

First Last 111111111
First Last 111111112
...

Я хочу поместить каждый кусочек каждого студента в свою структуру.Я настроил структуру следующим образом:

struct Student{  
    string lastName;
    string firstName;
    string stdNumber;
    double assgn1;//doubles will be used later in prog.
    double assign2;
    double assign3;
    double assign4;
    double midTerm;
    double finalGrade;
};

Моя функция ввода файлов выглядит следующим образом:

int getFileInfo()
{       
    int failed=0;
    ifstream fin;   
    string fileName;    
    vector<Student> students;

    Student s;                  // A place to store data of one student
    cout<<"Please enter the filename of the student grades (ex. filename_1.txt)."<<endl;
    do{                                 
        if(failed>=1)                           
            cout<<"Please enter a correct filename."<<endl; 
        cin>>fileName;                              
        fin.open(fileName.c_str());// Open the file     
        failed++;                                           
    }while(!fin.good());                                        
    while (fin >> s.firstName >> s.lastName >> s.stdNumber)
        students.push_back(s);                      
    fin.close();                            
    return 0;                                   
}  

При вводе файлов я делаю вектор, ноЯ не уверен, как получить доступ к каждой отдельной его части или ученику, s, потому что кажется, что это делает только один ученик.Мне сказали, что каждая строка файла разбита и введена в вектор students, но я не знаю, как извлечь эту информацию.Как вывести каждого студента из вектора students в его собственную структуру, чтобы я мог использовать каждого студента в качестве своей собственной структуры?Итак, в конце я хотел бы иметь возможность вывести:

Student1: First Last 111111111
Student2: First Last 111111112
However More students are in the file

Заранее спасибо за помощь !!

@ Loki Я изменил цикл так, что loop != end и я до сих порполучить ту же проблему.Вот мой код:

int getFileInfo()
{
int failed=0;
ifstream fin;
string fileName;
vector<Student> students;// A place to store the list of students
vector<Student>::iterator loop = students.begin();
   vector<Student>::iterator end  = students.end();

Student s;                  // A place to store data of one student
cout<<"Please enter the filename of the student grades (ex. filename_1.txt)."<<endl;
do{
if(failed>=1)
    cout<<"Please enter a correct filename."<<endl;
    cin>>fileName;
    fin.open(fileName.c_str());// Open the file
    failed++;
}while(!fin.good());

 while (fin >> s.firstName >> s.lastName >> s.stdNumber){
    cout<<"Reading "<<s.firstName<<" "<<s.lastName<<" "<<s.stdNumber<<endl;
    students.push_back(s);
}
fin.close();

    for(loop;loop!=end;++loop)
    cout<<loop->firstName<<" "<<loop->lastName<<" "<<loop->stdNumber<<endl;

return 0;
}

Снова Visual Studio говорит vector iterators incompatible,
, указывая на «C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ vc \ include \ vector»

Ответы [ 2 ]

2 голосов
/ 31 октября 2011

Пример демонстрации в Интернете:

#include<iostream>     
#include<string>
#include<vector>

using namespace std;

struct Student
{
    string lastName;
    string firstName;
    string stdNumber;
    double assgn1;//doubles will be used later in prog.
    double assign2;
    double assign3;
    double assign4;
    double midTerm;
    double finalGrade;
};

int main()
{
    Student obj;
    obj.firstName = "ABC";
    obj.lastName = "XYZ";

    vector<Student> students;
    students.push_back(obj);
    vector<Student>::iterator it;

    cout << "students contains:";
    for ( it=students.begin() ; it != students.end(); ++it )
    {
        cout << " " << (*it).firstName;
        cout << " " << (*it).lastName;
        //And so on...
    }

        return 0;
}
1 голос
/ 31 октября 2011

При вводе файла я делаю вектор, но я не уверен, как получить доступ к каждой его отдельной части.

Вы можете получить доступ к отдельным элементам через оператора []

students[0].firstName;  // get the first name.

std::cout << students[1].firstName; // prints out the first name.

Вы можете использовать индекс от 0 -> size ().

size_t  size = students.size();  // number of students in the vector.

students[size].firstName; // This is wrong. You expression in
                          // [] must be less than size as the elements are
                          // numbered from 0 to size() -1.

потому что кажется, что это делает только один студент.

Вы создаете только одну студенческую (как сторону, не выбирайте лучшего имени). Но когда вы вызываете push_back (), вы копируете этот объект ученика в вектор. Таким образом, вектор получает копию 's', которую он хранит. Затем каждый раз в цикле вы перезаписываете старые значения в 's' новыми значениями, полученными из файла.

Мне сказали, что каждая строка файла разбита и введена в вектор студентов, но я не знаю, как извлечь эту информацию.

Как отмечено выше, каждый элемент может быть достигнут индивидуально с помощью оператора []

В качестве альтернативы вы можете использовать итераторы для получения диапазона. студентов.

 std::vector<Student>::iterator loop = students.begin();
 std::vector<Student>::iterator end  = students.end();

Вы можете получить доступ к элементу с помощью разыменования цикла и перейти к следующему студенту, увеличивая цикл.

 std::cout << loop->firstName;   // prints out student[0]
 ++loop;                         // Increment loop now it points at student 1
 std::cout << loop->firstName;   // prints out student[1]
 ++loop;                         // Increment loop now it points at student 2
 // etc

Если цикл == конец, то вы прошли всех студентов.

Как вывести каждого студента из вектора студентов в его собственную структуру, чтобы я мог использовать каждого студента в качестве своей собственной структуры?

Студенты в векторе уже в структурах. Вы можете использовать их напрямую, как если бы вы использовали структуру снаружи. Но если вы хотите скопировать их, вы можете сделать это:

Student   tmp = students[0]; // copies student 0 into tmp.

Я бы хотел вывести:

Используйте std :: cout для вывода материала на стандартный вывод. Или создайте объект типа std :: ofstream для вывода в файл:

std::cout << tmp.lastName  << " " 
          << tmp.firstName << " "
          << tmp.stdNumber << "\n";

std::ofstream  file("plop1.txt");
file      << tmp.lastName  << " " 
          << tmp.firstName << " "
          << tmp.stdNumber << "\n";
...