crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

Iron Bug
  опции профиля:
сообщение 5.10.2012, 14:46
Сообщение #1


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


В общем, напоролась я на фичу (как оказалось, а не багу), потратила кучу времени. Хочу предупредить всех, что она есть.
Проблема в том, что в стандартном ifstream, после чтения до конца файла (eof()), функция seekg работать перестаёт.
Вот простой код, который даёт неравные буферы:

// TestIfstreamSeekg.cpp 

#include <fstream>
#include <iostream>

using namespace std;

#define BUFFER_SIZE 10

int main(int argc, char* argv[])
{
    ifstream ifs("TestIfStreamSeekg.exe",ios::binary); // любой файл, длиной больше 10 байт, для простоты взят сам exe-шник, формат открытия неважен, может быть и текстовый

    // читаем первые байты
    char buffer0[BUFFER_SIZE];
    ifs.read(buffer0,BUFFER_SIZE);

    // доходим до eof()
    char temp[1000];
    while(!ifs.eof())
    {
        ifs.read(temp,1000);
    }
       
    //ifs.clear(); // а это волшебный финт ушами, который при раскомментировании помогает заставить seekg работать (шаманство подсмотрено на других форумах)
    // перемещаемся к началу файла (якобы)
    ifs.seekg(0,ios::beg);

    // снова читаем первые байты
    char buffer1[BUFFER_SIZE];
    ifs.read(buffer1,BUFFER_SIZE);
  
    // сравниваем считанные буферы
    if(memcmp(buffer0,buffer1,BUFFER_SIZE) != 0)
    {
        // опа! буферы разные
        cout << "buffers are not equal!" << endl;
    }
    else
    {
        // всё зашибись!
        cout << "buffers are equal" << endl;
    }
    ifs.close();
    return 0;
}


решение проблемы - сброс бита: перед вызовом seekg() вызывать clear(). можно ещё переоткрыть файл - тоже, естественно, сработает.
главное, знать об этом косяке :)

Сообщение отредактировал Iron Bug - 5.10.2012, 15:46
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- Iron Bug   Фича в стандартной библиотеке С++   5.10.2012, 14:46
- - ssoft   Дак вроде так везде работает, не только под MSVS. ...   5.10.2012, 15:21
|- - Iron Bug   Цитата(ssoft @ 5.10.2012, 18:21) Дак врод...   5.10.2012, 15:44
- - Litkevich Yuriy   Да бага это однозначно, просто авторы отмазываются...   7.10.2012, 14:05
|- - Iron Bug   Цитата(Litkevich Yuriy @ 7.10.2012, 17:05...   8.10.2012, 9:08
- - Влад   Это не отмазка, а точное следование требованию Ста...   8.10.2012, 15:49
- - Iron Bug   просто стандарт слишком древний. он не соответству...   9.10.2012, 20:21
- - Влад   Хмм... Называть 14882-2011 "слишком древним...   9.10.2012, 21:01
- - Iron Bug   Цитата(Влад @ 10.10.2012, 0:01) Хмм... На...   10.10.2012, 6:55
- - Влад   Может, забыли, а может - нет.... Мы не знаем всех ...   10.10.2012, 9:41
- - Iron Bug   я думаю, что весь вопрос в том, что понимать под с...   10.10.2012, 17:40
|- - AD   Цитата(Iron Bug @ 10.10.2012, 18:40) я ду...   11.10.2012, 10:44
- - Iron Bug   Цитата(AD @ 11.10.2012, 13:44) А как так ...   12.10.2012, 6:54
|- - AD   Цитата(Iron Bug @ 12.10.2012, 7:54) пайп ...   12.10.2012, 9:03
- - Litkevich Yuriy   мне помнится, что я на билдере делал кольцевой буф...   12.10.2012, 7:28
- - Litkevich Yuriy   Цитата(AD @ 12.10.2012, 12:03) Для Linux ...   12.10.2012, 14:21
|- - AD   Цитата(Litkevich Yuriy @ 12.10.2012, 15:2...   12.10.2012, 15:02
- - Litkevich Yuriy   AD, она не про пайпы, а про файлы: Цитата(Iron Bug...   12.10.2012, 15:16
|- - AD   Цитата(Litkevich Yuriy @ 12.10.2012, 16:1...   12.10.2012, 15:16
- - Litkevich Yuriy   изначально речь не шла вообще о потоках и прочем, ...   12.10.2012, 15:19
|- - AD   Цитата(Litkevich Yuriy @ 12.10.2012, 16:1...   12.10.2012, 15:21
- - Iron Bug   да, iostream от fstream существенно отличается, од...   12.10.2012, 18:28


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


7 чел. читают эту тему (гостей: 7, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 18.2.2025, 17:15