Консультация № 109770
17.11.2007, 00:12
0.00 руб.
0 9 4
Здравствуйте, ув. эксперты. У меня к вам два вопроса.
1) Если в файле n строчек.
Почему данный цикл выполняется n+1 раз?
while(!fin.eof()) {
fin >> var;
avrval += var;
count++;
}
В итоге в переменную avrval последнее число (из файла) записывается два раза.

2) Не подскажите ли функцию на с++ с помощью, которой можно начать считывание файла заново. А то уже надоело открывать и закрывать файл по несколько раз.

Обсуждение

Неизвестный
17.11.2007, 01:16
общий
это ответ
Здравствуйте, Никитаев Константин Александрович!
1) ненаю все правильно у вас написано
вы показываете не весь код может там ошибка??
у мя все работает см приложения
2)с помощью функции seekg(позиция файла), см приложения!!!!


Приложение:
#include "iostream"#include "fstream"using namespace std;void main(void){ fstream f("out.txt",ios::in); int a,s=0,c=0; while(!f.eof()) { f>>a; s+=a; c++; } cout<<c<<‘ ‘<<s; f.seekg(ios::beg);] s=0;c=0; while(!f.eof()) { f>>a; s+=a; c++; } cout<<c<<‘ ‘<<s; flushall(); cin.get();}
Неизвестный
17.11.2007, 13:56
общий
это ответ
Здравствуйте, Никитаев Константин Александрович!
Попробуйте следующим образом
for (;;) {
fin>>var;
if (fin.eof()) break;
avrval+=var;
count++;
}
Вы используете STL, эта библеотека
может иметь несколько различные (несильно отличающиеся) реализации
у разных производителей. Видимо вы работаете с ifstream классом, который при считывании
файла "не знает", что файл закончился - пока не считает из потока сам символ EOF и
"не заглянет" за конец файла.

Для того, чтбы начать чтение файла сначала - можете использовать метод
того же класса seekg
Неизвестный
17.11.2007, 14:15
общий
это ответ
Здравствуйте, Никитаев Константин Александрович!
1) Скорее всего последняя строка пустая
2) fseek() - позиционирует указатель файла куда нужно
Удачи!

Неизвестный
17.11.2007, 17:01
общий
Какие последние байты в файле?
Неизвестный
17.11.2007, 23:45
общий
Может глупость, но попробуйте так - while(!eof(fin))
Неизвестный
18.11.2007, 01:14
общий
Попробовал не сработало. У меня компилятор borland turbo C++ 3.0 может он глючит? или?
Неизвестный
18.11.2007, 10:27
общий
Скорее всего как раз проблемы с борландовыми библиотеками, уж очень старенькие.
Неизвестный
18.11.2007, 20:43
общий
заменил условие в цикле while на следующее:fin.peek() != EOFТеперь всё заработало. Я только не совсем понял её назначение. Может кто нибудь пояснит, как она работает?
Неизвестный
19.11.2007, 15:51
общий
это ответ
Здравствуйте, Никитаев Константин Александрович!

Видимо вы используете компилятор, в котором немного своебразно реализован класс ifstream (Turbo C++ или Borland C++), т.к у меня ваш код работает без проблем. Могу предложить такое решение:
while(!(fin >> var).eof())
{
avr_val += var;
++count;
}
Форма ответа