Чтение в текстовом файле слово за словом в структуру в C ++ - PullRequest
2 голосов
/ 31 октября 2011

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

Примером является

Xiao Wang 135798642
Lucie Chan 122344566
Rich Morlan 123456789
Amir Khan 975312468
Pierre Guertin 533665789
Marie Tye 987654321

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

struct Student{
    string firstName;
    string secondName;
    string idNumber;
};

Все попытки выполнить чтение каждого слова отдельно завершились неудачно (вместо этого я прочитал всю строку), и яЯ слегка расстроен.

С помощью @Sylence мне удалось прочитать каждую строку отдельно.Я все еще путаюсь с тем, как разделить строки пробелами.Есть ли функция разделения в ifstream?Sylence, «части» будут массивом?Я видел, что у вас были индексы в [].Что именно делает students.add( stud )?Пока мой код:

int getFileInfo()
{
    Student stdnt;
    ifstream stdntFile;
    string fileName;
    char buffer[256];
    cout<<"Please enter the filename of the file";
    cin>>filename;
    stdntFile.open(fileName.c_str());
    while(!stdFile.eof())
    {
        stdFile.getLine(buffer,100);
    }
    return 0;
}

Это моя измененная и окончательная версия getFileInfo (), спасибо, Шахбаз, за ​​простой и быстрый способ чтения данных.

void getFileInfo()
{
    int failed=0;
    ifstream fin;
    string fileName;
    vector<Student> students; // A place to store the list of 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();
cout<<students.max_size()<<endl<< students.size()<<endl<<students.capacity()<<endl;


return;
}

Что меня сейчас смущает, так это как получить доступ к данным, которые были введены!Я знаю, что это было помещено в вектор, но как мне получить доступ к отдельным пробелам в векторе, и как именно введенные данные хранятся в векторе?Если я пытаюсь определить точку вектора, я получаю сообщение об ошибке, потому что Visual Studio не знает, что выводить, я думаю ..

Ответы [ 3 ]

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

Другие ответы хороши, но выглядят немного сложнее.Вы можете сделать это просто:

vector<Student> students;   // A place to store the list of students

Student s;                  // A place to store data of one student

ifstream fin("filename");   // Open the file

while (fin >> s.firstName >> s.secondName >> s.idNumber)
    students.push_back(s);

Обратите внимание, что в случае сбоя istream, например, когда файл заканчивается, объект istream (fin) оценивается как false.Поэтому while (fin >> ....) остановится, когда файл завершится.

PS Не забудьте проверить, открыт файл или нет.

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

Определите читатель потока для студента:

std::istream& operator>>(std::istream& stream, Student& data)
{
    std::string line;
    std::getline(stream, line);

    std::stringstream   linestream(line);
    linestream >> data.firstName >> data.secondName >> data.idNumber;

    return stream;
}

Теперь вы сможете передавать потоковые объекты из любого потока, включая файл:

int main()
{
    std::ifstream    file("data");
    Student          student1;

    file >> student1;   // Read 1 student;

    // Or Copy a file of students into a vector
    std::vector<Student>   studentVector;
    std::copy(std::istream_iterator<Student>(file),
              std::istream_iterator<Student>(),
              std::back_inserter(studentVector)
             );
}
0 голосов
/ 31 октября 2011

Просто прочитайте всю строку, а затем разбейте строку на пробелы и присвойте значения объекту структуры.

псевдокод:

while( !eof )
   line = readline()
   parts = line.split( ' ' )

   Student stud = new Student()
   stud.firstName = parts[0]
   stud.secondName = parts[1]
   stud.idNumber = parts[2]  

   students.add( stud )     
end while
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...