Консольный ввод/вывод
Файлы
В С файлы - это логическая концепция, применимая ко всему, начиная от дисковых файлов оканчивая терминалами. Поток связывается с конкретным файлом с помощью операции открытия. Если файл открыт, может осуществляться обмен между файлом и программой.
Не все файлы имеют одинаковые возможности. Например, дисковый файл поддерживает произвольный доступ, а модем - нет. Это иллюстрирует важный момент системы ввода/вывода С -все потоки одинаковы, а файлы нет.
Если файл поддерживает произвольный доступ, открытие файла инициализирует индикатор позиции файла на начало файла. По мере чтения или записи символов в файл индикатор позиции увеличивается, обеспечивая тем самым продвижение по файлу.
Наименьшей частью доступа к диску является сектор. Информация записывается или читается с диска посекторно. Следовательно, даже если программе необходим 1 байт данных, будет прочитан весь сектор. Эти данные помещаются в буфер - область памяти, пока не смогут использоваться программой. Когда данные вводятся в файл, происходит буферизация, пока не накопится целый сектор информации, после чего данные физически записываются в файл.
Связь потока с файлом уничтожается с помощью операции закрытия. Закрытие потока вызывает принудительный сброс всего содержимого буфера во внешнее устройство (если необходимо, информация будет дополнена для создания полного сектора). Данный процесс, как правило, называется очисткой буфера, и он гарантирует, что в буфере не останется информации. Все файлы закрываются автоматически, когда программа нормальным образом завершает работу, выходя из функции main() или с помощью вызова exit(). Тем не менее, лучше самому закрыть файлы, используя fclose() в тот момент, когда файл уже не нужен, поскольку некоторые события могут помешать записи буфера на диск. Например, файл не записывается, если программа завершает работу вызовом abort(), если она разрушается или если пользователь выключает компьютер перед завершением программы.
В начале работы программы открыты пять предопределенных текстовых потоков: stdin, stdout, stderr, stdaux и stdprn. Они соответствуют следующим стандартным устройствам ввода/вывода:
Поток | Устройство |
stdin stdout stderr stdaux stdprn | Клавиатура Экран Экран Первый последовательный порт Принтер |
Первые три потока определены стандартом ANSI С и любой код, использующий их, является полностью переносимым. Последние два определены Borland и не могут переноситься в другие компиляторы. Большинство операционных систем, допускают перенаправление ввода/вывода, поэтому подпрограммы, читающие или записывающие в данные потоки, могут быть перенаправлены на другие устройства. (Перенаправление ввода/вывода - это процесс, когда информация, поступающая обычно на одно устройство, перенаправляется на другое устройство операционной системой.) Никогда не следует явно открывать или закрывать данные файлы.
Каждый поток, ассоциированный с файлом, имеет структуру управления файлом типа FILE. Данная структура определена в заголовочном файле stdio.h. Не следует модифицировать данную структуру.
Для новичков в программировании разделение потоков и файлов в С может показаться надуманным. Просто надо помнить, что основная цель состоит в предоставлении постоянного интерфейса. В С следует думать в терминах потоков и использовать только одну файловую систему для выполнения операций ввода/вывода. Система ввода/вывода С автоматически преобразует необработанную информацию, поступающую со входа или на выход, в легко управляемый поток.
Консольный ввод/вывод относится к событиям, возникающим от клавиатуры или на экране. Поскольку ввод и вывод на консоль - это типичные операции, была создана подсистема файловой системы ввода/вывода ANSI С для работы исключительно с консолью. Эти функции направляют операции в стандартный ввод (stdin) и стандартный вывод (stdout) системы. Возможно перенаправить консольный ввод на другие устройства. Для простоты обсуждения предполагается, что консоль - это устройство, используемое стандартными способами.