Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> seekg, почему не работает seekg 
:(
    Опции темы
Annihilator
Дата 18.5.2007, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


Профиль
Группа: Участник
Сообщений: 493
Регистрация: 21.11.2006
Где: Омск

Репутация: 1
Всего: 3



Код

    ifstream in (argv[1], ios::in);
    if ((!in))
    {
        cout << "Cannot open the file.\n";
        getch();
        return 1;
    }
    while (!in.eof()) // считаю количество переводов строк
    {
        in.get(ch);
        if (ch=='\n')
        cnt2++;
    }
    in.seekg(0, ios::beg);    // хочу перевести на начало файла, чтобы посчитать количество чисел, но не переводит
    while (!in.eof())            //считаю количество чисел строк
    {
        in.get(i);
        cnt++;
    }
    in.seekg(0, ios::beg);

Почему-то не хочет на начало файла сбрасывать? 

Это сообщение отредактировал(а) Annihilator - 18.5.2007, 20:17


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
vinter
Дата 18.5.2007, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Код

in.clear();
in.seekg(0, ios::beg); 



--------------------
Мой блог
PM MAIL WWW   Вверх
Xenon
Дата 18.5.2007, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Annihilator, как vinter уже сказал, нужно при помощи in.clear() сбросить флаги ошибок, так как ты в первом цикле while достиг конца файла, флаг eof уставлен в true, поэтому во втором цикле while условие !in.eof() равно  false, поэтому цикл ниразу не выполняется.


--------------------
user posted image  
PM MAIL   Вверх
Hurricane
Дата 18.5.2007, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 10.4.2007

Репутация: 6
Всего: 9



 smile 

Пытаюсь понять, зачем там вообще seekg и второй проход...


PM MAIL   Вверх
Annihilator
Дата 22.5.2007, 07:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


Профиль
Группа: Участник
Сообщений: 493
Регистрация: 21.11.2006
Где: Омск

Репутация: 1
Всего: 3



Все заработало, спасибо. А почему флаг ошибок влияет и на физический перевод каретки, а не только на выполнение цикла while?


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
JackYF
Дата 22.5.2007, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(Annihilator @  22.5.2007,  07:11 Найти цитируемый пост)
почему флаг ошибок влияет и на физический перевод каретки


Не влияет. Тебе нужно сбросить флаг ошибки, чтобы ты дальше смог работать с файловой переменной - перемещать каретку, читать и др.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Annihilator
Дата 22.5.2007, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


Профиль
Группа: Участник
Сообщений: 493
Регистрация: 21.11.2006
Где: Омск

Репутация: 1
Всего: 3



Цитата(JackYF @  22.5.2007,  09:26 Найти цитируемый пост)
Не влияет. Тебе нужно сбросить флаг ошибки, чтобы ты дальше смог работать с файловой переменной - перемещать каретку, читать и др.

Получается что все-таки влияет, вот сейчас проверил:
Код

while (!in.eof())
        {
            in.get(ch);
            if (ch=='\n')
            cnt2++;
        }
     //    in.clear();
        in.seekg(0, ios::beg);
        while (1)
        {
            in >> i;
            cnt++;
        }

Закоментил in.clear(); во-втором цикле (1) сделал, чтобы всегда выполнялся, но в переменную i ничего не считывается



--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
bsa
Дата 22.5.2007, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(Annihilator @ 22.5.2007,  17:35)
Закоментил in.clear(); во-втором цикле (1) сделал, чтобы всегда выполнялся, но в переменную i ничего не считывается

Естественно. Не читает, так как конец файла выставлен. Ты лучше сначала seekg сделай, а затем clear. Если заработает после этого, то на seekg флаг eof не влияет.
PM   Вверх
Annihilator
Дата 23.5.2007, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


Профиль
Группа: Участник
Сообщений: 493
Регистрация: 21.11.2006
Где: Омск

Репутация: 1
Всего: 3



Т.е. получается что есть выставлен конец файла то хоть заseekgайся, все равно ниче не произойдет,значит по-любому нужно конец файла сбрасывать


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
Xenon
Дата 23.5.2007, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Annihilator, если уставлен флаг конца файла seekg ты можешь сделать, но при попытке считать данные операция считывания не идет, так как установлен флаг конца файла. Вроде так.


--------------------
user posted image  
PM MAIL   Вверх
Annihilator
Дата 23.5.2007, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


Профиль
Группа: Участник
Сообщений: 493
Регистрация: 21.11.2006
Где: Омск

Репутация: 1
Всего: 3



Цитата(Xenon @  23.5.2007,  12:40 Найти цитируемый пост)
Annihilator, если уставлен флаг конца файла seekg ты можешь сделать, но при попытке считать данные операция считывания не идет, так как установлен флаг конца файла. Вроде так. 

Впринципе логично smile


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
Xenon
Дата 23.5.2007, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Annihilator, а ты попробуй  сделать перевод каретки с уже установленным eof, а потом вызови tellg() - если возвращаемое значение не будет концом файла, а будет соотвествовать тому, куда переместил указатель - все  как я сказал.


--------------------
user posted image  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0574 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.