Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Программирование – 2 курс осень 2020 – 4 занятие

ТиМПИ
September 29, 2020
190

Программирование – 2 курс осень 2020 – 4 занятие

ТиМПИ

September 29, 2020
Tweet

More Decks by ТиМПИ

Transcript

  1. dscs.pro spbu.ru 2/20 Стандартная библиотека • Минимальный полный набор возможностей

    для обеспечения базовых потребностей • Если что-то содержит, то должна реализовывать лучшим образом • Алгоритмически эффективна • Заголовочные файлы без .h: #include <iostream> #include <string> #include <vector>
  2. dscs.pro spbu.ru 3/20 Потоки ввода и вывода • Поток (англ.

    stream) – это абстракция, используемая для чтения и записи файлов, сокетов и т.п. в единой манере. Потенциально бесконечная последовательность данных, к которым можно получать последовательный доступ.
  3. dscs.pro spbu.ru 4/20 dscs.pro Основные принципы библиотеки IO (input/outut) •

    Класс istream (input stream — поток ввода) обеспечивает операции ввода. • Класс ostream (output stream— поток вывода) обеспечивает операции вывода. • Объект cin класса istream читает данные со стандартного устройства ввода. • Объект cout класса ostream записывает данные на стандартное устройство вывода. • Объект cerr класса ostream записывает данные на стандартное устройство сообщений об ошибке. Объект cerr, как правило, используется для сообщений об ошибках в программе. • Оператор >> используется для чтения данных, передаваемых в объект класса istream. • Оператор << используется для записи данных, передаваемых в объект класса ostream. Работаем с потоками ввода и вывода через объекты классов
  4. dscs.pro spbu.ru 5/20 dscs.pro Классы ввода-вывода • <iostream>: • istream,

    wistream — читают данные из потока • ostream, wostream — записывают данные в поток • iostream, wiostream — читают и записывают данные в поток • <fstream>: • ifstream, wifstream — читают данные из файла • ofstream, wofstream — записывают данные в файл • fstream, wfstream — читают и записывают данные в файл • <sstream> • istringstream, wistringstream — читают данные из строки • ostringstream, wostringstream — записывают данные в строку • stringstream, wstringstream — читают и записывают данные в строку
  5. dscs.pro spbu.ru 6/20 dscs.pro #include <iostream> using namespace std; int

    main() { int ival; cin >> ival; return 0; } Пример #include <iostream> #include <fstream> using namespace std; int main () { ofstream myfile; myfile.open ("example.txt"); myfile << “Hello World \n"; myfile.close(); return 0; } #include <string> #include <iostream> #include <sstream> int main () { stringstream ss; ss.str ("Example string"); string s = ss.str(); cout << s << '\n’; return 0; }
  6. dscs.pro spbu.ru 7/20 dscs.pro объект производного класса можно использовать так,

    как будто это объект класса, от которого он происходит Иерархия наследования Взаимоотношения между типами ввода и вывода fstream sstream iostream
  7. dscs.pro spbu.ru 8/20 dscs.pro Методы класса istream >> Оператор извлечения

    данных. Игнорирует все пробелы, символы табуляции и символ новой строки get() Извлекает символ из входного потока. Не считывает символ новой строки getline() Извлекает символ из входного потока. Считывает символ новой строки peek() Подсматривает следующий символ в потоке putback() Кладет последний считанный символ обратно
  8. dscs.pro spbu.ru 9/20 dscs.pro Пример работы #include <iostream> using namespace

    std; int main() { int ival; cin >> ival; \\ при вводе строки - ошибка return 0; } #include <iostream> using namespace std; int main() { int ival; while (cin >> ival) \\ ok { \\… } return 0; }
  9. dscs.pro spbu.ru 10/20 dscs.pro Состояние объекта класса ios (и производных

    от него) содержится в его закрытом элементе _state в виде набора битов. Флаги состояния Бит Означает Функции проверки состояний good() eof() fail() bad() rdstate() goodbit Нет ошибок true false false false goodbit eofbit Конец файла false true false false eofbit failbit Ошибка формата или преобразования. После очистки работа с потоком может быть продолжена. false false true false failbit badbit Индицирует серьезную ошибку потока, связанную обычно с буферными операциями или аппаратурой. Скорее всего, поток далее использовать невозможно. false false true true badbit
  10. dscs.pro spbu.ru 11/20 dscs.pro Управление флагами состояния #include <iostream> using

    namespace std; int main() { // запомнить текущее состояние объекта cin auto old_state = cin.rdstate(); cin.clear(); // сделать объект cin допустимым process_input(cin); // использовать объект cin cin.setstate(old_state); // вернуть объект cin в // прежнее состояние return 0; }
  11. dscs.pro spbu.ru 12/20 dscs.pro • Каждый объект ввода-вывода управляет буфером,

    используемым для хранения данных, которые программа читает или записывает. • Использование буфера позволяет операционной системе объединить несколько операций вывода данной программы. • Запись в устройство медленное, возможность операционной системы объединить несколько операций вывода в одну способствует повышению производительности. Буферы
  12. dscs.pro spbu.ru 13/20 dscs.pro • Программа завершается нормально. Все буфера

    вывода освобождаются при выходе из функции main(). • В некий случайный момент времени буфер может оказаться заполненным. В этом случае перед записью следующего значения происходит сброс буфера. • Сброс буфера можно осуществить явно, использовав такой манипулятор, как endl. • Используя манипулятор unitbuf, можно установить такое внутреннее состояние потока, чтобы буфер освобождался после каждой операции вывода. Для объекта cerr манипулятор unitbuf установлен по умолчанию, поэтому запись в него приводит к немедленному выводу. • Поток вывода может быть связан с другим потоком. В таком случае буфер привязанного потока сбрасывается при каждом чтении или записи другого потока. По умолчанию объекты cin и cerr привязаны к объекту cout. Следовательно, чтение из потока cin или запись в поток cerr сбрасывает буфер потока cout. Сброс буфера
  13. dscs.pro spbu.ru 14/20 dscs.pro Буфер вывода не сбрасывается, если программа

    завершается аварийно. При попытке отладить аварийно завершающуюся программу необходимо гарантировать, что любой подозрительный вывод будет сброшен сразу. Внимание! 14/0
  14. dscs.pro spbu.ru 15/20 dscs.pro Пример работы #include <iostream> \\ запись

    в файл #include <fstream> using namespace std; int main () { ofstream myfile; myfile.open("example.txt"); myfile << "Writing this to a file.\n"; myfile.close(); return 0; } #include <iostream> \\ чтение из файла #include <fstream> #include <string> using namespace std; int main(){ string line; ifstream myfile("example.txt"); if (myfile.is_open()) { while (getline(myfile,line))cout << line << '\n'; myfile.close(); } else cout << "Unable to open file"; return 0;}
  15. dscs.pro spbu.ru 16/20 dscs.pro Ввод и вывод в файл fstream

    fstrm Создает несвязанный файловый поток, fstream — это один из типов, определенных в заголовке fstream fstream fstrm(s) Создает объект класса fstream и открывает файл по имени s. fstream fstrm (s, режим) Подобен предыдущему конструктору, но открывает файл s в указанном режиме fstrm.open (s) fstrm.open (s, режим) Открывает файл s и связывает его с потоком fstrm. fstrm.close() Закрывает файл, с которым связан поток fstrm. fstrm.is_open () Возвращает значение типа bool, указывающее, был ли cвязанный с потоком fstrm файл успешно открыт и не был ли он закрыт Операции, специфические для типов заголовка fstream
  16. dscs.pro spbu.ru 17/20 dscs.pro Пример ifstream input(argv[1]); // открыть файл

    транзакций продаж ofstream output(argv[2]); // открыть файл вывода Sales_data total; // переменная для хранения текущей суммы if (read(input,total)) { // прочитать первую транзакцию Seles_date trans // переменная для хранения данных следующей // транзакции while (read(input,trans)) { // читать остальные транзакции if (total.isbn() == trans.isbn()) // проверить isbn total.combine{trans};// обновить текущую сумму else { print(output, total) << endl; // отобразить // результат total = trans; // обработать следующую книгу } } print(output, total) << endl; // отобразить последнюю транзакцию } else // ввода нет cerr << "No data?!" << endl;
  17. dscs.pro spbu.ru 18/20 dscs.pro Режимы файла Константа Описание ios_base::in открыть

    файл для чтения ios_base::out открыть файл для записи ios_base::ate при открытии переместить указатель в конец файла ios_base::app открыть файл для записи в конец файла ios_base::trunc удалить содержимое файла, если он существует ios_base::binary открытие файла в двоичном режиме
  18. dscs.pro spbu.ru 19/20 dscs.pro Резюме Язык C++ использует библиотечные классы

    для обработки потоков ввода и вывода. • Класс iоstгеam отрабатывает ввод-вывод на консоль. • Класс fstream отрабатывает ввод-вывод в именованным файл. • Класс stringstream отрабатывает ввод-вывод в строки в оперативной памяти. Классы fstream и stringstream связаны происхождением от класса iostream. Классы ввода происходят от класса istream , а классы вывода— от класса ostгearn. Таким образом, операции, которые могут быть выполнены с объектом класса istream, могут быть также выполнены с объектом класса ifstream или istringstream. Аналогично для классов вывода, происходящих от класса ostream. Каждый объект ввода-вывода обладает набором флагов состояния, указывающих, возможен ли ввод-вывод через этот объект. Если произошла ошибка (например, встретился конец файла в потоке ввода), то состояние объекта окажется таково, что никакой дальнейший ввод невозможен, пока не будет исправлена. Библиотека предоставляет набор функций для установки и проверки этих состояний
  19. dscs.pro spbu.ru 21/20 dscs.pro Задачи 1) Файл содержит два действительных

    числа. Создайте выходной файл и запишите в него сумму, произведение, остаток от деления (с новой строки). 2) Дан файл Test.txt, содержащий строчку «Hello». Открыть его, прочитать, вывести в консоль содержимое. Дописать в файл « World!», закрыть файл. 3) Дан файл Test.txt, содержащий строчку «Hello World!». Вывести его содержимое побитово.