Ввод и вывод в языке С++

Файловый ввод/вывод с использованием разных классов. Вызовы операционной системы. Использование вызовов операционной системы. Основные способы открытия файла. Замена файла, связанного со стандартными устройствами ввода/вывода. Операции чтения файла.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 09.12.2016
Размер файла 1,1 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Содержание

Введение

1. Ввод и вывод в языке С

1.1 Ввод/вывод файлов

1.2 Стандартный ввод/вывод

2. Ввод и вывод в языке С++

2.1 Файловый ввод/вывод с использованием разных классов

2.2 Стандартный ввод/вывод в С++

Заключение

Библиографический список

Введение

Приложению, написанному на любом языке программирования, необходимо взаимодействовать с пользователем и окружающим миром. Иначе пользы от такого приложения может и не быть. Как правило, такое взаимодействие осуществляется посредством ввода-вывода информации на терминал или в файл.

Стоит, конечно, отметить, что есть множество программ, которые не используют файловый или консольный ввод-вывод: это программы, осуществляющие низкоуровневое взаимодействие с аппаратной частью компьютера и периферией (ядро ОС, драйверы и пр.).

В стандартном C++ существует два основных пути ввода-вывода информации:

- посредством традиционной системы ввода-вывода, унаследованной от языка C;

- с помощью потоков, реализованных в STL (Standard Template Library).

Однако при ближнем рассмотрении оказывается, что и потоки, и традиционная система ввода-вывода для осуществления необходимых действий используют вызовы операционной системы.

1. Ввод и вывод в языке С

Ввод/вывод в языке С осуществляется с помощью функций из стандартных библиотек. Чтобы ими пользоваться, в программу надо включить соответствующие h-файлы: stdio.h, stdlib.h, conio.h и др. Главная библиотека, в которой содержатся основные функции ввода/вывода, в том числе и обеспечивающие стандартный ввод/вывод, - stdio.h.

1.1 Ввод/вывод файлов

Чтобы работать с файлом, его сначала следует открыть: связать со специальной структурой с именем FILE, которая описана в библиотеке stdio.h и в которой задаются характеристики файла (размер буфера ввода/вывода, состояние файла, последняя прочитанная запись и т. п.). Связь эта выполняется с помощью функции fopen(), которая тоже входит в библиотеку stdio.h и возвращает указатель на структуру FILE. Поэтому в программе, прежде всего, следует задать указатель на структуру FILE, а затем записать оператор открытия файла:

FILE *fp;

fp = fopen(<имя файла>, <способ открытия файла> );

Функция fopen() имеет два параметра: имя открываемого файла и способ открытия файла. Способ открытия файла определяет, как пользователь будет работать с файлом: читать его, писать в него данные или делать что-то еще. Способы открытия файла и их коды могут быть следующие:

- r - файл открывается только для чтения данных из него;

- w - файл открывается только для записи в него (если файл не существует, он создается автоматически и открывается для записи);

- a - файл открывается для дозаписи данных в конец файла (если файл не существует, он создается для записи);

- r+ - существующий файл открывается для обновления: можно и читать из файла, и записывать в него данные;

- w+ - создается новый файл для обновления: можно и читать, и записывать в него данные;

- a+ - файл открывается для дозаписи данных в конец файла (если файл не существует, он создается автоматически и открывается для записи).

Если по какой-либо причине открытия файла не произошло (например, в режиме r+ задано имя несуществующего файла), то функция fopen() возвращает значение NULL. Поэтому при открытии файла следует осуществлять проверку:

if((fp = fopen(name, mode)) == NULL)

{ операторы обработки ошибки открытия }

{ остальные операторы программы }

После того как программа с данным файлом отработала, следует "отвязать" структуру FILE от файла или, как говорят, закрыть файл. Это осуществляет функция fclose(fp). Она не только разрывает связь структуры с файлом, но и записывает в память оставшееся содержимое буфера ввода/вывода, через который и организуется ввод/вывод. Только после закрытия файла с ним можно выполнять какие-либо действия, т. к. он "свободен", "не привязан". Например, его можно удалить или заново открыть в другом режиме открытия и т.д.

После того как файл открыт, то для чтения или записи данных используют специальные функции.

1. Функция fputc()

Формат функции: fputc(c, fp);

Функция выводит символ в файл: с - выводимый символ, fp - указатель на файл.

2. Функция fputs()

Формат функции: fputs(s, fp);

Функция выводит строку в файл: s - выводимая строка, fp - указатель на файл.

3. Функция fgetc()

Формат функции: char c = fgetc(fp);

Читает один символ из файла с указателем fp. В случае ошибки или достижения конца файла возвращает EOF.

4. Функция fgets()

Формат функции: fgets(s, maxline, fp);

Читает строку в s, где s - массив символов или указатель типа char (предварительно должна быть выделена память для чтения с использованием указа- теля), maxline - максимальное число символов, которое требуется читать из файла с указателем fp. В случае ошибки или достижения конца файла возвращает NULL.

5. Функция fread()

Формат функции: fread(buf, m, n, fp);

Эта функция читает из файла c указателем fp первые n элементов данных, каждый из которых имеет длину m байт. Чтение происходит в буфер, на который указывает указатель buf, например, char buf[50] или char *buf (но в последнем случае предварительно надо выделить память для буфера). Общее количество байт чтения составит (n*m). Функция возвращает количество прочитанных элементов, а по достижении конца файла или возникновении ошибки чтения возвращает NULL.

6. Функция fwrite()

Формат функции: fwrite(ptr, m, n, fp);

Функция добавляет n элементов в файл с указателем fp, каждый элемент длиной в m байт. Данные записываются из буфера, на который указывает указатель ptr (этот указатель указывает на некоторый объект, например, на структуру). Общее количество записанных байтов равно (n * m). В случае ошибки записи функция возвращает ноль, в противном случае -- количество записанных элементов.

7. Функция fseek()

Формат функции: fseek(fp, n, m);

Эта функция устанавливает указатель в файле fp в позицию, отстоящую на n байт от текущей, а направление перемещения (вперед или назад) определяется параметром m, который может быть задан одним из трех значений: 0, 1, 2 или одной из трех символических констант, определенных в файле stdio.h:

- SEEK_SET = 0 - к началу файла;

- SEEK_CUR = 1 - указатель на текущую позицию в файле;

- SEEK_END = 2 -- к концу файла.

Функция fseek() используется для ввода/вывода потоком. Для работы не с потоковыми данными следует использовать функцию lseek(). После функции fseek() можно выполнять операции обновления в файлах, открытых для обновления. При удачном завершении работы fseek() возвращает ноль, в противном случае функция возвращает код ошибки. Тогда глобальная переменная errno принимает одно из следующих значений:

- EBADF -- неверный указатель файла;

- EINVAL -- неверный аргумент функции;

- ESPIPE -- поиск на устройстве запрещен.

8. Функция ftell()

Формат функции: long int i = ftell(fp);

Возвращает текущее значение указателя файла fp (т. е. номер текущей позиции) в виде значения типа long int. Отсчет идет в байтах от начала файла. Возвращаемое значение может быть использовано затем в функции fseek(). Если обнаружены ошибки, функция возвращает значение -1L и присваивает глобальной переменной errno положительное значение.

9. Функция fscanf()

Формат функции: fscanf(fp, Control, arg1, arg2, ... , argn);

Функция читает данные из файла c указателем fp, преобразует их по форматам, записанным в управляющей строке Control, и отформатированные данные записывает в аргументы arg1, ... , argn.

10. Функция fprintf()

Формат функции: fprinf(fp, Control, arg1, arg2, ... , argn);

Выводит данные в файл c указателем fp, преобразует аргументы arg1, ... , argn к форматам, которые записаны в управляющей строке Control, и отформатированные данные записывает в файл.

11. Функция rewind()

Формат функции: rewind(fp);

Устанавливает указатель позиционирования в файле с указателем fp на начало потока. Вызов функции rewind(fp) эквивалентен вызову функции fseek(fp, 0L, SEEK_SET) за исключением того, что rewind() сбрасывает индикатор конца файла и индикаторы ошибок, а fseek() сбрасывает только индикатор конца файла. После функции rewind() можно выполнять операции обновления для файлов, открытых для обновления. Функция не возвращает никакого значения.

12. Функция remove()

Формат функции: remove(FILENameString);

Функция удаляет файл с именем FILENameString. Перед удалением файл должен быть закрыт. Строка FILENameString должна содержать полный путь к файлу. При нормальном завершении задачи функция возвращает ноль, а в случае ошибки - 1. При этом глобальная переменная errno принимает следующие значения:

- EACCES -- запрещено удалять;

- ENOENT -- нет такого файла или директории.

13. Функция FILElength()

Формат функции: long FILElength(fp);

Функция возвращает длину файла с указателем fp в байтах. Для работы функции требуется подключить файл io.h. В случае ошибки функция возвращает ?1, и глобальная переменная errno принимает значение EBADF - неверный указатель файла.

14. Функция ferror()

Формат функции: ferror(fp);

Функция тестирует поток на ошибки чтения-записи. Если индикатор ошибки устанавливается, то он остается в таком положении, пока не будут вызваны функции clearerr() или rewind(), или до того момента, пока поток не закроется. Если в файле была обнаружена ошибка, то функция ferror() возвращает ненулевое значение.

15. Функция freopen()

Формат функции: FILE *freopen(const char *FILEname, const char *mode, FILE *stream);

Функция подставляет файл, заданный в первом параметре, вместо уже открытого потока. Она закрывает поток независимо от того, открыт ли он. Эта функция полезна для замены файла, связанного со стандартными устройствами ввода/вывода stdin, stdout или stderr. Способы открытия файла аналогичны функции fopen(). При успешном завершении функция возвращает указатель типа FILE (как и функция fopen()), при неуспешном -- NULL.

16. Функция feof()

Формат функции: feof(fp);

Обнаруживает конец файла с указателем fp: тестирует поток на возникновение индикатора конца файла (который наступает после прочтения последней записи). Как только индикатор установлен, операции чтения файла возвращают индикатор до тех пор, пока не выполнена функция rewind() - "перемотка" в начало файла, или пока файл не будет закрыт. Индикатор конца файла переустанавливается с каждой операцией ввода. Функция возвращает ненулевую величину, если индикатор конца файла был обнаружен при последней операции чтения, в противном случае - ноль.

17. Функция ferror()

Формат функции: ferror(FILE *fp);

Функция выдает ненулевое значение, если операция с файловым потоком завершается с ошибкой (например, возникает ошибка чтения файла). Для обработки ошибок ввода/вывода следует записать эту функцию перед блоком работы с файлом в виде:

if (ferror(fp)) { команды обработки ошибок ввода/вывода }

Как только произойдет ошибка, выполнится эта функция, и начнут работать команды обработки ошибок.

18. Функция exit()

Формат функции: exit(int status);

Эта функция используется для срочного завершения работы программы при обработке ошибок открытия файла, а также для прерывания работы программы по каким-либо причинам. Перед завершением все файлы закрываются, остатки данных, находящиеся в буфере вывода, записываются в память и вызываются функции обработки ошибок, предварительно зарегистрированные специальной функцией atexit().

1.2 Стандартный ввод/вывод

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

При запуске любой программы автоматически открываются сразу три файла:

- файл стандартного ввода. Его указатель называется stdin;

- файл стандартного вывода. Его указатель называется stdout;

- файл стандартного вывода ошибок. Его указатель называется stderr.

При работе с файлами мы можем использовать эти указатели, чтобы направлять данные в стандартные потоки, в которых по умолчанию ввод идет с клавиатуры, а вывод -- на экран. Например, чтобы ввести строку с клавиатуры, можно применить функцию fgets() в виде: fgets(s, maxline, stdin); а для вывода строки на экран -- функцию fputs()в виде: fputs(s, stdout); Из приведенного ранее перечня функций, обслуживающих ввод/вывод, можно увидеть, что существуют функции getc(fp), putc(c,fp), которые соответственно вводят один символ из файла с указателем fp и пишут один символ в файл с указателем fp. Если вместо указателя fp, который имеет тип FILE, в эти функции поместить указатели стандартного потока, то они станут соответственно вводить один символ с клавиатуры и выводить его на экран.

В языке С стандартный ввод можно перенаправлять на ввод из файла: если некоторая программа с именем p1.exe использует функцию getchar(), то с помощью выполнения командной строки:

p1.exe < anyFILE1

получим ввод не с клавиатуры, а из файла anyFILE1. Командную строку в С можно выполнить с помощью системной функции system() в виде:

system("P1.EXE < ANYFILE1");

причем символы должны быть в верхнем регистре, т.к. выполняется команда DOS. Точно так же, как и для ввода, можно перенаправить стандартный вывод в файл. Если имеем программу p2.exe, которая использует стандартный вывод, то с помощью выполнения командной строки:

p2.exe > anyFILE2

получим вывод в файл anyFILE2.

Рассмотрим основные функции стандартного ввода/вывода языка C.

1. Функция getchar()

Формат функции: getchar();

Функция вводит с клавиатуры один символ и возвращает его. Обращаться к этой функции можно так:

char c; // или int c;

c = getchar();

2. Функция putchar()

Формат функции: putchar(c);

Выводит значение переменной с (один символ) на стандартное выводное устройство.

3. Функция printf()

Формат функции: printf(Control, arg1, arg2, ... , argn);

Это функция форматного вывода. Выводит на экран содержимое arg1, arg2, ... , argn и возвращает количество выводимых байт. Control - управляющая символьная строка, в которой находятся форматы вывода на экран для соответствующих аргументов arg1, arg2, ... , argn, т. е. первый формат - для вывода arg1, второй -- для arg2 и т. д. Все символы, находящиеся между форматами, выводятся один к одному, т. е. не форматируются. Это дает возможность вывода дополнительного текста для улучшения читаемости результата вывода. Форматы вывода задаются так: любой формат начинается с символа '%' и заканчивается одним из символов форматирования:

- d - аргумент преобразуется к десятичному виду (с учетом знака);

- x - аргумент преобразуется в беззнаковую шестнадцатеричную форму;

- U - аргумент преобразуется в беззнаковую десятичную форму;

- с - аргумент рассматривается как отдельный символ;

- s - аргумент рассматривается как строка символов; символы строки печатаются до тех пор, пока не будет достигнут нулевой символ или не будет напечатано количество символов, указанное в спецификации точности;

- е - аргумент рассматривается как переменная типа float или double и преобразуется в десятичную форму в экспонентном виде;

- f - аргумент рассматривается как переменная типа float или double и преобразуется в десятичную форму;

- n - указатель на целое со знаком;

- p - входной аргумент выводится как указатель.

Между границами формата вывода (от знака % до символа-спецификатора типа выводимого аргумента) находятся:

[флажки][ширина][.точность][F|N|h|l|L]

4. Функция scanf()

Формат функции: scanf(Control, arg1, arg2, ... , argn);

Это функция форматного ввода с клавиатуры. Осуществляет посимвольный ввод данных с клавиатуры, преобразует их в соответствии с форматом для каждого значения, указанном в управляющей (форматной) символьной строке Control, и результат преобразования записывает в аргументы arg1, arg2, ..., argn. Смысл строки Control тот же, что и для функции printf(). Так как arg1, arg2, ..., argn - это выходные параметры функции, то при обращении к функции они должны задаваться своими адресами: имена массивов задаются именами, т. к. имя массива -- это указатель на его первый элемент, а те аргументы, которые не являются указателями, задаются как &arg. Форматная строка Control - это символьная строка, содержащая три типа объектов: незначащие символы, значащие символы и спецификации формата. Незначащие символы - это пробел, знак табуляции (\t), символ перехода на новую строку (\n). Как только функция встречает незначащий символ в строке формата, она считывает, но не сохраняет все последующие незначащие символы до тех пор, пока не встретится первый значащий символ (т. е. пропускает незначащие символы). Значащие символы - это все символы кода ASCII, кроме символа '%'. Если функция встречает в форматной строке значащий символ, она его считывает, но не сохраняет. Спецификация формата функции имеет вид:

%[*][ширина][F/N] [h/l] символ_формата

5. Функция sprintf()

Формат функции такой: sprintf(string, Control, arg1, arg2, ... , argn);

Эта функция аналогична printf(), за исключением того, что результат своей работы она выводит не на стандартное устройство вывода, а в строку string. Это позволяет собирать в одну строку данные совершенно разных типов. Функция sscanf() Формат функции: sscanf(string, Control, arg1, arg2, ... , argn); Эта функция аналогична scanf(), за исключением того, что входные данные для ее работы поступают не со стандартного устройства ввода, а из строки string. Это позволяет выделять в строке различные группы данных совершенно разных типов и помещать их в отдельные переменные.

6. Функция cprintf()

Формат этой функции совпадает с форматом функции printf(): сprintf(Control, arg1, arg2, ... , argn);

Параметры аналогичны параметрам printf(). Но для обеспечения работы этой функции следует подключить к программе файл conio.h, выполнив #include Если функция printf() выводит данные туда, куда назначен stdout, то функция cprintf() всегда выводит данные на консоль (на это указывает символ 'с' в начале ее имени), т.е. на экран. В отличие от printf(), функция cprintf() не переводит символ '\n' в пару "\r\n" - возврат каретки и перевод строки (вместо '\n' надо указывать оба этих символа). Кроме того, символы табуляции '\t' не преобразуются в пробелы. Эту функцию не рекомендуется использовать для приложений Win32 или Win32 GUI. Но ее можно использовать для выдачи на экран цветных сообщений. Для этого надо воспользоваться функциями textcolor() (установить цвет текста) и textbackground() (установить цвет фона).

7. Функция gets()

Формат функции: gets(s);

Вводит строку символов с клавиатуры и записывает ее в строку s, которая может быть объявлена как char *s или char s[].

8. Функция puts()

Формат функции: puts(s);

Выводит содержимое строки s на устройство стандартного вывода (экран). Строка s может быть объявлена как char *s или char s[].

9. Функция cputs()

Формат функции: сputs(s);

Выводит содержимое строки s на экран (s может быть объявлена как char *s или char s[]). Эту функцию можно использовать для вывода на экран цветных текстов. Цвет выводимых символов задается с помощью функции textcolor(), а цвет фона - функцией textbackground(). Для работы функции надо подключить файл conio.h.

10. Функция gotoxy()

Формат функции: gotoxy(x, y);

Переводит курсор в точку с координатами (x, y) в текущем окне на экране, где х - номер столбца экрана, y - номер строки экрана. Обе переменные должны быть описаны как int (не в пикселах). Для работы функции надо подключить файл conio.h.

11. Функция clrscr()

Формат функции: clrscr();

Очищает экран и закрашивает его цветом, заданным функцией textbackground().

2. Ввод и вывод в языке С++

Ввод и вывод в С++ организован с помощью так называемых поточных классов, содержащих данные и методы работы с файлами по вводу/выводу. Поточные классы происходят от общего предка - класса ios и потому наследуют его функциональность. Чтобы начать писать программу с использованием ввода/вывода на языке С++, следует обязательно выполнить в программе:

#include <fstream>

Класс fstream является потомком классов istream и ostream. Эти же классы являются родителями классов ifstream и оfstream. Класс fstream используется для организации ввода/вывода (т. е. чтения-записи) в один и тот же файл. Классы ifstream, оfstream - для организации соответственно ввода (чтения) файла и вывода (записи в файл). В свою очередь, экземплярами классов istream, ostream являются cin, cout, cerr, с помощью которых осуществляется так называемый стандартный ввод/вывод - ввод со стандартного вводного устройства, которым по умолчанию является клавиатура, и вывод на стандартное выводное устройство, которым по умолчанию является экран. Таким образом, включения в программу класса fstream оказывается достаточным для организации как стандартного, так и файлового ввода/вывода. Файловый ввод/вывод организован с помощью переопределенных в поточных классах операций включения (<>).

Чтобы работать с файлом, его сначала следует открыть - связать со специальной структурой, в которой задаются характеристики файла (размер буфера ввода/вывода, состояние файла, последняя прочитанная запись и т. п.). Связь эта выполняется с помощью функции open(), входящей в один из классов, который определяет ввод/вывод (fstream, istream, ostream). Поэтому, чтобы выполнить такую функцию, следует сначала создать экземпляр соответствующего класса, чтобы получить доступ к этой функции. Если мы, например, хотим выполнять вывод в файл (т. е. запись в него), то следует создать экземпляр класса ostream: ostream exp; и затем выполнить функцию

exp.open().

В скобках должны быть указаны параметры этой функции: имя открываемого файла и способ открытия файла, в котором задаются сведения о том, как пользователь собирается работать с файлом: читать его, писать в него или делать что-то еще. После того как файл открыт для чтения или записи, используют операции включения извлечения (<>). Если использовать пример с экземпляром exp класса ostream, то можно записать, например:

exp << "строка текста" << i << j << endl;

Здесь i, j -- некоторые переменные (например, int i; float j;), endl - конец вывода и переход на новую строку. После того как работа с файлом закончена, следует закрыть файл, чтобы разорвать связь с той структурой, с которой файл был связан при его открытии. Это необходимо, чтобы дать возможность другим файлам "открываться". Этот акт выполняется с помощью метода close() того же экземпляра класса, который мы создавали, чтобы выполнить функцию open(). В нашем случае следовало бы написать:

exp.close();

2.1 Файловый ввод/вывод с использованием разных классов

Поточные классы - это поставщики инструментов для работы с файлами. В поточных классах хранятся:

- структуры, обеспечивающие открытие/закрытие файлов;

- функции (методы) открытия/закрытия файлов;

- другие функции и данные, обеспечивающие собственно ввод/вывод.

При использовании поточных классов языка С++ в основной программе требуется писать директиву:

using namespace::std;

В противном случае программа не пройдет компиляцию. В листинге 1 приводится пример использования директив пространства имен.

Листинг 1.

#include <vcl.h>

#include <iostream>

#include <conio.h>

namespace F

{

float x = 9;

}

namespace G

{

using namespace F;

float y = 2.0;

namespace INNER_G

{

float z = 10.01;

}

}

int main()

{

using namespace G;

using namespace G::INNER_G;

float x = 19.1;

std::cout << "x = " << x << std::endl;

std::cout << "y = " << y << std::endl;

std::cout << "z = " << z << std::endl;

getch();

return 0;

}

В результате на экране появится:

x = 19.1

y = 2

z = 10.01

std::cout - это стандартный вывод. Здесь показано, что объект cout принадлежит пространству имен std.

1. Работа с классом fstream

Члены этого класса позволяют открыть файл, записать в него данные, пере- местить указатель позиционирования в файле (указатель, показывающий, на каком месте в файле мы находимся) в то или иное место, прочитать данные.

Этот класс имеет следующие основные функции (методы):

open() - открывает файл;

close() - закрывает файл;

is_open() - если файл открыт, то возвращает true, иначе -- false;

rdbuf() - выдает указатель на буфер ввода/вывода.

Формат функции open(): open(char* file_name, open_mode);

где file_name - имя открываемого файла, open_mode - способ открытия файла. Способ открытия файла задается значением перечислимой переменной: enum open_mode {app, binary, in, out, trunc, ate}; Эта переменная определена в базовом классе ios, поэтому обращение к перечислимым значениям в классе fstream, с экземпляром которого мы работаем, должно идти с указанием класса-родителя: ios::app, ios::binary и т. д.

Назначение способов открытия файла:

app - открыть файл для дозаписи в его конец;

binary - открыть файл в бинарном виде (такие файлы были записаны по определенной структуре данных и поэтому должны читаться по этой же структуре);

in -- открыть файл для чтения;

out - открыть файл для записи в его начало. Если файл не существует, он будет создан;

trunc - уничтожить содержимое файла, если файл существует (очистить файл);

ate - установить указатель позиционирования файла на его конец.

При задании режимов открытия файла можно применять оператор логического ИЛИ (|), чтобы составлять необходимое сочетание режимов открытия. Приведем пример программы работы с классом fstream (листинг 2). Результат работы показан на рисунке 1.

Листинг 2.

#include <vcl.h>

#include <iostream>

#include <conio.h>

#include <fstream>

#include <stdio.h>

void main()

{

using namespace std;

fstream inout;

inout.open("fstream.out", ios_base::in | ios_base::out | ios_base::trunc);

inout << "This is the story1 of a man" << endl;

inout << "This is the story2 of a man" << endl;

inout << "This is the story3 of a man" << endl;

char p[100];

inout.seekg(0);

inout.getline(p, 100);

cout << endl << "String1 :" << endl;

cout << p;

fstream::pos_type pos = inout.tellg();

inout.getline(p, 100);

cout << endl << "String2 :" << endl;

cout << p;

inout.getline(p, 100);

cout << endl << "String3 :" << endl;

cout << p;

inout.seekp(pos);

inout << "This is the story2 of a man" << endl;

inout << "This is the story3 of a man" << endl;

inout.seekg(0);

cout << endl << endl << inout.rdbuf();

inout.close();

system("DEL FSTREAM.OUT");

getch();

}

Рисунок 1.

2. Работа с классом ofstream

Класс ofstream предназначен для организации работ по выводу (записи) в файл с помощью методов этого класса:

open() - открывает файл для записи в него информации;

is_open() - возвращает true, если файл открыт, и false - в противном случае;

put() - записывает в файл один символ;

write() - записывает в файл заданное число символов;

skeep() - перемещает указатель позиционирования в заданное место файла;

tellp() - выдает текущее значение указателя позиционирования;

close() - закрывает файл;

rdbuf() - выдает указатель на буфер вывода (этот буфер находится в структуре, с которой связывается файл при его открытии).

В листинге 3 приведен пример использования класса ofstream.

Листинг 3.

ofstream FILE;

FILE.open("a.txt");

if(FILE == NULL) return(0);

for(int i = 0; i < 2; i++)

FILE << "string " << i << endl;

FILE.close();

3. Работа с классом ifstream

Класс ifstream предназначен для организации работ по вводу (чтению) из файла с помощью методов этого класса:

open() - открывает файл для чтения из него информации;

is_open() - возвращает true, если файл открыт, и false - в противном случае;

get() - читает из файла один символ;

read() - читает из файла заданное число символов;

eof() - возвращает ненулевое значение, когда указатель позиционирования в файле достигает конца файла;

peek() - выдает очередной символ потока, но не выбирает его (не сдвигает указатель позиционирования данного в файле);

seekg() - перемещает указатель позиционирования в заданное место файла;

tellg() - выдает текущее значение указателя позиционирования;

close() - закрывает файл;

rdbuf() - выдает указатель на буфер ввода (этот буфер находится в структуре, с которой связывается файл при его открытии).

Пример использования класса приведен в листинге 4.

Листинг 4.

ifstream FILE;

char p[100];

FILE.open("a.txt");

if(FILE == NULL) return(0);

while(!FILE.eof())

{

FILE >> p;

cout << p << endl;

}

FILE.close();

2.2 Стандартный ввод/вывод в С++

Стандартный ввод/вывод является частным случаем файлового ввода/вывода. При файловом вводе/выводе мы объявляли экземпляры соответствующих поточных классов и затем пользовались методами и операциями << и >>. Но классы istream, ostream, лежащие в основе поточных классов, содержат стандартные объекты-экземпляры классов с именами cout (экземпляр класса для стандартного ввода), cin (экземпляр класса для стандартного вывода) и сerr (экземпляр класса для стандартного вывода сообщений об ошибках).

При запуске любой программы на языке С+ + эти стандартные потоки определены (открыты) и по умолчанию назначены на стандартное вводное устройство -- клавиатуру (cin), на стандартное выводное устройство -- экран (cout и cerr). Причем все эти устройства синхронно связаны с соответствующими указателями stdin, stdout, stderr. Так что работа со стандартным вводом/выводом сводится к тому, что вместо задаваемых пользователем имен экземпляров соответствующих классов задаются имена стандартных экземпляров классов: cin, cout. Открывать ничего не нужно, надо только использовать операции <> и операции форматирования. Если мы пишем имена переменных, из которых выводятся или в которые вводятся данные, то по умолчанию для ввода/вывода используются определенные форматы. Например, запишем:

cout << i;

В этом случае значение i выведется на экран в формате, определенном по умолчанию для типа i и в минимальном поле.

Запишем:

cin >> i >> j >> s;

где i, j, s описаны соответственно как int, float, char. В записи мы не видим форматов, но при вводе значений этих переменных с клавиатуры (после ввода каждого значения надо нажимать клавишу ) их форматы будут учтены.

1. Объект cout

Объект cout направляет данные в буфер-поток, связанный с объектом stdout, объявленным в файле stdio.h. По умолчанию стандартные потоки С и С++ синхронизированы. При выводе данные могут быть отформатированы с помощью функций-членов класса или манипуляторов. Перечень их приведен в таблице 1.

Таблица 1.

Манипуляторы

Функции-члены класса

Описание

showpos

setf(ios::showpos)

Выдает знак плюс у выводимых положительных чисел

noshowpos

unsetf(ios::showpos)

--

showbase

setf(ios::showbase)

Выдает базу системы счисления в выводимом числе в виде префикса

noshowbase

unsetf(ios::showbase)

--

uppercase

setf(ios::uppercase)

Заменяет символы нижнего регистра на символы верхнего регистра в выходном потоке

nouppercase

unsetf(ios::uppercase)

--

showpoint

setf(ios::showpoint)

Создает символ десятичной точки в сгенерированном потоке с плавающей точкой (в выводимом числе)

noshowpoint

unsetf(ios::showpoint)

--

boolalpha

setf(ios::boolalpha)

Переводит булевый тип в символьный

noboolalpha

unsetf(ios::boolalpha)

--

unitbuf

setf(ios::unitbuf)

Сбрасывает буфер вывода после каждой операции вывода

nounitbuf

unsetf(ios::unitbuf)

--

internal

setf(ios::internal, ios::adjustfield)

Добавляет символы-заполнители к определенным внутренним позициям выходного потока (речь идет о выводе числа в виде потока символов). Если такие позиции не определены, поток не изменяется

left

setf(ios::left, ios::adjustfield)

Добавляет символы-заполнители с конца числа (сдвигая число влево)

right

setf(ios::right, ios::adjustfield)

Добавляет символы-заполнители с начала числа (сдвигая число вправо)

dec

setf(ios::dec, ios::basefield)

Переводит базу вводимых или выводимых целых чисел в десятичную (введенные после этого манипулятора данные будут выводиться как десятичные)

hex

setf(ios::hex, ios::basefield)

Переводит базу вводимых или выводимых целых чисел в шестнадцатеричную (введенные после этого манипулятора данные будут выводиться как шестнадцатеричные)

oct

setf(ios::oct, ios::basefield)

Переводит базу вводимых или выводимых целых чисел в восьмеричную (введенные после этого манипулятора данные будут выводиться как восьмеричные)

fixed

setf(ios::fixed, ios::floatfield)

Переводит выход с плавающей точкой в выход с фиксированной точкой

scientific

setf(ios::scientific, ios::floatfield)

Выдает числа с плавающей точкой в виде, используемом в научных целях: например, число 23450000 будет записано как: 23.45e6

fill(c)

setfill(char_type c)

Задает символ заполнения при выводе данных

precision(n)

setprecision(int n)

Задает точность вывода данных (количество цифр после точки)

setw(int n)

width(n)

Задает ширину поля для выводимых данных (количество символов)

endl

Вставляет символ новой строки ('\n') в выходную последовательность символов и сбрасывает буфер ввода

ends

Вставляет символ '\0' в выходную последовательность символов

flush

flush()

Сбрасывает буфер вывода

ws

Задает пропуск пробелов при вводе

Пример программы с применением объекта cout приведен на листинге 5. Результат работы представлен на рисунке 2.

Листинг 5.

#include <vcl.h>

#include <iostream>

#include <conio.h>

#include <iomanip>

#include <stdio.h>

void main()

{

using namespace std;

int i;

float f;

cout << "Enter i and f >" << endl;

cin >> i >> f;

cout << i << endl;

cout << f << endl;

cout << hex << i << endl;

cout << oct << i << dec << i << endl;

cout << showpos << i << endl;

cout << setbase(16) << i << endl;

cout << setfill('@') << setw(20) << left << dec << i;

cout << endl;

cout.fill('@');

cout.width(20);

cout.setf(ios::left, ios::adjustfield);

cout.setf(ios::dec, ios::basefield);

cout << i << endl;

cout << scientific << setprecision(10) << f << endl;

cout.precision(6);

cout << f << fixed << endl;

getch();

}

Рисунок 2.

2. Стандартный ввод cin

Объект (экземпляр класса) cin управляет вводом из буфера ввода, связанного с объектом stdin, объявленным в файле stdio.h. По умолчанию стандартные потоки в языках С и С++ синхронизированы. При вводе используется часть тех функций и манипуляторов, которые определены для cout. Это такие манипуляторы, как dec, hex, oct, ws и др.

Пример программы с использованием объекта cin приведен в листинге 6. Результат работы представлен на рисунке 3.

Листинг 6.

#include <vcl.h>

#include <iostream>

#include <conio.h>

#include <iomanip>

#include <stdio.h>

void main()

{

using namespace std;

int i;

float f;

char c;

cout << "Enter i,f,c and then input the string >" << endl;

cin >> i >> f >> c;

cout << i << endl << f << endl << c << endl;

char p[50];

cin >> ws >> p;

cout << p << endl;

cin.seekg(0);

cin.getline(p,50);

cout << p << endl;

getch();

}

Рисунок 3.

Заключение

Специалисты C++ рекомендуют использовать для ввода-вывода только потоки STL и отказаться от использования традиционного ввода-вывода в духе C. Однако, ничего не мешает, по крайней мере пока, использовать традиционную систему ввода-вывода. Более того, предусмотрена специальная функция для синхронизации ввода-вывода, выполненного посредством потоков и посредством старых функций.

Какой механизм использовать - вопрос предпочтений программиста, если работодателем явно не предписано использование конкретного механизма. В любом случае для физического ввода-вывода используются вызовы операционной системы. Всё остальное - обёртка, набор более или менее удобных функций или классов для взаимодействия с ОС.

Библиографический список

1. Ахо Альфред В., Хопкрофт В., Ульман Джеффри Д. Структуры данных и алгоритмы -- М.: Вильямс, 2016.

2. Кортмен Т.Х Алгоритмы: построение и анализ -- М.: Вильямс, 2013

3. Миков А. И., Королев Л.Н., Информатика. Введение в компьютерные науки. -- Абрис, Высшая школа, 2012.

4. Мейерс С. Эффективное использование C++. 55 верных советов улучшить структуру и код ваших программ: Пер. с англ. -- 3-е изд. -- М.: ДМК пресс, 2006.

5. Страуструп Б. Язык программирования C++: Пер. с англ. -- 3-е спец. изд. -- М.: Бином, 2003.

6. Джосьютис Н. М. C++. Стандартная библиотека. Для профессионалов: Пер. с англ. -- СПб.: Питер, 2004.

7. Керниган Б. В., Ритчи Д. М. Язык программирования Си: Пер. с англ. -- 3-е изд. -- СПб.: Невский Диалект, 2001.

Размещено на Allbest.ru


Подобные документы

  • Исследование типовой структуры шины персонального компьютера. Подсистема ввода-вывода в ядре операционной системы. Преобразование запросов на ввод-вывод в аппаратные операции. Блочные, символьные и сетевые устройства. Процесс чтения из дискового файла.

    презентация [1,8 M], добавлен 24.01.2014

  • Процедура ввода исходных данных в программу, вывод результатов работы программы на экран. Принцип организации хранения логически связанных наборов информации в виде файлов. Параметры характеристики файла, способы обращения к нему, соглашения по типу.

    реферат [14,5 K], добавлен 06.12.2011

  • В стандарте языка Си отсутствуют средства ввода-вывода. Операции реализуются с помощью функций, находящихся в библиотеке языка Си, поставляемой в составе системы программирования Си. Потоковый, форматный ввод-вывод. Форматный ввод из входного потока.

    реферат [98,9 K], добавлен 24.06.2008

  • Алгоритм и код программы для создания исходного двоичного файла чисел с произвольным количеством элементов, чтения из файла действительных восьмибайтных элементов и подсчёта общего количества элементов файла. Вывод результата работы программы на экран.

    контрольная работа [1,0 M], добавлен 23.11.2014

  • Лисповская функция чтения READ. Интерпретатор. Вызов READ. Построенные структуры. Внешние устройства и доступ к ним. Типы потоков и операции используемые для ввода и вывода. Действие макроса. Запись символов и макроинтерпретаций. Системная переменная.

    доклад [7,8 K], добавлен 22.09.2008

  • Проверка существования и статуса файла. Определение его размера. Открытие файла для чтения, записи, добавления. Закрытие файловых дескрипторов. Запись из переменной в файл. Загрузка файла из сети. Создание и удаление каталога. Функции работы с каталогами.

    презентация [133,9 K], добавлен 21.06.2014

  • Анализ операторов ввода и вывода, а также характеристика форматов, используемых в этих операторах. Оформление законченной программы с применением этих операторов. Структура программы. Алфавит языка и типы данных. Ввод и вывод информации. Форматный вывод.

    лабораторная работа [62,0 K], добавлен 15.07.2010

  • Принципы программирования файловой структуры в операционной системе Windows. Свойства и методы класса Tstream. Пример создания, чтения и записи потока. Чтение, запись и внутренняя структура файла. Пример чтения из файла, начиная с заданной позиции.

    курсовая работа [251,6 K], добавлен 18.05.2011

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

    лабораторная работа [40,4 K], добавлен 06.07.2009

  • Файл как конечное количество последовательных байт, являющееся главной структурной единицей операционных систем, особенности и направления его использования, Основные режимы работы с файлами, порядок их открытия, принципы форматирования и закрытие.

    презентация [382,2 K], добавлен 22.10.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.