LINUX.ORG.RU

eof и seekg() в gcc/gpp


0

0

Пишу вот программку, которая должна два раза файл в цикле читать, и столкнулся с проблемой - после достижения eof в первом цикле и seekg(0) на начало файла, во втором получаю eof на первой итерации.

void search() { char topic[TOPIC]; ifstream infile; BOOK b; infile.open("books.txt", ios::in); if(!infile) { cerr << "Ошибка открытия файла books.txt\n"; exit(1); }

cout << "Название дисциплины для поиска:"; cin.seekg(0, ios::end); cin.get(topic, TOPIC-1, '\n'); cout << "Найденные авторы:\n"; while(!infile.eof()) { infile >> b; // читаю одну запись из файла if(strcmp(b.topic, topic) == 0) cout << b.authors << endl; //если дисциплина совпала, печатаю авторов } // Глюки начинаются тут. infile.seekg(0); if (infile.eof()) cout << "Вот тут злобный eof откуда-то ;-( \n"; infile.close(); cout << endl; }

получаю полсле seekg сразу eof. вместо infile.seekg(0) кучу всего перепробовал типа infile.seekg(0,ios::beg); infile.seekg(0,ios_base::beg);

и еще с десяток разных вариантов. И даже infile.close(); infile.open("books.txt", ios::in);

при этом infile.tellg() дает правильный 0 ! И flush в ifstream вроде как нету, только в ofstream.

Можно, конечно, 2 разных потоково-файловых использовать, infile1 и infile2, но это слишком неправильно.

Такие дела.

anonymous

Сорри, форматирование слетело.

Пишу вот программку, которая должна два раза файл в цикле читать, и столкнулся  с  проблемой  -  после  достижения eof в  первом цикле и  seekg(0) на начало файла, во втором получаю eof на  первой итерации.

 void search() {
       char topic[TOPIC];
       ifstream infile;
       BOOK b;
       infile.open("books.txt", ios::in);
       if(!infile) {
               cerr << "Ошибка открытия файла books.txt\n";
               exit(1);
       }

       cout << "Название дисциплины для поиска:";
       cin.seekg(0, ios::end);
       cin.get(topic, TOPIC-1, '\n');
       cout << "Найденные авторы:\n";
       while(!infile.eof()) {
               infile >> b;    // читаю одну запись из файла
               if(strcmp(b.topic, topic) == 0)
                       cout << b.authors << endl; //если дисциплина совпала, печатаю авторов
       }
         // Глюки начинаются тут.
       infile.seekg(0);
         if (infile.eof())
         cout << "Вот тут злобный eof откуда-то ;-(  \n";
         infile.close();
       cout << endl;
 }

 получаю полсле seekg сразу eof.
 вместо infile.seekg(0) кучу всего перепробовал типа
 infile.seekg(0,ios::beg);
 infile.seekg(0,ios_base::beg);

 и еще с десяток разных вариантов.
 И даже
 infile.close();
 infile.open("books.txt", ios::in);

 при этом infile.tellg() дает правильный 0 !
 И flush в ifstream вроде как нету, только в ofstream.

 Можно, конечно, 2 разных потоково-файловых использовать,
 infile1 и infile2, но это слишком неправильно.

 Такие дела.

anonymous
()
Ответ на: комментарий от butterfly

Респект ! ;-)

Kewl! Спасибо большое! Все заработало! Интересно, что я пару учебников перелистал, там про эту мегаценную функцию clear ничего нет.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.