Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Задачка из Страуструпа

12K
20 апреля 2007 года
@leX
21 / / 14.06.2006
Здравствуйте, объясните, пожалуйста, что от меня хотят...
Задачка :"Определите тип Name_and_address(имя и адрес). Определите для него операторы << и >>. Скопируйте поток объектов типа Name_and_address, и вставьте в него столько ошибок, сколько сможете придумать (например, ошибки формата и преждевременные концы строки). Обработайте эти ошибки таким образом, чтобы гарантировать, что функция копирования прочитает большинство правильно отформатированных объектов Name_and_address, хотя на вводе будут чередоваться "плохие" значения с "хорошими"." Страуструп 3-е издание стр. 722, глава 21.
Класс, ввод и вывод я объявил:
Код:
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;
};

Объяснить, пожалуйста, что значит "скопировать поток" и "вставить в него ошибки".
Заранее благодарен.
28K
22 апреля 2007 года
Vladimir_G
3 / / 22.04.2007
To @lex:
Думаю, что неточности формулировки задачи - следствие не очень хорошего перевода. "Скопировать поток" - использовать выходной поток одной программы в качестве входного потока другой. "Вставить в него ошибки" - специально сгенерировать поток с ошибками.
То есть пишем пример, который будет выводить в выходной поток последовательность объектов заданного класса с данными по шаблону, в том числе - по условию содержащими ряд ошибок. Затем - пример, который будет брать данные из входного потока, разбирать и загонять в объекты класса Name_and_adress, конечно с контролем ошибок.
12K
23 апреля 2007 года
@leX
21 / / 14.06.2006
Цитата: Vladimir_G
To @lex:
"...Скопировать поток" - использовать выходной поток одной программы в качестве входного потока другой....



Насчет этого сомневаюсь, потому что Страуструп дает упражнения на изученный материал, а о взаимодействии потоков разных программ там точно ничего не было.

28K
23 апреля 2007 года
Vladimir_G
3 / / 22.04.2007
Я говорю о возможности перенаправления потоков ввода/вывода между разными исполняемыми файлами, которую предлагает сама операционная система. Это не предмет рассмотрения учебника по С++. Поэтому Страуструп ничего об этом не говорит.
Для командной строки, если InputProg.exe читает с консоли, а OutputProg.exe пишет на консоль, то ввод с клавиатуры для InputProg можно заменить потоком вывода от OutputProg. Пример командной строки с конвеерной обработкой:
OutputProg.exe | InputProg.exe
Вертикальная черта - (ASCII код 179).
Подробнее об использовании стандартных потоков ввода/вывода можно прочитать здесь
http://www.citforum.ru/operating_systems/ois/c050.shtml
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог