- •Библиотеки и ввод-вывод данных
- •Ввод-вывод данных. Основные понятия
- •Классификация функций ввода-вывода верхнего уровня
- •Обработка ошибок ввода-вывода
- •Открытие, закрытие и удаление файлов
- •Бесформатный ввод-вывод данных текстовых файлов Посимвольный ввод-вывод данных
- •Построчный ввод-вывод данных
- •Построчный вывод данных
- •Форматный ввод-вывод данных текстовых файлов Форматный ввод данных
- •Форматы ввода данных
- •Форматный вывод данных
- •Форматы вывода данных
- •Форматный вывод арифметических данных
- •Форматный вывод символьных и строковых данных
- •Ввод-вывод записей
- •Ввод записей
- •Вывод записей
- •Дополнительные возможности ввода-вывода данных
Классификация функций ввода-вывода верхнего уровня
Все функции ввода-вывода верхнего уровня могут быть разделены:
доступа к файлам: открытия и закрытия файлов;
бесформатного ввода-вывода в текстовые файлы:
посимвольного ввода-вывода;
построчного ввода-вывода;
форматного ввода-вывода в текстовые файлы;
ввода-вывода записями;
анализа положения и управления положением указателя;
обработки ошибок.
Назначение функций |
Имена функций |
Доступ к файлам |
fopen, freopen, fclose, fcloseall |
Анализ положения указателя |
feof |
Управление положением указателя |
fseek |
Ввод-вывод данных потоком |
|
Посимвольный ввод |
getch, getchar, getc, fgetc |
Посимвольный вывод |
putch, putchar, putc, fputc |
Посимвольный возврат |
ungetc, ungetch |
Построчный ввод |
gets, fgets, getpass |
Построчный вывод |
puts, fputs |
Форматный ввод |
scanf, fscanf, sscanf, cscanf |
Форматный вывод |
printf, fprintf, sprintf |
Ввод-вывод данных записями |
|
Ввод записей |
fread |
Вывод записей |
fwrite |
Ключевые слова имён функций для ввода-вывода данных потоком:
get - бесформатный ввод данных;
put - бесформатный вывод данных;
scanf - форматный ввод данных;
printf - форматный вывод данных.
Правила формирования имён функций ввода-вывода данных потоком
функции посимвольного ввода-вывода - c добавляется справа: getc, fgetc, putc, fputc;
функции построчного ввода-вывода - s добавляется справа: gets, fgets, puts, fputs;
функции форматного ввода-вывода - f добавляется справа: scanf, fscanf, printf, fprintf;
функции ввода-вывода данных из файла - f добавляется слева: fgetc, fprintf; без f – с терминала;
функции пересылки данных в ОП – из строки в переменные списка данных или наоборот: sscanf, sprintf.
Операции ввода и вывода данных в поток начинаются с текущей позиции, определённой указателем файла в потоке. Значение указателя файла изменяется после каждого выполнения операции чтения или записи данных.
Например, при чтении или записи символа указатель смещается в потоке на один байт (1 позиция). Если поток открыт для дополнения файла, указатель файла автоматически устанавливается на конец файла. Терминал не имеет указателя файла.
Обработка ошибок ввода-вывода
Для обработки ошибок ввода-вывода при работе с файлами можно использовать функции perror, ferror и clearer.
Открытие, закрытие и удаление файлов
Открытие файла связывает его с соответствующей структурой типа FILE. ОС автоматически открывает стандартные файлы и устройства. Открытие и закрытие файлов пользователем производится с помощью встроенных функций. Используются функции fopen, freopen, fclose, fcloseall.
Открытие потока производится функцией fopen.
Прототип функции:
FILE *fopen(char *filename, char *type);
где filename определяет полное имя физического файла на магнитном диске; это может быть указатель-константа, указатель-переменная строки или строковая константа, которая содержит имя физического файла;
type определяет способ (режим) доступа к файлу.
Способ доступа |
Назначение способа доступа – открыть файл для: |
“r” |
- read – чтения; файл должен быть уже создан |
“w” |
-write – записи; если был файл с тем же именем, то он стирается при открытии файла |
“a” |
- append – дополнения записей в конец файла; если файла нет, то он создаётся |
“+” |
– допускается чтение из файла и запись в файл |
Допустимые значения способов доступа
Пример Открытие файлов
fid = fopen (“lr2.dat”, “r”); - для чтения;
fin = fopen (filename, “a+”); - для чтения и дополнения;
frz = fopen (“con”, “w”); - для вывода данных на экран;
Имя физического файла “con” определяет консоль.
Если файл открыт с режимом “a” или “a+”, то данные записываются в конец файла, даже если указатель файла был перемещён от конца файла с помощью функций fseek или rewind: при записи в файл указатель перемещается в конец файла. Таким образом, имеющиеся данные файла не могут быть стёрты.
Для режимов “r+”, “w+” и “a+” разрешены чтение и запись, так как файл открыт для обновления (update).
Для текстового режима в строке type должен быть символ ‘t’, для бинарного – ‘b’. Например, “wb”. Если в строке нет ни ‘t’, ни ‘b’, то по умолчанию принимается значение глобальной переменной fmode. В Си fmode определяет текстовый режим. При вводе данных с клавиатуры команда Ctr+z интерпретируется как символ конца файла.
Если открытие файла успешно, функция fopen возвращает значение – указатель на переменную типа FILE и связывает файл программы с физическим файлом. Если открытие файла не состоялось (например, файл с таким именем не найден), функция fopen возвращает значение NULL. Успешность открытия файла можно поверить с помощью оператора if.
После открытия файла можно увидеть в окне просмотра значения, полученные переменными-указателями типа FILE.
Пример Окно просмотра после открытия файлов
fr : DS: 0BBC// После успешного открытия файла
fid : DS: NULL // После неуспешного открытия файла
Функция fclose закрывает один заданный поток (файл).
Функция fcloseall закрывает все потоки (файл), открытые функцией fopen, кроме потоков stdin, stdout, stderr.
Прототипы этих функций:
int fclose (FILE *stream );
int fcloseall ( );
Пример Закрытие файлов
fclose (fid ); fclose (res);
fcloseall ( );
После выполнения этих функций производится запись буферированных данных из буфера в файл. Все буферы, связанные с потоками, сбрасываются, их ОП освобождается.
Функция fclose возвращает значение 0, если поток успешно закрыт. Функция fcloseall возвращает количество закрытых потоков. Если при закрытии произошла ошибка, обе функции возвращают значение EOF (-1).
С помощью функции remove можно удалить файл.
Прототип этой функции:
int remove (const char *filename);
где filename – указатель на строку с именем файла.
Функция remove возвращает значение 0 при успешном удалении файла и не 0 при неуспешном удалении. Если файл был открыт, для удаления его надо предварительно закрыть. Если закрытие неуспешно, с помощью функции perror можно вывести сообщение об ошибке.