Никогда не достигать eof используя ifstream (cpp) - PullRequest
1 голос
/ 05 сентября 2011

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

Вот что я написал

static ifstream inF;
inF.open(file,ifstream::in);
cin.rdbuf(inF.rdbuf());
while (inF.good() && !inF.eof())
{
    addStudent(students);
}
if (inF.is_open())
{
    inF.close();
    inF.clear();
}

Каждая итерация циклаВызовите addStudents, который обрабатывает только одну строку.Это прекрасно работает для меня.В основном я рад строк в виде D 98 76,5 66 45 (возможно) 12000 вот код:

static void addStudent(vector<Student*> students)
{
char institution;
unsigned short id;
double gAverage, pGrade, salary;
cin >> institution;

switch (institution)
{
case ALICE:
    cin >> id >> gAverage >> salary;
        students.push_back(new Student(institution,id,gAverage,salary));
        return;
case BOB:
    cin >> id >> gAverage >> salary;
    students.push_back(new Student(institution,id,gAverage,salary));
    return;
case COLIN:
    cin >> id >> gAverage >> pGrade >> salary;
    students.push_back(new                  CollegeStudent(institution,id,gAverage,pGrade,salary));
    return;
case DANNY:
cin >> id >> gAverage >>  pGrade >> salary;
    students.push_back(new CollegeStudent(institution,id,gAverage,pGrade,salary));
    return;
}
}

Когда я добираюсь до конца файла, цикл продолжает работать, и addStudents (который возвращает void) ничего не делает.Есть идеи почему?Спасибо!

1 Ответ

2 голосов
/ 05 сентября 2011

Ваш файловый поток может совместно использовать свой буфер потока с cin, но он не разделяет свои флаги. Поэтому, когда вы читаете, используя cin operator>>, и он достигает конца файла, cin устанавливает свой собственный флаг eof, но он не устанавливает флаг в вашем ifstream (как он мог? этого).

Это ужасно глупый способ прочитать файл, почему ты так делаешь? Почему бы вам просто не передать ссылку istream в функцию addStudent и прочитать ее?

...