- •Лекция №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
- •Определение состояния потока
Функция flushall
Функция
#include<stdio.h>
int flushall(void);
сбрасывает все буфера, связанные с открытыми входными потоками, и записывает в соответствующие файлы все буфера, относящиеся к открытым выходным потокам. Любые операции чтения, следующие за функцией flushall, будут читать новые данные для входных файлов в буферы. Все потоки остаются открытыми.
Функция flushall возвращает число открытых входных и выходных потоков.
Пример:
#include<stdio.h>
int main(void)
{
FILE *stream;
/* создать файл */
stream = fopen("DUMMY.FIL","w");
/* сбросить все открытые потоки */
printf("Сброшено %d потоков\n",flushall());
/* закрыть файл */
fclose(stream);
return 0;
}
Функция dup
Функция
#include<io.h>
int dup(int handle);
возвращает дескриптор файла, который по следующим позициям совпадает с оригинальным дескриптором:
- тот же самый открываемый файл или устройство;
- тот же самый адресный указатель файла (то есть изменение одного адресного указателя приводит к изменению другого);
-тот же самый метод доступа (чтение, запись, чтение/запись).
Переменная handle получают значения при вызове функций creat,_creat,_open, open, dup, dup2.
При успешном завершении функция dup возвращает целое неотрицательное число, обозначающее соответствующий дескриптор файла; в противном случае функция dup возвращает значение -1.
При возникновении ошибки глобальная переменная errno получает одно из следующих значений:
EMFILE - Слишком много открытых файлов.
EBADF - Неверный номер файла.
Пример:
#include<string.h>
#include<stdio.h>
#include<conio.h>
#include<io.h>
void flash(FILE *stream);
int main(void)
{
FILE *fp;
char msg[] = "Тестовый пример";
/* создание файла */
fp = fopen("DUMMY.FIL,"w");
if(fp)
{
/* записать в файл данные */
fwrite(msg,strlen(msg),1,fp);
clrscr();
printf(" Для сброса буферов файла на диск нажмите клавишу ");
getch();
/* Сброс буферов файда на диск без его закрытия */
flush(fp);
printf("Буфера записаны, для завершения нажмите клавишу.");
getch();
}
else
{
printf("Ошибка при открытии файла\n");
}
return 0;
}
void flash(FILE *stream)
{
int duphandle;
/* сброс внутреннего буфера TC */
fflash(stream);
/* сдублировать дескриптор файла */
duphandle = dup(fileno(stream));
/* закрыть второй дескриптор, для сброса внутренних буферов DOS */
close(duphandle);
}
Функция dup2
Функция
#include<io.h>
int dup2(int oldhandle, int newhandle);
возвращают дескриптор файла, который по следующим позициям совпадает с оригинальным дескриптором:
- тот же самый открываемый файл или устройство;
- тот же самый адресный указатель файла (то есть изменение одного адресного указателя приводит к изменению другого);
-тот же самый метод доступа (чтение, запись, чтение/запись).
dup2 создает новый дескриптор со значением newhandle Если файл связанный с дескриптором newhandle открыт, то при вызове dup2 он закрывается.
Переменная newhandle и oldhandle - это дескрипторы файлов, и получают значения при вызове функций creat,_creat,_open, open, dup, dup2.
При успешном завершении функция dup2 возвращает 0, значение в противном случае функция dup2 возвращает значение -1.
При возникновении ошибки глобальная переменная errno получает одно из следующих значений:
EMFILE - Слишком много открытых файлов.
EBADF - Неверный номер файла.
Пример:
#include<sys\stat.h>
#include<string.h>
#include<fcntl.h>
#include<io.h>
#include<stdio.h>
#define STDOUT 1
int main(void)
{
int fptr,oldstdout;
char msg[] = "Тестовый пример";
/* создание файла */
fptr = open("DUMMY.FIL",O_CREAT|O_RDWR,S_IREAD|S_IWRITE);
if(fptr)
{
/* создать дополнительный дескриптор для stdout */
oldstdout = dup(STDOUT);
/* перенаправить стандартный вывод в файл, путем
дублирования его дескриптора */
dup2(fptr,STDOUT);
/* закрыть файл */
close(fptr);
/* было перенаправлено в DUMMY.FIL */
write(STDOUT,msg,strlen(msg));
/* восстановить исходный дескриптор stdout */
dup2(oldstdout,STDOUT);
/* закрыть второй дескриптор stdout */
close(oldstdout);
}
else
{
printf("Ошибка при открытии файла. \n");
}
return 0;
}
