Ввод символьного или строкового потока

Файл. Открытие файла

Концепция потокового обмена

Организация ввода-вывода

Особенностью языка Си является отсутствие операторов ввода — вывода. Эти операции перенесены на верхний (программный) уровень управления и выполняются с помощью функций. Такая организация обмена обеспечивает машинную независимость и переносимость программ, т.к. связь с конкретным периферийным устройством происходит не на стадии выполнения, а на этапе компиляции за счет подключаемых библиотек, содержащих пакеты функций ввода — вывода (библиотеки, естественно, являются платформенно-зависимыми).

Исходя из концепции Unix «всё есть файл», операции обмена в Си рассматриваются как обмен потоком данных между программой и файлами, среди которых могут быть как обычные файлы — наборы данных, так и специальные файлы устройств. При работе с файлами поддерживаются различные виды буферизации, однако для программы эти действия являются «прозрачными», их выполнение обеспечиваются средствами операционной системы.

Потоки данных могут быть структурированными (streams) и низкоуровневыми, из байтов (raw). В соответствии с этим функции ввода — вывода подразделяются на высокоуровневые функции файлового обмена («стандартные») и низкоуровневые системные примитивы.

Для взаимодействия с файлами предназначена структура данных FILE. Данная структура хранит служебную информацию об открытых файлах, такую как права доступа, указатель на файловый буфер, положение курсора в файле и т.д.

Для работы с файлом его необходимо открыть, для этого предназначена функция

FILE *fopen(const char *filename, const char *mode);

filename — абсолютное или относительное имя файла, mode — режим открытия и доступа.

Режимы:

"r" — открытие существующего файла только для чтения (файл должен существовать);

"w" — создание пустого файла для записи;

"a" — открытие существующего файла для записи данных в конец файла (создание файла, если файла с заданным именем не существует);

"r+" — открытие существующего файла для чтения и записи (файл должен существовать);

"w+" — создание нового файла для чтения и записи;

"a+" — тоже, что “a”, но с возможностью чтения;

С каждым файлом связан файловый курсор, указывающий, с какой позиции файла будет совершено чтение или произведена запись. При чтении / записи данных курсор автоматически сдвигается на соответствующее количество данных.

Ввод символов или строк выполняют функции fgetc, fgets, getc, getchar, gets

#include <stdio.h>

int fgetc(FILE *stream);

char *fgets(char *s, int size, FILE *stream);

int getc(FILE *stream);

int getchar(void);

char *gets(char *s);

Функция fgetc() читает следующий символ из потока stream и преобразует его из unsigned к типу int (или EOF, если достигнут конец файла)

Функция getc() эквивалентна fgetc().

Функция getchar() эквивалентна getc(stdin).

Функция gets() читает строку из потока stdin в буфер, адресуемый указателем s, строка должна заканчиваться символом '\0'. Проверка на переполнение буфера не выполняется.

Функция fgets() читает не более, чем size символов из потока stream и сохраняет их в буфере, адресуемом указателем s.

Возвращаемые значения

Функции fgetc(), getc() и getchar() возвращают прочтенный символ, преобразованный к типу int.

Функции gets() и fgets() возвращают указатель s в случае успеха и NULL в случае ошибки


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: