День добрый.
Подскажите пожалуйста, есть ли возможность делать ввод/вывод в двоичный (binary) поток через операторы << >>? Если можно, короткий пример вывода.
Заранее спасибо.
Дмитрий.
Здравствуйте, Draconus, Вы писали:
D>День добрый. D>Подскажите пожалуйста, есть ли возможность делать ввод/вывод в двоичный (binary) поток через операторы << >>? Если можно, короткий пример вывода.
А зачем?
Используй read/write c первым аргументом (char *)&name.
long a;
from.read((char *)&a, sizeof(long));
to.write((char *)&a, sizeof(long));
И так для любого типа, который тебе нужен. В том числе и для новых.
Но если очень хочется, то надо перегрузить.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
LVV>И так для любого типа, который тебе нужен. В том числе и для новых. LVV>Но если очень хочется, то надо перегрузить.
Проблема вот в чем. Мне необходимо сохранять в двоичный файл данные из различных встроенных и custom-типов данных. При этом часто имеет место ситуация, когда один тип включает другой (например, класс, содержащий несколько массивов различных типов). Если делать вывод в обычный текстовый поток, можно переопределить операторы << для каждого из используемых классов, причем в классах содержащем, например, vector, использовать единожды переопределенный оператор << для vector. При этом я думал, что в зависимости от того, какой поток я открою (двоичный или текстовый), вывод автоматически будет идти в нужном виде.
Здравствуйте, Draconus, Вы писали:
D>Здравствуйте, LaptevVV, Вы писали:
LVV>>А зачем? LVV>>Используй read/write c первым аргументом (char *)&name. LVV>>
LVV>>И так для любого типа, который тебе нужен. В том числе и для новых. LVV>>Но если очень хочется, то надо перегрузить.
D>Проблема вот в чем. Мне необходимо сохранять в двоичный файл данные из различных встроенных и custom-типов данных. При этом часто имеет место ситуация, когда один тип включает другой (например, класс, содержащий несколько массивов различных типов). Если делать вывод в обычный текстовый поток, можно переопределить операторы << для каждого из используемых классов, причем в классах содержащем, например, vector, использовать единожды переопределенный оператор << для vector. При этом я думал, что в зависимости от того, какой поток я открою (двоичный или текстовый), вывод автоматически будет идти в нужном виде.
D>У меня используется что-то вроде:
D>
D>template<class _T>
D>ostream& operator<< (const ostream& _out, const vector<_T>& _vec)
D>{
D> _out << _vec.size(); // здесь можно ставить write
D> for (vector<_T>::iterator it=_vec.begin(); it!=_vec.begin(); it++)
D> _out << *it; // и здесь можно ставить write
D> return _out;
D>}
D>//....
D>ofstream out("file.dat", ios::binary);
D>vector<double> vec;
D>out << vec;
D>
Только не помню, как sizeof(T) сработает.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
D>тогда write просто выбросит в поток содержимое класса vector вместо данных которые он содержал.
Так надо ж по-другому перегрузить! В двукратном цикле.
Или ты хочешь единственной перегрузкой обрабатывать все, что угодно????
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Draconus, Вы писали:
D>Подскажите пожалуйста, есть ли возможность делать ввод/вывод в двоичный (binary) поток через операторы << >>? Если можно, короткий пример вывода.
binary|text — это наследие юникса. Разница между ними — сюрприз! — в конвертации символов LF ('\n') <-> CR,LF ("\r\n") и использовании EOF ((char)26) как маркера конца файла.
И больше ни в чем!!!
ostream::operator <<(int n) — это то же самое, что fprintf(fp, "%d", n)
Если хочешь писать двоичные данные — пользуйся функциями двоичного ввода-вывода read()/write() (в голом Си им соответствуют fread(), fwrite()).
Здравствуйте, LaptevVV, Вы писали:
D>>тогда write просто выбросит в поток содержимое класса vector вместо данных которые он содержал. LVV>Так надо ж по-другому перегрузить! В двукратном цикле. LVV>Или ты хочешь единственной перегрузкой обрабатывать все, что угодно????
в данном случае — не все что угодно, а любой вектор (в том числе и вектор векторов). А иначе какой смысл писать типизируемую операцию <<?
Здравствуйте, Draconus, Вы писали:
D>Здравствуйте, LaptevVV, Вы писали:
D>>>тогда write просто выбросит в поток содержимое класса vector вместо данных которые он содержал. LVV>>Так надо ж по-другому перегрузить! В двукратном цикле. LVV>>Или ты хочешь единственной перегрузкой обрабатывать все, что угодно????
D>в данном случае — не все что угодно, а любой вектор (в том числе и вектор векторов). А иначе какой смысл писать типизируемую операцию <<?