
Лабораторная работа № 7 Файловый ввод/вывод
В языках С и С++ файл рассматривается как поток, представляющий собой последовательность записываемых или считываемых байтов. При этом для потока не важно, что и в какой последовательности в него записано. Задача расшифровки и интерпретации записанных последовательностей байтов возлагается на программу.
1. Файловый ввод/вывод с помощью потоков в стиле с
Классический подход, принятый в С, заключается в том, что информация о потоке (файле) заносится в структуру типа FILE, определенную в файле stdio.h, который необходимо подключать с помощью директивы #include.
Файл открывается с помощью функции fopen, которая возвращает указатель на структуру типа FILE. Синтаксис:
FILE* fopen (const char *filename, const char *mode);
где filename – имя файла, mode – строка, определяющая режим открытия, которая может содержать спецификаторы, указанные в Табл. 1.
Таблица 1.
Спецификаторы режимов открытия файла
Спецификатор |
Значение |
r |
Открыть файл только для чтения |
r+ |
Открыть для чтения и записи |
a |
Открыть или создать файл для записи данных в конец файла |
a+ |
Открыть или создать файл для чтения или записи данных в конец файла |
w |
Открыть файл для записи |
w+ |
Открыть файл для чтения и записи |
t |
Текстовый файл |
b |
Бинарный (двоичный) файл |
Спецификаторы “t” и “b” добавляются к другим спецификаторам в конце или перед «+», например, rt, rb, rt+ и т.д.
Открываемый файл буферизируется, т.е. обмен информацией происходит не непосредственно с файлом, а с буфером в оперативной памяти. Информация переписывается в файл только при переполнении буфера или при закрытии файла. После окончания работы с файлом необходимо вызвать функцию fclose(FILE *), в которую передается указатель потока.
Текстовые файлы
Основные функции для работы с текстовыми файлами представлены в Табл.2.
Таблица 2
Основные функции для работы с текстовыми файлами
Функция |
Синтаксис |
Примеры |
fopen Открыть файл |
FILE* fopen(const char *filename, const char *mode); |
FILE* F1,*F2; F1=fopen(“Text.txt”,”rt”); // Только чтение F2=fopen(“Text.txt”,”rt+”); // Чтение и запись |
fseek Установка позиции в файле |
int fseek(FILE *stream, long offset, int whence);
Устанавливается позиция в файле, отстоящая на offset байт от позиции, указанной whence: SEEK_SET 0 Начало файла SEEK_CUR 1 Текущая позиция SEEK_END 2 Конец файла |
fseek(stream, 0, SEEK_SET); // Начало файла |
feof Проверка окончания файла |
int feof(FILE *stream);
Возвращает ненулевое значение, если прочитан символ конца файла |
if(feof(F1)) break; |
fgets Считать строку |
char* fgets(char * s, int n, FILE *f);
(s – указатель на буфер, в который читается строка; n – число читаемых символов) |
char s[80]; fgets(s, 80, F1); // Читать 80 символов в буфер s из файла F1 |
getc Чтение символа из файла |
int getc (FILE *stream); |
char ch; ch = getc(F1); // Прочитать 1 символ из F1 |
ftell Вернуть текущую позицию в файле |
long int ftell(FILE *stream); |
long int pos; pos=ftell (F1); |
fscanf Чтение форматированных данных |
int fscanf(FILE *stream, const char *format[, address, ...]);
format – строка форматирования данных, см. Табл.3. |
int i; fscanf (F1, “%d”, &i); // Прочитать целое число в переменную i из потока F1 int a,b; double d; fseek(F1, 0, SEEK_SET); fscanf(F1,”%d %d %le”, &a, &b, &d); |
putc Запись символа в поток |
int putc(int c, FILE *stream);
Символ с записывается в поток stream. Если запись успешна, возвращает символ с, иначе – EOF (символ конца файла) |
char ch=’h’; putc (ch,F1); // Поместить символ “h” в поток F1 |
fputs Запись строки в поток |
int fputs(const char *s, FILE *stream); |
char *str; str=”New string \n”; fputs(str, F1); |
fprintf Запись форматированных данных |
int fprintf(FILE *stream, const char *format[, argument, ...]);
format – строка форматирования данных, см. Табл.3. |
int i = 100; char c = ‘C’; float f = 1.234; fprintf(F1, “%d %c %f”, i, c, f);
|
fclose Закрыть файл |
int fclose(FILE *stream);
|
fclose(F1); |
Таблица 3