Лекция основы си++ 7




Скачать 1.94 Mb.
Название Лекция основы си++ 7
страница 8/18
Дата публикации 08.06.2014
Размер 1.94 Mb.
Тип Лекция
literature-edu.ru > Курсовая работа > Лекция
1   ...   4   5   6   7   8   9   10   11   ...   18

ЛЕКЦИЯ 4. Текстовые файлы и потоки ввода/вывода

1. Назначение файлов

Во всех рассматривавшихся до сих пор программах ввод данных производился только с клавиатуры, а вывод - только на экран. Если в качестве устройств вво­да/вывода ограничиться только клавиатурой и экраном, то в таком случае будет сложно обработать большие объемы входных данных. Выходные данные, отображен­ные на экране, после выключения компьютера безвозвратно теряются.

Для устранения подобных проблем удобно сохранять данные на запоминаю­щих устройствах, предназначенных для долговременного хранения данных (обычно это магнитные диски). Данные, сгенерированные с помощью одной программы, мож­но сохранить на диске и в дальнейшем, при необходимости, извлечь и обработать в другой программе.

На дисках данные хранятся в виде структур данных, обслуживаемых операци­онной системой, - в виде файлов. Файл проще всего представить как линейную по­следовательность символов. Текст этой лекции (если не учитывать специальные сим­волы форматирования) можно сохранить в файле с именем "Lecture_4.txt" в виде (рис. 1):

Л1

"Е" "К" ГЦ1 "И" "Я' " " '4' '.' " " "Г"

Рис. 1. Начало файла "lecture_4 . txt".

2. Потоки ввода/вывода

Перед началом изучения файловых операций в Си++, необходимо ознакомить­ся с понятием потока ввода/вывода. Поток напоминает "канал" или "трубу", через ко­торую данные поступают от передатчика к приемнику. Исключительно важная осо­бенность потоковой обработки данных состоит в том, что элементы данных можно посылать или считывать из потока только по одному за раз, т.е. последовательно.

В данном курсе рассматриваются только однонаправленные потоки, в которых данные всегда передаются в одном направлении. Из программы данные можно отпра­вить (записать) в поток вывода, а получить (прочитать) их в программе из потока ввода. Например, сразу после запуска программы, поток стандартного ввода "cin" подключается к клавиатуре, а поток стандартного вывода "cout" - к экрану.

Потоки ввода/вывода, вроде "cin" и "cout", являются примерами объектов класса "поток". Поэтому изучение потоков полезно и по той причине, что позволяет ознакомиться с элементами синтаксиса и некоторыми объектно-ориентированными понятиями Си++.

Список функций для работы с файловыми потоками хранится в заголовочном файле "fstream.h". Поэтому во всех рассматриваемых ниже фрагментах программ предполагается, что в начале программы есть соответствующая директива "#include":

#include

2.1 Создание потоков

В программе перед первым обращением к потоку ввода или вывода необходи­мо "создать" поток. Операторы для создания потоков похожи на описания перемен-

41

ных, и они обычно размещаются в начале программы или функции рядом с описа­ниями переменных. Например, операторы

ifstream in_stream; ofstream out_stream;

создают поток с именем "in_stream", являющийся объектом класса (как типа данных) "ifstream" (input-file-stream, файловый поток ввода), и поток с именем "out_stream", являющийся объектом класса "ofstream" (output-file-stream, файловый поток вывода). Аналогию между потоками и обычными переменными (типа "int", "char" и т.д.) не следует понимать слишком буквально. Например, к потокам нельзя применять опера­тор присваивания (например, нельзя записать "in_stream1 = in_stream2").

2.2 Подключение и отключение потоков от файлов

После создания потока его можно подключить к файлу (открыть файл) с помо­щью функции-члена "open(...)". (В предыдущих лекциях уже использовались несколь­ко функций-членов потоков вывода. Например, во 2-й лекции применялись "precision(...)" и "width(...)".) Функция "open(...)" у потоков ifstream и ofstream работает по-разному (т.е. это полиморфная функция).

Для подключения потока ifstream с именем "in_stream" к файлу с именем "Lecture_4.txt" надо применить следующий вызов: in_stream.open("Lecture_4.txt");

Этот оператор подключит поток "in_stream" к началу файла "Lecture_4.txt" (графически состояние программы после выполнения оператора показано на рис. 2).


.(программа)

Рис. 2. Состояние программы после подключения потока ввода к файлу.

Чтобы к файлу "Lecture_4.txt" подключить поток вывода ofstream с именем "out_stream", надо выполнить аналогичный оператор:

out_stream.open("Lecture_4.txt") ;

Этот оператор подключит поток "out_stream" к файлу "Lecture_4.txt", но при этом прежнее содержимое файла будет удалено. Файл будет подготовлен к приему новых данных (рис. 3).





[программа)


out stream

Рис. 3. Состояние программы после подключения потока вывода к файлу.

Для отключения потока "in_stream" от файла, к которому он подключен (для закрытия файла), надо вызвать функцию-член "close()":

42

in_stream. close () ;

После этого состояние программы по отношению к файлу будет таким, как на рис. 4.





[програнна)




■ л1

Е1

К1

■ц1

И ■ ■ Я ■ ■ ■ ■ 4 " " . " " "

. т.



и

Рис. 4. Состояние программы после отключения потока ввода от файла.

Функция-член отключения от файла у потока вывода:

out_stream.close();

выполняет аналогичные действия, но, дополнительно, в конец файла добавляется служебный символ "end-of-file (маркер конца файла)". Т.о., даже если в поток вывода не записывались никакие данных, то после отключения потока "out_stream" в файле "Lecture_4.txt" будет один служебный символ (рис. 5). В таком случае файл "Lecture_4.txt" останется на диске, но он будет пустым.

(програнна)



Рис. 5. Состояние программы после отключения потока вывода от файла, в который не было записано ни одного символа..

3. Проверка ошибок выполнения файловых операций

Файловые операции, например, открытие и закрытие файлов, известны как один из наиболее вероятных источников ошибок. В надежных коммерческих про­граммах всегда выполняется проверка, успешно или нет завершилась файловая опе­рация. В случае ошибки вызывается специальная функция-обработчик ошибки.

Простейший способ проверки ошибок файловых операций заключается в вызо­ве функции-члена "fail()". Вызов in_stream.fail() ;

возвращает истинное значение (True), если последняя операция потока "in_stream" привела к ошибке (может быть, была попытка открытия несуществующего файла). После ошибки поток "in_stream" может быть поврежден, поэтому лучше не продол­жать работу с ним.

В приведенном ниже фрагменте программы в случае ошибки при открытии файла на экран выдается сообщение и программа завершает работу с помощью биб­лиотечной функции "exit()" (она описана в файле "stdlib.h"):

#include #include #include

int main () {

43

ifstream in_stream;

in_stream.open( "Lecture_4.txt" ); if ( in_stream.fail() )

{

cout « "Извините, открыть файл не удалось!\n";

exit(1);

4. Символьный ввод/вывод

4.1 Функция ввода "get (...)"

После того, как файл для ввода данных открыт, из него можно считывать от­дельные символы. Для этого служит функция "get(...)". У нее есть параметр типа "char&". Если программа находится в состоянии, как на рис. 2, то после вызова:

in_stream.get(ch);

произойдет следующее: (а) переменной "ch" будет присвоено значение "'Л'", и (б) по­ток "in_stream" будет подготовлен для чтения следующего символа (рис. 6).

[программа)



in stream

|I4I

Рис. 6. Состояние программы после чтения из файла первого символа.

4.2 Функция вывода "put (...)"

С помощью потока вывода класса ofstream в открытый файл можно записы­вать отдельные символы. Для этого у класса ofstream есть функция-член "put(...)". Записываемый символ передается ей как параметр типа "char". Если программа пре­бывает в состоянии, представленном на рис. 3, то оператор

out_stream.put('Л');

изменит состояние на то, которое показано на рис. 7:

out stream


(программа)

■л1




Рис. 7. Состояние программы после записи в файл первого символа.

4.3 Функция "putback (...)"

В Си++ у потока ifstream есть функция-член "putback (...)". На самом деле она не "возвращает символ назад" (т.е. не изменяет содержимого файла ввода), но ве­дет себя так, как будто это делает. На рис. 8 показано состояние, в которое перейдет программа из состояния рис. 6 после выполнения оператора:

44

in stream.putback(ch) ;





[программа)


in stream

■Е- "К" ГЦ" "И"

1

"41

■ ■ 1

Рис. 8. Состояние программы после вызова функции "putback (' Л') ".

"Вернуть назад" можно любой символ. Состояние программы после вызова

in_stream.putback('7');

показано на рис. 9.





[программа)

-ц- -и- -я1

"41

и. т.

Рис. 9. Состояние программы после вызова функции "putback (' 7 ') ".

5. Проверка достижения конца файла при операциях ввода

5.1 Проверка конца файла с помощью функции "eof ()"

При работе с потоком ввода надо следить за тем, чтобы не пропустить момент достижения конца файла. В большинстве реализаций Си++ (в том числе и в Microsoft Visual C++) в класс "поток ввода" встроен флаг "конец файла (end-of-file, EOF)" и функция-член "eof о" для чтения этого флага. С помощью функции "eof о" можно узнать, находится ли в данный момент флаг в состоянии True (конец файла достиг­нут) или False (конца файла пока нет).

При открытии файла, когда поток if stream только подключается к нему, флаг EOF сбрасывается в значение False (даже если файл пуст). Но, если ifstream "in_stream" сейчас расположен в конце файла, и флаг EOF равен False, то после вы­зова

in_stream.get(ch);

переменная "ch" окажется в неопределенном состоянии, а флагу EOF будет присвоено значение True. Если флаг EOF равен True, то программа не должна пытаться выпол­нить чтение из файла, поскольку результат чтения будет неопределенным. Допустим, программа находится с состоянии, показанном на рис. 10.

45



Рис. 10. Состояние программы после чтения предпоследнего символа из файла.

Тогда после выполнения оператора

in_stream.get(ch);

программа перейдет в состояние, изображенное на рис. 11.





EOF |~FuLSEp\l про грамма)

Рис. 11. Состояние программы после чтения последнего символа из файла.

Теперь логическое выражение

in_stream.eof()

будет иметь истинное значение True. Если снова выполнить чтение символа:

in_stream.get(ch); то в результате получится состояние, показанное на рис. 12.



Рис. 12. Состояние программы после операции чтения символа при установ­ленном флаге EOF.

Ниже приведена простая программа для копирования текстового файла "Lecture_4.txt" одновременно и на экран, и в другой файл "Copy_of_4 . txt". Для прекращения копирования применяется вызов функции "eof () ". Обратите внимание на цикл "while". Цикл с префиксным условием (предусловием) "while" является уп­рощенным вариантом цикла "for". У цикла "while" в круглых скобках " о " нет опе­раторов инициализации и изменения значений (подробно эти циклы рассматриваются в следующей лекции).

#include #include

int main () {

char character;

ifstream in_stream;

ofstream out stream;

46

in_stream.open( "Lecture_4.txt" ); out_stream.open( "Copy_of_4.txt" );

in_stream.get( character ); while ( !in_stream.eof() )

{

cout « character; out_stream.put(character) ; in_stream.get(character);

out_stream.close(); in_stream.close();

return 0;

Программа 5.1.

6. Передача потоков функциям в качестве параметров

Потоки можно использовать в качестве параметров функций, но их обязатель­но надо передавать по ссылке (а не по значению). Ниже приведен усовершенствован­ный вариант программы 5.1, в котором копирование выполняется специальной функ­цией "copy_to(...)".

#include #include

void copy_to( ifstream& in, ofstream& out );

// Главная функция int main ()

ifstream in_stream; ofstream out_stream;

in_stream.open( "Lecture_4.txt" ); out_stream.open( "Copy_of_4.txt" ); copy_to( in_stream, out_stream ); out_stream.close(); in_stream.close();

return 0; // Конец главной функции

// Функция для копирования файла в другой файл и на экран void copy_to( ifstream& in, ofstream& out )

char character;

in.get( character ); while ( !in.eof() )

cout « character; out.put( character );

47

in.get( character );

} } // Конец функции
1   ...   4   5   6   7   8   9   10   11   ...   18

Похожие:

Лекция основы си++ 7 icon Лекция основы Си++ 9
Б73 Основы программирования на языке Си++: Для студентов физико-математических факультетов педагогических институтов. – Коломна:...
Лекция основы си++ 7 icon Лекция I и проблема языка и сознания лекция II 31 слово и его семантическое...
Монография представляет собой изложение курса лекций, про* читанных автором на факультете психологии Московского государственного...
Лекция основы си++ 7 icon Лекция психосексуальное развитие. Возрастная динамика взаимоотношения полов 15
Основы семейной психопедагогики (курс лекций) / В. И. Короткий. — Архангельск: М'арт, 2003. — 178 с
Лекция основы си++ 7 icon Лекция Архитектура 32-разрядных ос windows 7
Б73 Основы программирования на языке Си++: Для студентов физико-математических факультетов педагогических институтов. – Коломна:...
Лекция основы си++ 7 icon Лекция Основные понятия ооп 7
Б73 Основы программирования на языке Си++: Для студентов физико-математических факультетов педагогических институтов. – Коломна:...
Лекция основы си++ 7 icon Лекция №1. Введение. Элементы дифференциальной геометрии. 2
Лекция №5. Множества Жюлиа, множество Мандельброта и их компьютерное представление. 18
Лекция основы си++ 7 icon Лекция на тему: «Современные подходы к содержанию дополнительного образования детей»
...
Лекция основы си++ 7 icon Лекция в Дорнахе 22 мая 1920 года
Канта и протестантизма. Эта лекция вызвала негодование среди членов Лиги, культивировавших и признававших под названием монизма вообще...
Лекция основы си++ 7 icon Курс лекций Лекция Введение в философскую суицидологию. Лекция Общая...
Открыть, в чём состоит суть суицида, наука не в состоянии (по собственной ограниченной природе) и потому должна обращаться за объяснениями...
Лекция основы си++ 7 icon Лекция для слушателей курса «Основы религий»
Я не могу всего этого понять, потому что некоторые пытливые учителя, помню, меня просто одолевали вопросами, где найти, например,...
Литература


При копировании материала укажите ссылку © 2015
контакты
literature-edu.ru
Поиск на сайте

Главная страница  Литература  Доклады  Рефераты  Курсовая работа  Лекции