- •Лекция №8
- •9. Файлы
- •9.1. Работа с файлами в языке с Открытие и закрытие файла
- •Функция fclose
- •Функция fcloseall
- •Функция feof
- •Функция fscanf
- •Функция freopen
- •Функция ftmpfile
- •Функция fdopen
- •Функция eof
- •Функция fgetpos
- •Функция fileno
- •Функция flushall
- •Функция dup
- •Функция dup2
- •Функции ввода-вывода
- •Функция fgetc
- •Функция getc
- •Функция ungetc
- •Функция fputs
- •Функция fread
- •Функция fwrite
- •Функция fseek
- •Функция fsetpos
- •Функция fstat
- •Функция ftell
- •Открытие и закрытие файлов
- •Класс istream
- •Функции get, getline и read
- •Функция возвращения
- •Позиционирование потока
- •Класс ostream
- •Функции вывода put и write
- •Функции класса filebuf
- •Функции класса streambuf
- •Функции класса strstreambuf
- •Определение состояния потока
Функция fdopen
Функция
#include<stdio.h>
FILE * fdopen(int handle, char * type);
связывает поток с дескриптором, полученным функциями creat, dup, dup2 или open. Тип потока должен совпадать с режимом, в котором был открыт handle(см. таблицу 1).
При успешном завершении fdopen возвращает значение заново открытый поток stream. В случае ошибки, функция возвращают ноль (NULL).
Пример:
#include<sys\stat.h>
#include <stdio.h>
#include <fcntl.h>
#include<io.h>
int main(void)
{
int handle;
FILE *stream;
/* открыть файл */
handle = open("DUMMY.FIL", O_CREAT, S_IREAD|S_IWRITE);
/* теперь преобразуем его в поток */
stream = fdopen(handle, "w");
if (stream == NULL)
printf("Ошибка fdopen\n");
else {
fprintf(stream, "Hello, world\n");
fclose(stream);
}
return 0;
}
Функция eof
Функция
#include<io.h>
int eof(int handle);
определяет, достигнут ли конец файла, связанного с дескриптором handle.
Если текущая позиция является концом файла, функция eof возвращает значение 1; в противном случае значение 0. При возникновении ошибки возвращается значение -1, и глобальная переменная errno получает значение: EBADF - Неверный номер файла.
Пример:
#include<process.h>
#include<string.h>
#include<stdio.h>
#include<io.h>
int main(void)
{
FILE *temp_file;
int handle;
char msg[] = "Тестовый пример";
char ch;
/* создать уникальный временный файл */
if((temp_file=tmpfile()) == NULL)
{
perror("Открытие файла:");
exit(1);
}
/* получить дескриптор данного файла */
handle = fileno(temp_file);
/* записать в файл данные */
write(handle,msg,strlen(msg));
/* переместить указатель в начало файла */
lseek(handle,0l,SEEK_SET);
/* считывать данные до появления конца файла */
do
{
read(handle,&ch,1);
printf("%c",ch);
} while(!eof(handle);
/* закрыть временный файл */
fclose(temp_file);
return 0;
}
Функция ferror
Функция
#include<stdio.h>
int ferror(FILE * stream);
является макрокомандой, которая проверяет данный поток stream на ошибочную операцию записи или чтения. Если установлен признак ошибки потока stream, он сохраняет его до вызова функций clearerr или rewind или до момента закрытия потока.
Функция ferror возвращает ненулевое значение, если в потоке stream была обнаружена ошибка.
Пример:
#include <stdio.h>
int main(void)
{
FILE *stream;
char ch;
/* открыть файл для записи */
stream = fopen("DUMMY.FIL", "w");
/* справоцировать ошибку */
ch = fgetc(stream);
/* конец файла? */
if(ferror(stream))
{
/* вывести сообщение об ошибке */
printf("Ошибка чтения\n");
/* сбросить признак ошибки */
clearerr(stream);
}
fclose(stream);
return 0;
}
Функция fflush
Функция
#include<stdio.h>
int fflush(FILE * stream);
записывает в файл содержимое буфера, связанного с потоком stream, если он был открыт на вывод. Функция fflush не оказывает влияния на не буферизованные потоки.
В случае успешного завершения возвращает 0. При ошибке возвращает EOF.
Пример:
#include<string.h>
#include<stdio.h>
#include<conio.h>
#include<io.h>
void flush(FILE *stream);
int main(void)
{
FILE *stream;
char msg[] = "Тестовый пример";
/* создать файл */
stream = fopen("DUMMY.FIL","w");
/* записать в файл данные */
fwrite(msg,strlen(msg),1,stream);
clrscr();
printf("Для сброса потока нажмите любую клавишу ...\n");
getch();
/* сбросить данные в файл, без его закрытия */
flush(stream);
printf("Содержимое буферов сброшено в файл\n");
printf("Для завершения нажмите любую клавишу\n");
getch();
return 0;
}
void flush(FILE *stream)
{
int duphandle;
/* сбросить внутренние буфера файла */
fflash(stream);
/* создать второй дескриптор */
duphandle = dup(fileno(stream));
/* закрыть второй дескриптор для сброса буферов DOS */
close(duphandle);
}
