LoveRead.info » Книги » Разная литература » Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп

Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп

Книгу Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп читаем онлайн бесплатно полную версию! Чтобы начать читать не надо регистрации. Напомним, что читать онлайн вы можете не только на компьютере, но и на андроид (Android), iPhone и iPad. Приятного чтения!

290 0 18:03, 26-08-2023
Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп
26 август 2023

Книга Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп читать онлайн бесплатно без регистрации

Специальное издание самой читаемой и содержащей наиболее достоверные сведения книги по C++. Книга написана Бьярне Страуструпом — автором языка программирования C++ — и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный -ориентированный подход к созданию программных продуктов. Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++. Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие. Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток. Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».

    1 ... 105 106 107 108 109 110 111 112 113 ... 337
    Перейти на страницу:
    class="p1">Представим информацию в виде структуры Reading.

    struct Reading {      // данные о температуре воздуха

      int hour;           // часы после полуночи [0:23]

      double temperature; // по Фаренгейту

      Reading(int h, double t) :hour(h), temperature(t) { }

    };

    В таком случае данные можно считать следующим образом:

    vector<Reading> temps; // здесь хранится считанная информация

    int hour;

    double temperature;

    while (ist >> hour >> temperature) {

      if (hour < 0 || 23 <hour) error("Некорректное время");

      temps.push_back(Reading(hour,temperature));

    }

    Это типичный цикл ввода. Поток istream с именем ist мог бы быть файловым потоком ввода (ifstream), как в предыдущем разделе, стандартным потоком ввода (cin) или любым другим потоком istream. Для кода, подобного приведенному выше, не имеет значения, откуда поток istream получает данные. Все, что требуется знать нашей программе, — это то, что поток ist относится к классу istream и что данные имеют ожидаемый формат. Следующий раздел посвящен интересному вопросу: как выявлять ошибки в наборе входных данных и что можно сделать после выявления ошибки форматирования.

    Записать данные в файл обычно проще, чем считать их оттуда. Как и прежде, как только поток проинициализирован, мы не обязаны знать, что именно он собой представляет. В частности, мы можем использовать выходной файловый поток (ofstream) из предыдущего раздела наравне с любым другим потоком ostream.

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

    for (int i=0; i<temps.size(); ++i)

      ost << '(' << temps[i].hour << ',' << temps[i].temperature << ")n";

    Затем итоговая программа прочитала бы исходные данные из файла и создала новый файл в формате (час, температура).

     

     Поскольку файловые потоки автоматически закрывают свои файлы при выходе из области видимости, полная программ принимает следующий вид:

    #include "std_lib_facilities.h"

    struct Reading {      // данные о температуре воздуха

      int hour;           // часы после полуночи [0:23]

      double temperature; // по Фаренгейту

      Reading(int h, double t):hour(h), temperature(t) { }

    };

    int main()

    {

      cout << "Пожалуйста, введите имя файла для ввода: ";

      string name;

      cin >> name;

      ifstream ist(name.c_str()); // поток ist считывает данные

                                  // из файла,

                                  // имя которого задано строкой name

      if (!ist) error("Невозможно открыть файл для ввода ",name);

      cout << "Пожалуйста, введите имя файла для вывода: ";

      cin >> name;

      ofstream ost(name.c_str()); // поток ost записывает данные

                                  // в файл, имя которого задано

                                  // строкой name

      if (!ost) error("Невозможно открыть файл для вывода ",name);

      vector<Reading> temps;      // здесь хранится считанная информация

      int hour;

      double temperature;

      while (ist >> hour >> temperature) {

        if (hour < 0 || 23 <hour) error("Некорректное время");

        temps.push_back(Reading(hour,temperature));

      }

      for (int i=0; i<temps.size(); ++i)

        ost << '(' << temps[i].hour << ','

            << temps[i].temperature << ")n";

    }

    10.6. Обработка ошибок ввода-вывода

    Вводя данные, мы должны предвидеть ошибки и обрабатывать их. Какими бывают ошибки? Как их обрабатывать? Ошибки возникают из-за того, что их совершают люди (неправильно поняли инструкцию, сделали опечатку, по клавиатуре прошлась кошка и т.д.), из-за того, что файлы не соответствуют спецификациям, из-за того, что программисты имеют неправильное представление об ожидаемых данных, и т.д. Возможности для совершения ошибок при вводе данных ничем не ограничены! Однако поток istream сводит их все к четырем возможным классам, которые называют состояниями потока (stream state)

     

     К сожалению, различия между состояниями fail() и bad() определены неточно и зависят от точки зрения программистов на определение операций ввода-вывода для новых типов. Однако основная идея проста: если операция ввода обнаруживает простую ошибку форматирования, она позволяет потоку вызвать функцию fail(), предполагая, что вы (пользователь операции ввода) способны ее исправить. Если же, с другой стороны, произошло нечто совершенно ужасное, например неправильное чтение с диска, то операция ввода позволяет потоку вызвать функцию bad(), предполагая, что вам ничего не остается делать, кроме как отказаться от попытки считать данные из потока. Это приводит нас к следующей общей логике:

    int i = 0;

    cin >> i;

    if (!cin) { // мы окажемся здесь (и только здесь),

                // если операция ввода не выполнена

      if (cin.bad()) error("cin испорчен "); // поток поврежден: стоп!

      if (cin.eof()) {

        // входных данных больше нет

        // именно так мы хотели бы завершить ввод данных

      }

      if (cin.fail()) { // с потоком что-то случилось

        cin.clear();    // приготовиться к дальнейшему вводу

                        // исправление ситуации

      }

    }

    Выражение !cin можно прочитать как “поток cin в плохом состоянии”, или “с потоком cin что-то случилось”, или “поток cin не находится в состоянии good()”. Это выражение противоположно по смыслу выражению “операция успешно завершена”. Обратите внимание на инструкцию cin.clear(), в которой обрабатывается состояние fail(). Если поток поврежден, то мы, вероятно, можем его восстановить. Для того чтобы сделать это, мы явно выводим поток из состояния fail() и можем снова просматривать последовательность символов, находящихся в этом потоке; функция clear() гарантирует, что после выполнения вызова cin.clear() поток cin перейдет в состояние good().

    Рассмотрим пример использования состояния потока. Представим себе, что считываем в вектор последовательность целых чисел, которые могут завершаться символом * или признаком конца файла (<Ctrl+Z> в системе Windows или <Ctrl+D> в системе Unix). Например, пусть в файле записаны следующие числа:

    1 2 3 4 5 *

    Ввести их можно с помощью такой функции:

    void fill_vector(istream& ist, vector<int>& v, char terminator)

      // считывает целые числа из потока ist в вектор v,

      // пока не будет достигнут признак eof() или символ завершения

    {

      int i = 0;

      while (ist >> i) v.push_back(i);

      if

    1 ... 105 106 107 108 109 110 111 112 113 ... 337
    Перейти на страницу:
    1. Жалоба
    Отзывы - 0

    Прочитали книгу? Предлагаем вам поделится своим отзывом от прочитанного(прослушанного)! Ваш отзыв будет полезен читателям, которые еще только собираются познакомиться с произведением.


    Уважаемые читатели, слушатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

    • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
    • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
    • 3. Просьба отказаться от нецензурной лексики.
    • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

    Надеемся на Ваше понимание и благоразумие. С уважением, администратор LoveRead.info.


    Установить VPN и читай слушай бесплатно

    Новые отзывы

    1. Людмила Хофман Людмила Хофман10 июнь 22:13 У меня перевернулся мир после прочтения ваших книг! Так приятно и чисто на душе, ведь по сути неважно кто с кем , а только любовь... Долгая игра - Рейчел Рид
    2. Анна Анна08 июнь 11:28 Спасибо за новую историю жизни и любви на сайте,прочитала с удовольствием .... Давай поженимся - Юлия Резник
    3. Елена Елена08 июнь 11:13 Прочла несколько романов этого, без сомнения, талантливого автора. Впечатление прекрасное, но хотелось бы когда-нибудь прочесть... Предатель. Ты врал мне годами - Арина Арская
    Все комметарии
    Новинки бесплатной онлайн библиотеки