class Name_and_address
{
public:
std::string name;
void* address;
Name_and_address(std::string s="", void* adr=0)
:name(s),address(adr){};
};
ostream& operator<<(ostream& s, Name_and_address z)
{
return s<<'('<<z.name<<','<<z.address<<')';
};
istream& operator>>(istream& s, Name_and_address& z)
{
string Name = "";
void* Adr = 0;
char c = 0;
s>>c;
// проверка по аналогии с примером на комплексные числа из
//Страуструпа стр.688
if(c=='(')
{
s>>Name>>c;
if(c==',')
s>>Adr>>c;
if(c!=')')
s.clear(ios_base::failbit);
}else{
s.putback(c);
s>>Name;
}
if(s)
z = Name_and_address(Name,Adr);
return s;
};
Задачка из Страуструпа
Задачка :"Определите тип Name_and_address(имя и адрес). Определите для него операторы << и >>. Скопируйте поток объектов типа Name_and_address, и вставьте в него столько ошибок, сколько сможете придумать (например, ошибки формата и преждевременные концы строки). Обработайте эти ошибки таким образом, чтобы гарантировать, что функция копирования прочитает большинство правильно отформатированных объектов Name_and_address, хотя на вводе будут чередоваться "плохие" значения с "хорошими"." Страуструп 3-е издание стр. 722, глава 21.
Класс, ввод и вывод я объявил:
Код:
Объяснить, пожалуйста, что значит "скопировать поток" и "вставить в него ошибки".
Заранее благодарен.
Думаю, что неточности формулировки задачи - следствие не очень хорошего перевода. "Скопировать поток" - использовать выходной поток одной программы в качестве входного потока другой. "Вставить в него ошибки" - специально сгенерировать поток с ошибками.
То есть пишем пример, который будет выводить в выходной поток последовательность объектов заданного класса с данными по шаблону, в том числе - по условию содержащими ряд ошибок. Затем - пример, который будет брать данные из входного потока, разбирать и загонять в объекты класса Name_and_adress, конечно с контролем ошибок.
Цитата: Vladimir_G
To @lex:
"...Скопировать поток" - использовать выходной поток одной программы в качестве входного потока другой....
"...Скопировать поток" - использовать выходной поток одной программы в качестве входного потока другой....
Насчет этого сомневаюсь, потому что Страуструп дает упражнения на изученный материал, а о взаимодействии потоков разных программ там точно ничего не было.
Для командной строки, если InputProg.exe читает с консоли, а OutputProg.exe пишет на консоль, то ввод с клавиатуры для InputProg можно заменить потоком вывода от OutputProg. Пример командной строки с конвеерной обработкой:
OutputProg.exe | InputProg.exe
Вертикальная черта - (ASCII код 179).
Подробнее об использовании стандартных потоков ввода/вывода можно прочитать здесь
http://www.citforum.ru/operating_systems/ois/c050.shtml