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


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. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
- 2. Просьба отказаться от оскорблений, угроз и запугиваний.
- 3. Просьба отказаться от нецензурной лексики.
- 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.
Надеемся на Ваше понимание и благоразумие. С уважением, администратор knigkindom.ru.
Оставить комментарий
-
Гость Татьяна24 сентябрь 22:20 Как то не очень... Невеста по ошибке. Я не дам тебе развод - Майя Линн
-
Римма24 сентябрь 21:52 Почему главные героинитпкие идиотки? И сюжет не плохой, и написано хорошо. Но как героиня - так дура дурой.... Хозяйка маленького дома, или Любимая для дракона - Кира Рамис
-
Римма20 сентябрь 12:27 Много ненужных пояснений и отступлений. Весь сюжет теряет свою привлекательность. Героиня иногда так тупит, что читать не... Хозяйка приюта для перевертышей и полукровок - Елена Кутукова