|
|
|
Переопределение << и >> для консоли и для файлов
|
|||
|---|---|---|---|
|
#18+
Подскажите, будьте добры, можно ли специализировать переопределение операторов << и >> для работы с консолью и с файлом. Класс Cls c содержит несколько string-ов. есть ксласс Cls2 который содержит list этих классов list<Cls> lc; для Cls << и >> переопределены для потоков ostream/istream и ofstream/ifstream нужно такде переопределить эти операторы для Cls2 Хочу чтобы cout << cl выводило на консоль чтото типа Строка 1: бла бла бла1 Строка 2: ля ля ля2 Строка 1: бла бла бла1 Строка 2: ля ля ля2 и cin >> c запрашивало ввод с подсказками типа Введите строку 1: Введите строку 2: а для работы с файлами file_out << cl и file_in >> cl просто записывало в файл и читало из него сами строки бла бла бла1 ля ля ля1 бла бла бла2 ля ля ля2 сам пишу так, копирую list в консольный выходной поток ostream& operator << (ostream &s, const ContactList &cl) { copy(cl.cList.begin(), cl.cList.end(), ostream_iterator<Cls>(s)); return (s); } проблема возникла изза того что нельзя написать тоже самое для файлового потока, выдает ошибку что copy не определена для ofstream_iterator ofstream& operator << (ofstream &s, const ContactList &cl) { copy(cl.cList.begin(), cl.cList.end(), ofstream_iterator<Cls>(s)); - error return (s); } подскажите как быть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 18:00 |
|
||
|
Переопределение << и >> для консоли и для файлов
|
|||
|---|---|---|---|
|
#18+
если ты перегружаешь для класса, то считывать конкрентые значение внутри операторов можно обычным образом (cin>>I) и выводить то же (cout<< i) аффтопитезь: объект либо именован, либо не существует ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 18:27 |
|
||
|
Переопределение << и >> для консоли и для файлов
|
|||
|---|---|---|---|
|
#18+
Aklinесли ты перегружаешь для класса, то считывать конкрентые значение внутри операторов можно обычным образом (cin>>I) и выводить то же (cout<< i) аффтопитезь: объект либо именован, либо не существует так дело в том что мне для консоли нужно чтобы ввод\вывод был с подсказками... типа введите чтото, а ввод\вывод для консоли чтобы был соответсовенно без подсказок в классе определены оба варианта а для listа как разделить что мол когда копируем в поток ostream использовать перегрузку с подсказками а когда в поток ofstream то без подсказок? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 18:31 |
|
||
|
Переопределение << и >> для консоли и для файлов
|
|||
|---|---|---|---|
|
#18+
First one ostream& operator << (ostream &s, const ContactList &cl) { copy(cl.cList.begin(), cl.cList.end(), ostream_iterator<Cls>(s)); return (s); } проблема возникла изза того что нельзя написать тоже самое для файлового потока, выдает ошибку что copy не определена для ofstream_iterator ofstream& operator << (ofstream &s, const ContactList &cl) { copy(cl.cList.begin(), cl.cList.end(), ofstream_iterator<Cls>(s)); - error return (s); } подскажите как быть. Это не copy не определен, просто ofstream_iterator'ов в природе не существует. Да и врядли у тебя получится нарисовать выводить номер строки без написания собственного функтора :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 18:39 |
|
||
|
Переопределение << и >> для консоли и для файлов
|
|||
|---|---|---|---|
|
#18+
blinded First one ostream& operator << (ostream &s, const ContactList &cl) { copy(cl.cList.begin(), cl.cList.end(), ostream_iterator<Cls>(s)); return (s); } проблема возникла изза того что нельзя написать тоже самое для файлового потока, выдает ошибку что copy не определена для ofstream_iterator ofstream& operator << (ofstream &s, const ContactList &cl) { copy(cl.cList.begin(), cl.cList.end(), ofstream_iterator<Cls>(s)); - error return (s); } подскажите как быть. Это не copy не определен, просто ofstream_iterator'ов в природе не существует. Да и врядли у тебя получится нарисовать выводить номер строки без написания собственного функтора :) ну вот на примере кароче это переопределение оператора для класса Contact ostream& operator << (ostream &s, const Contact &c) { s << endl; s << "FIO: " << c.lastname << ' ' << c.firstname << ' ' << c.surname << endl; s << "Tel.: " << c.tel << endl; s << "Adress: " << c.adr << endl; s << "E-mail: " << c.email << endl; return (s); } ofstream& operator << (ofstream &f, const Contact &c) { f << c.lastname << endl; f << c.firstname << endl; f << c.surname << endl; f << c.tel << endl; f << c.adr << endl; f << c.email << endl; return (f); } пишу cout << c получаю в консоль результат первой функции пишу file_out << с получаю в файл результат второй функции теперь для списка этих контактов (класс ContactList содержит cList - список контактов) ostream& operator << (ostream &s, const ContactList &cl) { copy(cl.cList.begin(), cl.cList.end(), ostream_iterator<Contact>(s)); return (s); } пишу cout << cl на экран выводится список контактов в отформатированном виде... тоесть работает первая функция для вывода контакта вопрос в том можно ли както используя copy написать вывод списка контактов в файл так чтобы использовалась вторая функция... тоесть чтобы просто записывались значения полей сейчас сделал вот так ofstream& operator << (ofstream &f, ContactList &cl) { list<Contact>::iterator p = cl.cList.begin(); while (p != cl.cList.end()) { f << *p; p++; } return (f); } но так не красиво... хочется както используя copy... это возможно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2007, 18:50 |
|
||
|
Переопределение << и >> для консоли и для файлов
|
|||
|---|---|---|---|
|
#18+
First one ofstream& operator << (ofstream &f, ContactList &cl) { list<Contact>::iterator p = cl.cList.begin(); while (p != cl.cList.end()) { f << *p; p++; } return (f); } но так не красиво... хочется както используя copy... это возможно? Ну ежели хочется потрахаться, напиши собственный output_iterator, с реализацией через ostream_iterator и который еще немного шьет на дому. Хотя на понимаю чем тебе не нравится for_each + рукописный функциональный объект Ну что-нибудь типа (САМ НЕ ПРОБОВАЛ!!!) typedef list<Contact>::const_iterator ContactIterator; template <class OStream> class ContactPrinter : public std::binary_function<ContactIteartor, OStream, OStream> { public: typedef std::binary_function<ContactIterator, OStream> Parent; typedef typename Parent::result_type ResultType; typedef typename Parent::first_argument_type FirstArgumentType; typedef typename Parent::second_argument_type SecondArgumentType; ResultType operator() (FirstArgumentType arg1, SecondArgumentType arg2) { // здесь рисуем общую реализацию для оstream } }; template<> class ContactPrinter<ofstream> :: public std::binary_function<ContactIteartor, ofstream, ofstream> { // implementation for ofstream here typedef std::binary_function<contactIterator, OStream> Parent; typedef typename Parent::result_type ResultType; typedef typename Parent::first_argument_type FirstArgumentType; typedef typename Parent::second_argument_type SecondArgumentType; ResultType operator() (FirstArgumentType arg1, SecondArgumentType arg2) { // здесь рисуем реализацию для оfstream } } // в коде template <class OStream> OStream& operator << (OStream &out, const ContactList &cl) { return std::for_each(cl.cList.begin(), cl.cList.end(), bind2nd(ContactPrinter<ContactIterator, OStream&>(), out)); } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2007, 13:31 |
|
||
|
Переопределение << и >> для консоли и для файлов
|
|||
|---|---|---|---|
|
#18+
First oneсейчас сделал вот так Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2007, 16:37 |
|
||
|
Переопределение << и >> для консоли и для файлов
|
|||
|---|---|---|---|
|
#18+
maXmo First oneсейчас сделал вот так Код: plaintext 1. 2. 3. 4. 5. эффективность страдает... надо же старатся использовать стандартные методы если они есть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2007, 18:55 |
|
||
|
Переопределение << и >> для консоли и для файлов
|
|||
|---|---|---|---|
|
#18+
а чего такого нестандартного ты нашёл в цикле while? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2007, 11:09 |
|
||
|
Переопределение << и >> для консоли и для файлов
|
|||
|---|---|---|---|
|
#18+
а эффективность пострадает как раз таки если будешь использовать функторы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2007, 11:10 |
|
||
|
Переопределение << и >> для консоли и для файлов
|
|||
|---|---|---|---|
|
#18+
Какая эффективность? Компиляции что-ли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2007, 12:29 |
|
||
|
Переопределение << и >> для консоли и для файлов
|
|||
|---|---|---|---|
|
#18+
First one ofstream& operator << (ofstream &f, ContactList &cl) { list<Contact>::iterator p = cl.cList.begin(); while (p != cl.cList.end()) { f << *p; p++; } return (f); } Кстати на счет эффективности Я бы использовал префиксный инкремент ofstream& operator << (ofstream &f, ContactList &cl) { for(list<Contact>::const_iterator p = cl.cList.begin(); p != cl.cList.end() && f << *p; ++p); return (f); } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2007, 12:35 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34358260&tid=2029357]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
141ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 208ms |
| total: | 426ms |

| 0 / 0 |
