Добавил:
t.me Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2 семестр / Литература / Язык программирования С++. Краткий курс. Страуструп

.pdf
Скачиваний:
9
Добавлен:
16.07.2023
Размер:
31.34 Mб
Скачать

180

Глава

10.

Ввод

и

вывод

Здесь

чтение

выполняется

до

тех

пор,

пока

не

встретится

нечто,

что

не

яв­

ляется

целым

числом.

Это

то,

что

обычно

является

концом

ввода.

Здесь

про­

исходит

следующее

-

операция

is>>i

возвращает

ссылку

на

is,

а

проверка

iostream дает true, если поток готов к другой операции.

В общем случае состояние ввода-вывода хранит всю информацию,

необ­

ходимую

для

чтения

или

записи,

такую

как

информация

о

форматировании

10.6),

состояние

ошибки

(например,

достигнут

ли

конец

ввода)

и

какая

бу­

феризация

используется.

В

частности,

пользователь

может

установить

со­

стояние

отражающим,

что

произошла

некоторая

ошибка

(§10.5),

и очистить

состояние,

если

ошибка

не

была

серьезной.

Например,

мы

могли

бы

предста­

вить

себе

версию

read_ints

(),

которая

считывает

строку,

завершающую

ввод:

vector<int>

read_ints(istream&

is,

const

string&

terminator)

vector<int>

for

(int i;

 

res.push

res;

 

is >>

i;

_back(i);

if

(is.eof()) return res;

11

Все

в

порядке:

конец

файла

1

if

(

is.

fail

()

)

//

Ошибка

чтения

int.

Это

строка

завершения?

is.clear();

 

//Сброс состояния

в

 

good()

is.ung

et();

//Помещаем считанную

не цифру

string

s;

 

 

 

 

 

if (cin>>s

&&

s==terminator)

 

 

 

return

res;

 

 

 

//Устанавливаем состояние cin

в

fail():

cin.setstate(ios_base::failbit);

 

 

назад

в

поток

return

res;

auto

v

=

read_ints(cin,"stop");

10.5.

Ввод-вывод

поnьзоватеnьских типов

В

дополнение

к

вводу-выводу

встроенных

типов

и

стандартных

строк

string

библиотека

iostream

позволяет

программистам

определять

ввод­

вывод

для

собственных

типов.

Например,

рассмотрим

простой

тип

Entry,

1

Обратите

внимание,

что

признак

конца

файла

устанавливается

после

неудачной

по­

пытки

чтения

за

концом

файла,

поэтому

часто

использующаяся

начинающими

програм­

мистами

конструкция

while

(

!

is.

eof

()

) {

•1

г",,,111:,с;

}

приводит

к

неверным

результа­

там.

-

Примеч.

пер.

void

use(path

р)

 

{

 

 

 

 

 

 

ofstream

f

{р);

 

if

(!f)

error("Heвepнoe

 

f

<< "Hello,

file ! ";

имя

файла:

10.10.

Файловая система

",

р);

187

<filesystem> в дополнение к path предлагает гов и запросов о свойствах найденных файлов.

типы

для

обхода катало­

Типы

для

работы

с

файловой

системой

(список

неполный)

path filesystem_error directory_entry directory_iterator recursive_ directory

i

terator

Путь в каталоге Исключение файловой системы Запись каталога

Для итерирования по каталогу

Для итерирования по каталогу и его подкаталогам

Рассмотрим

простой,

но

не

такой

уж

нереальный

пример:

void

print_directory(path

try

 

 

{

 

 

 

if

(is_directory(p))

р)

cout for

<<

р

<<

":\n";

 

(const

directory_entry&

cout

<<"

"<<

x.path()

х <<

:

directory_iterator{p)) '\n';

catch

(const filesystem_error&

ех)

cerr

<<

ex.what()

<< '\n';

Строка может быть неявно преобразована в раth,

пользовать print_directory следующим образом:

поэтому

мы

можем

ис­

void

use

()

{

print_directory(".");

print_directory(" .. ");

print_directory("/");

print_directory ("с:");

for

(string s; cin>>s;

 

print_directory(s);

//Текущий

каталог

 

//Родительский каталог

11

Корневой

каталог

Unix

11

Том С в

Windows

 

)

 

 

 

 

 

 

 

 

 

 

 

 

 

10.10. Файловая система

const

path&

f = х;

==

//

Ссылка на

path

записи каталога

if

(f.extension()

".ехе")

 

 

 

файл Windows \n";

 

cout <<

f. stem ()

<<

"

-

выполнимый

else

 

 

 

 

 

 

 

 

 

 

 

 

 

string

n = f.extension()

.string();

==

 

 

if

(n

==

".срр"

11

n

 

".С"

11

n

".схх")

 

 

cout

<< f.stem()

<<

" - исходный

текст C++\n";

189

Мы

используем

ра

th

как

строку,

из

которой

можем

получить

строки

с

раз­

личной

информацией

(например,

расширение

f.

extension

()

. string

()

).

Обратите

внимание,

что

соглашения

об

именах,

естественные языки

и

ко­

дировки

строк

отличаются

большой

сложностью.

Абстракции

библиотеки

для

файловых

систем

предлагают

переносимость

и

существенное

упрощение

проблем.

р,

pl

и

р2

Операции над файловой системой (список неполный)

представляют собой path; е является error_code;

Ь -значение

bool, указывающее успешность операции

 

типа

exists (р)

сору (pl, р2)

copy(pl,p2,e)

b=copy_file(pl,p2)

b=create_directory(p)

b=create_directories (р)

p=current_path () current_path (р) s=file_size (р) b=remove (р)

Ссылается лир на существующий объект файловой

системы?

 

Копирование файлов или каталогов из pl в р2;

 

сообщение об ошибках в виде исключений

 

Копирование файлов или каталогов; сообщение

об

ошибках в виде кодов ошибок

 

Копирование содержимого файла из pl в р2; сообщение

об ошибках в виде исключений

 

Создание нового каталога р; все промежуточные

 

каталоги р должны существовать

 

Создание нового каталога р; создание также всех

промежуточных каталогов для р

 

р-текущий рабочий каталог

 

Делаетр текущим рабочим каталогом

 

s -

количество байтов в р

 

Удаление р, если это файл или пустой каталог

 

Многие

операции

имеют

перегрузки,

которые

принимают

дополнительные

аргументы,

такие

как

разрешения

операционных

систем.

Обработка

таковых