И STLPORT 4.5.3 и STL от VC7 на operator>> не делают ничего . Вернее, они пытаются в somefile.bin найти последовательность символов!, которые могут быть представлены как число (то есть воспринимает только коды символов "0123456789ABCDEF") и сделать из них число. Что естественно у него не получается, так как файл состоит из произвольных байт. Мне же надо чтобы operator>> извлекал из потока первые 2 байта (по размеру unsigned short) и их считал этим самым unsigned short безо всяких преобразований.
Может тут какие еще флаги надо задать кроме ios_base::binary ? Или я в принципе что-то делаю не так ?
Спасибо всем за ответ.
ssm> tmpFile.read((char *)&m_Word, sizeof(m_Word));
работает, но выглядит значительно менее элегантно, по сравнению с tmpFile >> m_Word.
По-моему, это все-таки баг этих реализаций — если я файл открываю в двоичном режиме, то и operator>> должен работать также в двоичном режиме, ведь размер m_Word в любом случае заранее известен. А read был бы нужен только именно для массивов-указателей, а для простых типов operator>> очевиден.
Re[3]: operator>> и файловый поток в двоичном режиме
Здравствуйте, vcmboot, Вы писали:
V>Спасибо всем за ответ.
ssm>> tmpFile.read((char *)&m_Word, sizeof(m_Word)); V>работает, но выглядит значительно менее элегантно, по сравнению с tmpFile >> m_Word. V>По-моему, это все-таки баг этих реализаций — если я файл открываю в двоичном режиме, то и operator>> должен работать также в двоичном режиме, ведь размер m_Word в любом случае заранее известен. А read был бы нужен только именно для массивов-указателей, а для простых типов operator>> очевиден.
Ну не знаю. Все это связано с небезопасным приведением типов, так что ИМХО лучще дать увидеть программисту, что он делает.
Любите книгу — источник знаний (с) М.Горький
Re[3]: operator>> и файловый поток в двоичном режиме
Здравствуйте, 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>> и файловый поток в двоичном режиме
Здравствуйте, vcmboot, Вы писали:
V>Спасибо всем за ответ.
ssm>> tmpFile.read((char *)&m_Word, sizeof(m_Word)); V>работает, но выглядит значительно менее элегантно, по сравнению с tmpFile >> m_Word. V>По-моему, это все-таки баг этих реализаций — если я файл открываю в двоичном режиме, то и operator>> должен работать также в двоичном режиме,
Нет, не должен. И никакого бага здесь нет. Бинарный ввод/вывод делается методами 'read' и 'write' и только ими. Оператор '>>' всегда делает текстовое чтение. При использовании этого оператора твой флаг 'binary' влияет только на некоторые особенности трасляции читаемых символов, но не более.
Best regards,
Андрей Тарасевич
Re[2]: operator>> и файловый поток в двоичном режиме
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);
Не совсем красиво, да и реализация шаблона класса и перегрузки операторов реализована с точки зрения стиля не очень... (написано на скорую руку и лень переделывать ), но работает!
Кстати, этот код не безопасен для сложных классов. Для таких случаев лучше переопределить операторы ввода — вывода:
Здравствуйте, vcmboot, Вы писали:
ssm>> tmpFile.read((char *)&m_Word, sizeof(m_Word)); V>работает, но выглядит значительно менее элегантно, по сравнению с tmpFile >> m_Word.
Здравствуйте, 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