Чтение онлайн

на главную

Жанры

Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:

В качестве альтернативы можно было бы сделать так, чтобы функция

operator>>(istream& is, Month& m)
перед считыванием в цикле присваивала бы объекту
m
пустой объект.

Month m;

while (is >> m) {

y.month[m.month] = m;

m = Month; // "Повторная инициализация" объекта m

}

Попробуем применить это.

//
открываем файл для ввода:

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

string name;

cin >> name;

ifstream ifs(name.c_str);

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

ifs.exceptions(ifs.exceptions|ios_base::badbit); // генерируем bad

// открываем файл для вывода:

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

cin >> name;

ofstream ofs(name.c_str);

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

// считываем произвольное количество объектов класса Year:

vector<Year> ys;

while(true) {

Year y; // объект класса Year каждый раз очищается

if (!(ifs>>y)) break;

ys.push_back(y);

}

cout << " считано " << ys.size << " записей по годам.\n";

for (int i = 0; i<ys.size; ++i) print_year(ofs,ys[i]);

Функцию

print_year
мы оставляем в качестве упражнения.

10.11.3. Изменение представления

Для того чтобы оператор

>>
класса
Month
работал, необходимо предусмотреть способ для ввода символьных представлений месяца. Для симметрии мы описываем способ сравнения с помощью символьного представления. Было бы слишком утомительно писать инструкции
if
, подобные следующей:

if (s=="jan")

m = 1;

else if (s=="feb")

m = 2;

...

Это не просто утомительно; таким образом мы встраиваем названия месяцев в код. Было бы лучше занести их в таблицу, чтобы основная программа оставалась неизменной, даже если мы изменим символьное представление месяцев. Мы решили представить входную информацию в виде класса

vector<string>
, добавив к нему функцию инициализации и просмотра.

vector<string> month_input_tbl; // month_input_tbl[0]=="jan"

void init_input_tbl(vector<string>& tbl)

//
инициализирует вектор входных представлений

{

tbl.push_back("jan");

tbl.push_back("feb");

tbl.push_back("mar");

tbl.push_back("apr");

tbl.push_back("may");

tbl.push_back("jun");

tbl.push_back("jul");

tbl.push_back("aug");

tbl.push_back("sep");

tbl.push_back("oct");

tbl.push_back("nov");

tbl.push_back("dec");

}

int month_to_int(string s)

// Является ли строка s названием месяца? Если да, то возвращаем ее

// индекс из диапазона [0:11], в противном случае возвращаем –1

{

for (int i=0; i<12; ++i) if (month_input_tbl[i]==s) return i;

return –1;

}

На всякий случай заметим, что стандартная библиотека С++ предусматривает более простой способ решения этой задачи. См. тип

map<string,int>
в разделе 21.6.1.

Если мы хотим вывести данные, то должны решить обратную задачу. У нас есть представление месяца с помощью чисел

int
, и мы хотели бы представить их в символьном виде. Наше решение очень простое, но вместо использования таблицы перехода от типа
string
к типу
int
мы теперь используем таблицу перехода от типа
int
к типу
string
.

vector<string> month_print_tbl; // month_print_tbl[0]=="January"

void init_print_tbl(vector<string>& tbl)

// инициализируем вектор представления для вывода

{

tbl.push_back("January");

tbl.push_back("February");

tbl.push_back("March");

tbl.push_back("April");

tbl.push_back("May");

tbl.push_back("June");

tbl.push_back("July");

tbl.push_back("August");

tbl.push_back("September");

tbl.push_back("October");

tbl.push_back("November");

tbl.push_back("December");

}

string int_to_month(int i)

// месяцы [0:11]

{

if (i<0 || 12<=i) error("Неправильный индекс месяца.");

Поделиться:
Популярные книги

Черный Маг Императора 13

Герда Александр
13. Черный маг императора
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 13

Последняя Арена 4

Греков Сергей
4. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 4

Маяк надежды

Кас Маркус
5. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Маяк надежды

Великий перелом

Ланцов Михаил Алексеевич
2. Фрунзе
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Великий перелом

Сопротивляйся мне

Вечная Ольга
3. Порочная власть
Любовные романы:
современные любовные романы
эро литература
6.00
рейтинг книги
Сопротивляйся мне

Инквизитор Тьмы 2

Шмаков Алексей Семенович
2. Инквизитор Тьмы
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Инквизитор Тьмы 2

Мастер Разума V

Кронос Александр
5. Мастер Разума
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Мастер Разума V

Бандит 2

Щепетнов Евгений Владимирович
2. Петр Синельников
Фантастика:
боевая фантастика
5.73
рейтинг книги
Бандит 2

Истребители. Трилогия

Поселягин Владимир Геннадьевич
Фантастика:
альтернативная история
7.30
рейтинг книги
Истребители. Трилогия

Гардемарин Ее Величества. Инкарнация

Уленгов Юрий
1. Гардемарин ее величества
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Гардемарин Ее Величества. Инкарнация

Падение Твердыни

Распопов Дмитрий Викторович
6. Венецианский купец
Фантастика:
попаданцы
альтернативная история
5.33
рейтинг книги
Падение Твердыни

"Дальние горизонты. Дух". Компиляция. Книги 1-25

Усманов Хайдарали
Собрание сочинений
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Дальние горизонты. Дух. Компиляция. Книги 1-25

Ох уж этот Мин Джин Хо 2

Кронос Александр
2. Мин Джин Хо
Фантастика:
попаданцы
5.00
рейтинг книги
Ох уж этот Мин Джин Хо 2

Энфис 6

Кронос Александр
6. Эрра
Фантастика:
героическая фантастика
рпг
аниме
5.00
рейтинг книги
Энфис 6