Содержание
Введение
. Ввод и вывод в языке С
.1 Ввод/вывод файлов
.2 Стандартный ввод/вывод
. Ввод и вывод в языке С++
.1 Файловый ввод/вывод с использованием разных классов
.2 Стандартный ввод/вывод в С++
Заключение
Библиографический список
Приложению, написанному на любом языке программирования, необходимо взаимодействовать с пользователем и окружающим миром. Иначе пользы от такого приложения может и не быть. Как правило, такое взаимодействие осуществляется посредством ввода-вывода информации на терминал или в файл.
Стоит, конечно, отметить, что есть множество программ, которые не используют файловый или консольный ввод-вывод: это программы, осуществляющие низкоуровневое взаимодействие с аппаратной частью компьютера и периферией (ядро ОС, драйверы и пр.).
В стандартном C++ существует два основных пути ввода-вывода информации:
- посредством традиционной системы ввода-вывода, унаследованной от языка C;
- с помощью потоков, реализованных в STL (Standard Template Library).
Однако при ближнем рассмотрении оказывается, что и потоки, и традиционная
система ввода-вывода для осуществления необходимых действий используют вызовы
операционной системы.
Ввод/вывод в языке С осуществляется с помощью функций из стандартных
библиотек. Чтобы ими пользоваться, в программу надо включить соответствующие h-файлы: stdio.h, stdlib.h, conio.h и др. Главная библиотека, в которой
содержатся основные функции ввода/вывода, в том числе и обеспечивающие
стандартный ввод/вывод, - stdio.h.
Чтобы работать с файлом, его сначала следует открыть: связать со специальной структурой с именем 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). Она не только разрывает связь структуры с файлом, но и записывает в память оставшееся содержимое буфера ввода/вывода, через который и организуется ввод/вывод. Только после закрытия файла с ним можно выполнять какие-либо действия, т. к. он "свободен", "не привязан". Например, его можно удалить или заново открыть в другом режиме открытия и т.д.
После того как файл открыт, то для чтения или записи данных используют специальные функции.
. Функция fputc()
Формат функции: fputc(c, fp);
Функция выводит символ в файл: с - выводимый символ, fp - указатель на файл.
. Функция fputs()
Формат функции: fputs(s, fp);
Функция выводит строку в файл: s - выводимая строка, fp - указатель на файл.
. Функция fgetc()
Формат функции: char c = fgetc(fp);
Читает один символ из файла с указателем fp. В случае ошибки или достижения конца файла возвращает EOF.
. Функция fgets()
Формат функции: fgets(s, maxline, fp);
Читает строку в s, где s - массив символов или указатель типа char (предварительно должна быть выделена память для чтения с использованием указа- теля), maxline - максимальное число символов, которое требуется читать из файла с указателем fp. В случае ошибки или достижения конца файла возвращает NULL.
. Функция fread()
Формат функции: fread(buf, m, n, fp);
Эта функция читает из файла c указателем fp первые n элементов данных, каждый из которых имеет длину m байт. Чтение происходит в буфер, на который указывает указатель buf, например, char buf[50] или char *buf (но в последнем случае предварительно надо выделить память для буфера). Общее количество байт чтения составит (n*m). Функция возвращает количество прочитанных элементов, а по достижении конца файла или возникновении ошибки чтения возвращает NULL.
. Функция fwrite()
Формат функции: fwrite(ptr, m, n, fp);
Функция добавляет n элементов в файл с указателем fp, каждый элемент длиной в m байт. Данные записываются из буфера, на который указывает указатель ptr (этот указатель указывает на некоторый объект, например, на структуру). Общее количество записанных байтов равно (n * m). В случае ошибки записи функция возвращает ноль, в противном случае - количество записанных элементов.
. Функция 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 - поиск на устройстве запрещен.
. Функция ftell()
Формат функции: long int i = ftell(fp);
Возвращает текущее значение указателя файла fp (т. е. номер текущей позиции) в виде значения типа long int. Отсчет идет в байтах от начала файла. Возвращаемое значение может быть использовано затем в функции fseek(). Если обнаружены ошибки, функция возвращает значение -1L и присваивает глобальной переменной errno положительное значение.
. Функция fscanf()
Формат функции: fscanf(fp, Control, arg1, arg2, ... , argn);
Функция читает данные из файла c указателем fp, преобразует их по форматам, записанным в управляющей строке Control, и отформатированные данные записывает в аргументы arg1, ... , argn.
. Функция fprintf()
Формат функции: fprinf(fp, Control, arg1, arg2, ... , argn);
Выводит данные в файл c указателем fp, преобразует аргументы arg1, ... , argn к форматам, которые записаны в управляющей строке Control, и отформатированные данные записывает в файл.
Формат функции: rewind(fp);
Устанавливает указатель позиционирования в файле с указателем fp на начало потока. Вызов функции rewind(fp) эквивалентен вызову функции fseek(fp, 0L, SEEK_SET) за исключением того, что rewind() сбрасывает индикатор конца файла и индикаторы ошибок, а fseek() сбрасывает только индикатор конца файла. После функции rewind() можно выполнять операции обновления для файлов, открытых для обновления. Функция не возвращает никакого значения.
. Функция remove()
Формат функции: remove(FILENameString);
Функция удаляет файл с именем FILENameString. Перед удалением файл должен быть закрыт. Строка FILENameString должна содержать полный путь к файлу. При нормальном завершении задачи функция возвращает ноль, а в случае ошибки - 1. При этом глобальная переменная errno принимает следующие значения:
- EACCES - запрещено удалять;
- ENOENT - нет такого файла или директории.
. Функция FILElength()
Формат функции: long FILElength(fp);
Функция возвращает длину файла с указателем fp в байтах. Для работы функции требуется подключить файл io.h. В случае ошибки функция возвращает −1, и глобальная переменная errno принимает значение EBADF - неверный указатель файла.
. Функция ferror()
Формат функции: ferror(fp);
Функция тестирует поток на ошибки чтения-записи. Если индикатор ошибки устанавливается, то он остается в таком положении, пока не будут вызваны функции clearerr() или rewind(), или до того момента, пока поток не закроется. Если в файле была обнаружена ошибка, то функция ferror() возвращает ненулевое значение.
. Функция freopen()
Формат функции: FILE *freopen(const char *FILEname, const char *mode, FILE *stream);
Функция подставляет файл, заданный в первом параметре, вместо уже открытого потока. Она закрывает поток независимо от того, открыт ли он. Эта функция полезна для замены файла, связанного со стандартными устройствами ввода/вывода stdin, stdout или stderr. Способы открытия файла аналогичны функции fopen(). При успешном завершении функция возвращает указатель типа FILE (как и функция fopen()), при неуспешном - NULL.
. Функция feof()
Формат функции: feof(fp);
Обнаруживает конец файла с указателем fp: тестирует поток на возникновение индикатора конца файла (который наступает после прочтения последней записи). Как только индикатор установлен, операции чтения файла возвращают индикатор до тех пор, пока не выполнена функция rewind() - "перемотка" в начало файла, или пока файл не будет закрыт. Индикатор конца файла переустанавливается с каждой операцией ввода. Функция возвращает ненулевую величину, если индикатор конца файла был обнаружен при последней операции чтения, в противном случае - ноль.
. Функция ferror()
Формат функции: ferror(FILE *fp);
Функция выдает ненулевое значение, если операция с файловым потоком завершается с ошибкой (например, возникает ошибка чтения файла). Для обработки ошибок ввода/вывода следует записать эту функцию перед блоком работы с файлом в виде:
if (ferror(fp)) { команды обработки ошибок ввода/вывода }
Как только произойдет ошибка, выполнится эта функция, и начнут работать команды обработки ошибок.
. Функция exit()
Формат функции: exit(int status);
Эта функция используется для срочного завершения работы программы при
обработке ошибок открытия файла, а также для прерывания работы программы по
каким-либо причинам. Перед завершением все файлы закрываются, остатки данных,
находящиеся в буфере вывода, записываются в память и вызываются функции
обработки ошибок, предварительно зарегистрированные специальной функцией atexit().
файл операционный система ввод
При запуске любой программы автоматически открываются сразу три файла:
- файл стандартного ввода. Его указатель называется 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.
. Функция getchar()
Формат функции: getchar();
Функция вводит с клавиатуры один символ и возвращает его. Обращаться к этой функции можно так:
char c; // или int c; = getchar();
. Функция putchar()
Формат функции: putchar(c);
Выводит значение переменной с (один символ) на стандартное выводное устройство.
. Функция printf()
Формат функции: printf(Control, arg1, arg2, ... , argn);
Это функция форматного вывода. Выводит на экран содержимое arg1, arg2, ... , argn и возвращает количество выводимых байт. Control - управляющая символьная строка, в которой находятся форматы вывода на экран для соответствующих аргументов arg1, arg2, ... , argn, т. е. первый формат - для вывода arg1, второй - для arg2 и т. д. Все символы, находящиеся между форматами, выводятся один к одному, т. е. не форматируются. Это дает возможность вывода дополнительного текста для улучшения читаемости результата вывода. Форматы вывода задаются так: любой формат начинается с символа '%' и заканчивается одним из символов форматирования:
- d - аргумент преобразуется к десятичному виду (с учетом знака);
- x - аргумент преобразуется в беззнаковую шестнадцатеричную форму;
- U - аргумент преобразуется в беззнаковую десятичную форму;
- с - аргумент рассматривается как отдельный символ;
- s - аргумент рассматривается как строка символов; символы строки печатаются до тех пор, пока не будет достигнут нулевой символ или не будет напечатано количество символов, указанное в спецификации точности;
- е - аргумент рассматривается как переменная типа float или double и преобразуется в десятичную форму в экспонентном виде;
- f - аргумент рассматривается как переменная типа float или double иr преобразуется в десятичную форму;
- n - указатель на целое со знаком;
- p - входной аргумент выводится как указатель.
Между границами формата вывода (от знака % до символа-спецификатора типа выводимого аргумента) находятся:
[флажки][ширина][.точность][F|N|h|l|L]
. Функция scanf()
Формат функции: scanf(Control, arg1, arg2, ... , argn);
Это функция форматного ввода с клавиатуры. Осуществляет посимвольный ввод данных с клавиатуры, преобразует их в соответствии с форматом для каждого значения, указанном в управляющей (форматной) символьной строке Control, и результат преобразования записывает в аргументы arg1, arg2, ..., argn. Смысл строки Control тот же, что и для функции printf(). Так как arg1, arg2, ..., argn - это выходные параметры функции, то при обращении к функции они должны задаваться своими адресами: имена массивов задаются именами, т. к. имя массива - это указатель на его первый элемент, а те аргументы, которые не являются указателями, задаются как &arg. Форматная строка Control - это символьная строка, содержащая три типа объектов: незначащие символы, значащие символы и спецификации формата. Незначащие символы - это пробел, знак табуляции (\t), символ перехода на новую строку (\n). Как только функция встречает незначащий символ в строке формата, она считывает, но не сохраняет все последующие незначащие символы до тех пор, пока не встретится первый значащий символ (т. е. пропускает незначащие символы). Значащие символы - это все символы кода ASCII, кроме символа '%'. Если функция встречает в форматной строке значащий символ, она его считывает, но не сохраняет. Спецификация формата функции имеет вид: