Чтобы открыть поток для буферизованной обработки файла используется библиотечная функция fopen. Спецификация формата ее вызова имеет вид:
FILE* fopen(const char* path, const char* mode);
Аргумент path функции fopen идентифицирует имя файла в файловой системе, для буферизованной обработки которого программа открывает поток. Аргумент mode устанавливает режим доступа к указанному файлу.
Функция fopen может устанавливать три базовых и три модифицированных режима доступа к файлу. Базовый режим доступа устанавливает одно из следующих значений аргумента mode: "r", "w" или "a". Спецификация "r" гарантирует последующее чтение данных из потока. Спецификация "w" означает усечение существующего файла до нулевой длины или создание нового файла и обеспечивает последующую запись данных в поток его обработки. Режим "a" позволяет добавлять данные из потока в конец существующего файла. Для нового файла режимы "a" и "w" эквивалентны. Любая базовая спецификация может быть дополнена модификатором "+", который задает комбинированный режим доступа к файлу: "r+", "w+" или "a+". Каждый из модифицированных режимов доступа позволяет открыть поток одновременно для чтения-записи данных файла, сохраняя свойства соответствующего базового режима.
Если для указанного файла требуемый режим доступа является допустимым, то функция fopen возвращает адрес соответствующей структуры управления потоком ввода-вывода. Этот адрес необходимо присвоить указателю типа ( FILE* ), который принято называть указателем потока. Указатель потока идентифицирует открытый поток и текущее состояние обработки файла для последующих операций ввода-вывода. Он является обязательным явным или неявным аргументом стандартных функций буферизованного ввода-вывода, который обеспечивает их доступ к структуре управления потоком, пока поток открыт для обработки. При нарушении прав доступа к файлу функция fopen возвращает нулевой указатель NULL, устанавливая состояние ошибки. Следующий фрагмент исходного кода демонстрирует классическую схему использования функции fopen, чтобы открыть поток для обработки:
FILE* input;    /* указатель потока ввода */
/* Открыть поток ввода данных файла any.txt */
if((input = fopen("any.txt", "r") == NULL) {
   /* Диагностика и обработка ошибки, если */
   /* файл any.txt недоступен для чтения   */
} /* if */
/* Обработка потока */
По умолчанию, файловый поток, который корректно открыт функцией fopen, буферизуется по блокам, размером BUFSIZ байт, для последующих операций ввода-вывода. Необходимый объем памяти для буфера потока распределяется автоматически в адресном пространстве структуры управления потоком при первом обращении к функциям буферизованного ввода-вывода. Терминальные потоки стандартного ввода-вывода буферизованы по строкам, а стандартный поток диагностики не буферизован. Эти потоки гарантированно открыты и не требуют обращения к функции fopen для начала обработки. Для обращения к стандартным потокам макроопределены указатели stdin, stdout и stderr типа (FILE* ), которые в явной или неявной форме передаются функциям буферизованного ввода-вывода.