powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Переопределение << и >> для консоли и для файлов
12 сообщений из 12, страница 1 из 1
Переопределение << и >> для консоли и для файлов
    #34355784
First one
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите, будьте добры, можно ли специализировать
переопределение операторов << и >> для работы с консолью и с файлом.

Класс 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);
}

подскажите как быть.
...
Рейтинг: 0 / 0
Переопределение << и >> для консоли и для файлов
    #34355861
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если ты перегружаешь для класса, то считывать конкрентые значение внутри операторов можно обычным образом (cin>>I) и выводить то же (cout<< i)

аффтопитезь: объект либо именован, либо не существует
...
Рейтинг: 0 / 0
Переопределение << и >> для консоли и для файлов
    #34355872
First one
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aklinесли ты перегружаешь для класса, то считывать конкрентые значение внутри операторов можно обычным образом (cin>>I) и выводить то же (cout<< i)

аффтопитезь: объект либо именован, либо не существует

так дело в том что мне для консоли нужно чтобы ввод\вывод был с подсказками... типа введите чтото, а ввод\вывод для консоли чтобы был соответсовенно без подсказок
в классе определены оба варианта
а для listа как разделить что мол когда копируем в поток ostream использовать перегрузку с подсказками а когда в поток ofstream то без подсказок?
...
Рейтинг: 0 / 0
Переопределение << и >> для консоли и для файлов
    #34355896
Фотография 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'ов в природе не существует. Да и врядли у тебя получится нарисовать выводить номер строки без написания собственного функтора :)
...
Рейтинг: 0 / 0
Переопределение << и >> для консоли и для файлов
    #34355926
First one
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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... это возможно?
...
Рейтинг: 0 / 0
Переопределение << и >> для консоли и для файлов
    #34357489
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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));
}
...
Рейтинг: 0 / 0
Переопределение << и >> для консоли и для файлов
    #34358260
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
First oneсейчас сделал вот так
Код: plaintext
1.
2.
3.
4.
5.
ofstream& operator << (ofstream &f, ContactList &cl)
{	
	list<Contact>::iterator p = cl.cList.begin();
	while(p != cl.cList.end()){ f << *p; p++; }
	return f;
}
но так не красиво... хочется както используя copy... это возможно?да забей, нормально всё. Три строчки – не десять.
...
Рейтинг: 0 / 0
Переопределение << и >> для консоли и для файлов
    #34358754
First one
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maXmo First oneсейчас сделал вот так
Код: plaintext
1.
2.
3.
4.
5.
ofstream& operator << (ofstream &f, ContactList &cl)
{	
	list<Contact>::iterator p = cl.cList.begin();
	while(p != cl.cList.end()){ f << *p; p++; }
	return f;
}
но так не красиво... хочется както используя copy... это возможно?да забей, нормально всё. Три строчки – не десять.

эффективность страдает... надо же старатся использовать стандартные методы если они есть
...
Рейтинг: 0 / 0
Переопределение << и >> для консоли и для файлов
    #34359845
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а чего такого нестандартного ты нашёл в цикле while?
...
Рейтинг: 0 / 0
Переопределение << и >> для консоли и для файлов
    #34359849
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а эффективность пострадает как раз таки если будешь использовать функторы
...
Рейтинг: 0 / 0
Переопределение << и >> для консоли и для файлов
    #34360205
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какая эффективность? Компиляции что-ли?
...
Рейтинг: 0 / 0
Переопределение << и >> для консоли и для файлов
    #34360232
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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);
}
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Переопределение << и >> для консоли и для файлов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]