Re[2]: operator>> и файловый поток в двоичном режиме
От: ssi Россия  
Дата: 23.01.03 19:07
Оценка: 5 (1)
Здравствуйте, Bell, Вы писали:

B>Для бинарного режима пользуйся методами read/write


оптимальнее работать непосредственно с буфером:

    std::basic_ifstream<short> tmpFile("c:\\somefile.bin", std::ios_base::in | std::ios_base::binary); 
    unsigned short m_Word = tmpFile.rdbuf()->sgetc();


to vcmboot: если читаешь в массив, используй sgetn или в цикле sbumpc
Знающие не говорят, говорящие не знают. Лао Цзы
operator>> и файловый поток в двоичном режиме
От: vcmboot  
Дата: 23.01.03 16:29
Оценка:
unsigned short m_Word = 0;
std::ifstream tmpFile("c:\\somefile.bin", std::ios_base::binary);
tmpFile >> m_Word;

И STLPORT 4.5.3 и STL от VC7 на operator>> не делают ничего . Вернее, они пытаются в somefile.bin найти последовательность символов!, которые могут быть представлены как число (то есть воспринимает только коды символов "0123456789ABCDEF") и сделать из них число. Что естественно у него не получается, так как файл состоит из произвольных байт. Мне же надо чтобы operator>> извлекал из потока первые 2 байта (по размеру unsigned short) и их считал этим самым unsigned short безо всяких преобразований.

Может тут какие еще флаги надо задать кроме ios_base::binary ? Или я в принципе что-то делаю не так ?
Re: operator>> и файловый поток в двоичном режиме
От: ssm Россия  
Дата: 23.01.03 16:34
Оценка:
Здравствуйте, vcmboot, Вы писали:


V>    unsigned short m_Word = 0;
V>    std::ifstream tmpFile("c:\\somefile.bin", std::ios_base::binary);

      tmpFile.read((char *)&mWord, sizeof(mWord));
Re: operator>> и файловый поток в двоичном режиме
От: Bell Россия  
Дата: 23.01.03 16:40
Оценка:
Здравствуйте, vcmboot, Вы писали:

Для бинарного режима пользуйся методами read/write
Любите книгу — источник знаний (с) М.Горький
Re[2]: operator>> и файловый поток в двоичном режиме
От: vcmboot  
Дата: 23.01.03 16:55
Оценка:
Спасибо всем за ответ.

ssm> tmpFile.read((char *)&m_Word, sizeof(m_Word));

работает, но выглядит значительно менее элегантно, по сравнению с tmpFile >> m_Word.
По-моему, это все-таки баг этих реализаций — если я файл открываю в двоичном режиме, то и operator>> должен работать также в двоичном режиме, ведь размер m_Word в любом случае заранее известен. А read был бы нужен только именно для массивов-указателей, а для простых типов operator>> очевиден.
Re[3]: operator>> и файловый поток в двоичном режиме
От: Bell Россия  
Дата: 23.01.03 17:02
Оценка:
Здравствуйте, vcmboot, Вы писали:

V>Спасибо всем за ответ.


ssm>> tmpFile.read((char *)&m_Word, sizeof(m_Word));

V>работает, но выглядит значительно менее элегантно, по сравнению с tmpFile >> m_Word.
V>По-моему, это все-таки баг этих реализаций — если я файл открываю в двоичном режиме, то и operator>> должен работать также в двоичном режиме, ведь размер m_Word в любом случае заранее известен. А read был бы нужен только именно для массивов-указателей, а для простых типов operator>> очевиден.

Ну не знаю. Все это связано с небезопасным приведением типов, так что ИМХО лучще дать увидеть программисту, что он делает.
Любите книгу — источник знаний (с) М.Горький
Re[3]: operator>> и файловый поток в двоичном режиме
От: Юнусов Булат Россия  
Дата: 23.01.03 17:07
Оценка:
Здравствуйте, vcmboot, Вы писали:



http://www.rsdn.ru/forum/Message.aspx?mid=62075#62075
Автор: DarkGray
Дата: 09.06.02
Re[3]: operator>> и файловый поток в двоичном режиме
От: Кодт Россия  
Дата: 23.01.03 17:11
Оценка:
Здравствуйте, vcmboot, Вы писали:

V>Спасибо всем за ответ.


ssm>> tmpFile.read((char *)&m_Word, sizeof(m_Word));

V>работает, но выглядит значительно менее элегантно, по сравнению с tmpFile >> m_Word.
V>По-моему, это все-таки баг этих реализаций — если я файл открываю в двоичном режиме, то и operator>> должен работать также в двоичном режиме, ведь размер m_Word в любом случае заранее известен. А read был бы нужен только именно для массивов-указателей, а для простых типов operator>> очевиден.

Это не баг!!! А хреново названное свойство.

Файл в Си (!) можно открыть в одном из двух режимов:
  • "текстовый" — когда концы строк и конец файла преобразуются в соответствии с правилами операционной системы (для MSDOS/Windows \n --> \r\n, MacOS \n --> \r, Unix \n --> \n )
  • "бинарный" — когда эти знаки не преобразуются.

    Смотри в MSDN тему "Stream I/O routines", в частности, fopen().

    Можно считать, что std::iostream -- это обертка к обычному FILE* и операциям над ним.
    stream::operator << ( int& x ) -- это fscanf( f, "%d", &x ),
    и тому подобное.
  • Перекуём баги на фичи!
    Re[3]: operator>> и файловый поток в двоичном режиме
    От: Андрей Тарасевич Беларусь  
    Дата: 23.01.03 18:06
    Оценка:
    Здравствуйте, vcmboot, Вы писали:

    V>Спасибо всем за ответ.


    ssm>> tmpFile.read((char *)&m_Word, sizeof(m_Word));

    V>работает, но выглядит значительно менее элегантно, по сравнению с tmpFile >> m_Word.
    V>По-моему, это все-таки баг этих реализаций — если я файл открываю в двоичном режиме, то и operator>> должен работать также в двоичном режиме,

    Нет, не должен. И никакого бага здесь нет. Бинарный ввод/вывод делается методами 'read' и 'write' и только ими. Оператор '>>' всегда делает текстовое чтение. При использовании этого оператора твой флаг 'binary' влияет только на некоторые особенности трасляции читаемых символов, но не более.
    Best regards,
    Андрей Тарасевич
    Re: operator>> и файловый поток в двоичном режиме
    От: ArtDenis Россия  
    Дата: 23.01.03 20:24
    Оценка:
    Здравствуйте, vcmboot, Вы писали:

    V> unsigned short m_Word = 0;

    V> std::ifstream tmpFile("c:\\somefile.bin", std::ios_base::binary);
    V> tmpFile >> m_Word;

    Для это случая я написал шаблон и переопределил операторы << и >>
    //    class bindata
    //---------------------
    template <class T> class bindata
    {
      T *pointer;
    
    public:
      bindata(T& value) { pointer = &value; };
      T* get_ptr() { return (T*)pointer; };
    };
    
    template <class T> ostream& operator << (ostream& stream, bindata<T> value)
    {
      stream.write((char*)value.get_ptr(), sizeof(T));
      return stream;
    }
    
    template <class T> istream& operator >> (istream& stream, bindata<T> value)
    {
      stream.read((char*)value.get_ptr(), sizeof(T));
      return stream;
    }


    А используется это так:
      unsigned short m_Word = 0;
      int int_value = 0;
    
      std::ifstream tmpFile("c:\\somefile.bin", std::ios_base::binary);
        tmpFile >> bindata<unsigned short>(m_Word) >> bindata<int>(int_value);


    Не совсем красиво, да и реализация шаблона класса и перегрузки операторов реализована с точки зрения стиля не очень... (написано на скорую руку и лень переделывать ), но работает!

    Кстати, этот код не безопасен для сложных классов. Для таких случаев лучше переопределить операторы ввода — вывода:
    ostream& operator << (ostream& stream, bindata<String> value)
    {
      stream << value.get_ptr()->c_str() << ends;
      return stream;
    }


    Если кто-нибудь придумает более изящный способ записи/(чтения) в файл/(из файла) — поделитесь опытом.

    PS: всё это компилиться и работает на CBuilder 4.
    ... << RSDN@Home 1.0 beta 5 >>
    [ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
    Re[3]: operator>> и файловый поток в двоичном режиме
    От: Odi$$ey Россия http://malgarr.blogspot.com/
    Дата: 24.01.03 03:56
    Оценка:
    Здравствуйте, vcmboot, Вы писали:

    ssm>> tmpFile.read((char *)&m_Word, sizeof(m_Word));

    V>работает, но выглядит значительно менее элегантно, по сравнению с tmpFile >> m_Word.

    http://www.rsdn.ru/Forum/Message.aspx?mid=22329&amp;only=1
    Автор: retalik
    Дата: 17.01.02


    V>По-моему, это все-таки баг этих реализаций — если я файл открываю в двоичном режиме, то и operator>> должен работать также в двоичном режиме,


    http://www.rsdn.ru/Forum/Message.aspx?mid=22257&amp;only=1
    Автор: Юнусов Булат
    Дата: 16.01.02
    Re: operator>> и файловый поток в двоичном режиме
    От: Kubyshev Andrey  
    Дата: 24.01.03 11:02
    Оценка:
    Здравствуйте, vcmboot, Вы писали:

    V> unsigned short m_Word = 0;

    V> std::ifstream tmpFile("c:\\somefile.bin", std::ios_base::binary);
    V> tmpFile >> m_Word;

    C++ не делает то что ты хочешь потому что это должет делать developer.
    developery С++ знает о том что есть разные endian платфопмы, а простые ою этом забывают.
    Для cross platform предст. чисел используется XDR library (sdelana v 1985, man xdr)
    если не хочется делать цивилизовано, преобразуй хотя бы по возможности в network order
    Re: as_binary
    От: Anton V. Kolotaev  
    Дата: 24.01.03 14:14
    Оценка:
    Здравствуйте, vcmboot, Вы писали:

    Может поможет следующее
    Автор: Anton V. Kolotaev
    Дата: 14.05.02
    ?
     
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.