[c++ and visual St 6.0] istream binary

Maurog

поставил себе эту игрушку (студию 6.0).
не могу бинарно считать файл
делаю так:

char buff[10000];
filebuf fb;
fb.open( file_name, ios::in || ios::binary );//на солярке и линуксе не стоит флажка ios::binary
istream InStream( &fb );
InStream.setf(ios::in || ios::binary); //это от безысходности написал

rInFileStream_read(rInFileStream,buff,400); //вызываю странную побайтную функцию

int rInFileStream_read( istream *rInFileStream, char* buf, int count)
{
unsigned char t; // с простым char результат такой же
int i;
for (i=0; i< count; i++)
{
*rInFileStream >> t;
buf[i]=t;
printf("%x(%d",t,t); //вот етот злой принтф
}
printf(";count=%d.",count);
return 0;
}
функция выдает первые несколько байт правильно..и когда встречает 0С или 0A, то проглатывает их..выводит следующие байты
пример вывода:
7(7d4(2120(00(01(10(00(0)
вместо
7(7d4(2120(010(0A0(01(010(012(0C0(0) //ето вытащил фаром из файла

страшная функция была написана из-за неправильной работы такого:
rInFileStream->read( (char *ptr->acRecBody HEADER_LEN );

if( ios::goodbit != rInFileStream->rdstate
{
cout << "\n ERR =(";
return NOT_OK;
}
if срабатывает где-то в середине файла ;(
на солярке и линуксе все ок с проверкой rdstate и ->read корректно работает
помогите ;)

Maurog

количество палочек сейчас уменьшу и потестю;)
;(
заменил просто || на одну палочку
не помогло

Maurog

флажочек ios::skipws вроде помог..
но ведь это криво ;(

rosali

заменил просто || на одну палочку
не помогло
А точно не помогло? Может ты только в одном месте заменил?
Вообще бинарные данные лучше читать не через >> а через read. Попробуй, а то мне лень
PS. istream & fInFileStream удобнее...
PPS. Ой, ты read уже пробовал. А че не правильно было?

Maurog

->read zarabotal normalno posle primeneniya ios::skipws
no ya nikogda ne videl, chtoby tak pisali-znachit gde-to v drugom meste problema
dve palochki v oboih mestah menyal.

rosali

ios::skipws - это же skip white space. Теперь у тебя наверное 32 (space) или 8 (? tab) не читается?

Maurog

ya otkluchil ego =)
to est' teper' ne glotayutsya pustie symbols
InStrem.setf( ~ios::skipws & InStream.flags;

rosali

Ну дык а что тебя тогда удивляет, ясное дело надо было отключать. Нормальных бинарных потоков в STL по ходу вообще нет То есть нету такого
int x;
os << x;
чтобы 4 байта вписывал вместо десятичной записи.
Или есть?

Maurog

menya udivliyaet, chto eto nado delat' ruchkami. pochemu ios::binary sam ne delaet etogo?
marazm-(
szhatie int'ov my delaem ruchkami $)
her znaet chto vzbredet kompilyatoram pod linuxom, solarkoy...a seychas i windows.

rosali

vzbredet kompilyatoram
Ну вот при чем тут компиляторы Просто такой стандарт STL-я...

Maurog

я не могу назвать подобные вещи STL.
хотя формально это так и зовется
потому что не могу использовать два разных "STL" на одном компиляторе

Dasar

> потому что не могу использовать два разных "STL" на одном компиляторе
Почему ты так решил?

Maurog

потому что я имею компиляторы гцц на линуксе, визуал 6.0, билдер, СС под солярку
ты думаешь я что-то могу стырить из соседнего компилятора?
отнюдь
даже char_traits уже отдыхают
поэтому для меня стл и компиляторы на практике понятия монопенисуальные
если вы о билдере и борланде, то флаг вам в руки, но меня практика интересует, а не теория

Dasar

Возьми какой-нибудь Stl_port, он у тебя будет бегать под любым компилятором одиннаково.
Оставить комментарий
Имя или ник:
Комментарий: