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