Logo GenDocs.ru

Поиск по сайту:  


Загрузка...

Лекции по C/С++ - файл Л8.doc


Загрузка...
Лекции по C/С++
скачать (357.8 kb.)

Доступные файлы (8):

Л1.doc318kb.06.09.2009 15:02скачать
Л2.doc250kb.06.09.2009 14:56скачать
Л3.doc127kb.07.12.2009 15:34скачать
Л4.doc250kb.06.09.2009 14:57скачать
Л5.doc151kb.06.09.2009 14:58скачать
Л6.doc165kb.06.09.2009 14:58скачать
Л7.doc150kb.06.09.2009 14:58скачать
Л8.doc269kb.13.01.2006 20:00скачать

Л8.doc

  1   2   3
Реклама MarketGid:
Загрузка...

Лекция №8


9. ФАЙЛЫ
9.1. РАБОТА С ФАЙЛАМИ В ЯЗЫКЕ С

Открытие и закрытие файла
Открытие файла для ввода-вывода через поток выполняет функция fopen().

#include<stdio.h>

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

Возвращает указатель на переменную типа FILE, описывающий открытый поток файлового ввода-вывода. Если невозможно открыть файл, функция возвращает NULL-указатель. Переменная filename-указатель на ASCIIZ-строку символов, задающую спецификацию открытого файла. Если не специфицируется буква накопителя, используется накопитель по умолчанию. Если не задан абсолютный маршрут, в качестве начального директория используется текущая рабочая директория выбранного накопителя. Переменная mode-указатель на ASCIIZ-строку символов, задающую режим открытия файла. Образуется комбинацией символов, приведенных в табл.3.1.

^

Табл.1. Символы задания режима открытия потока ввода-вывода



Знак

Функция

r

Файл открывается только для чтения. Так может быть открыт лишь уже существующий файл. Если файл с заданной спецификацией не существует, fopen() возвращает NULL. При успешном открытии указатель записи-чтения файла устанавливается в 0.

w

Файл открывается только для записи с усечением. Если файл не существует, он создается в заданном параметром filename директории. Созданный файл имеет атрибут архивного файла. Если создать файл не удается, функция возвращает NULL. Если файл существует, но имеет атрибут "только читаемый", возвращается NULL. При успешном открытии указатель записи-чтения файла устанавливается в 0. По этой причине возможно переопределение содержимого существующего файла, если перед доступом к файлу не выполняется принудительная установка указателя. Если все предыдущее содержимое должно быть сохранено, можно либо сразу после открытия выполнить перемотку указателя на конец файла (см. далее), либо открыть файл в режиме пополнения содержимого – режиме "а". Попытка чтения из файла завершается возвратом ошибки функцией чтения. После закрытия файл имеет всегда "новый" размер, соответствующий текущему положению указателя записи-чтения. Поэтому открытие существующего файла и его немедленное закрытие усекают файл до нулевой длины.

a

Файл открывается для пополнения. Все то же самое, что и для режима "w", но после открытия файла указатель записи-чтения устанавливается на позицию конца файла. В результате запись в файл происходит с сохранением предыдущего содержимого.

r+

Файл открывается для обновления. Он доступен для чтения и записи, но после закрытия не происходит усечение файла: размер файла остается прежним, если текущий указатель записи-чтения файла состоит "левее" прежнего положения EOF. Сразу после открытия файла указатель устанавливается на начало файла.

w+

Файл открывается для обновления. Он доступен для чтения и записи, после закрытия существующий файл усекается. Если открываемый файл не существует, он создается в директории, задаваемом спецификацией файла. Сразу после открытия файла указатель записи-чтения файла устанавливается на начало файла.

Файл открывается для обновления. Он доступен для чтения и записи, но после закрытия не происходит усечения файла. Сразу после открытия файла указатель записи-чтения устанавливается на позицию EOF.

a+

Файл открывается для обновления. Он доступен для чтения и записи, но после закрытия существующий файл не усекается. Сразу после открытия файла указатель записи-чтения устанавливается на позицию EOF.

b

Файл открывается в двоичном режиме (см.3.1). Специализируется после r, w, a, r+, w+, a+, например "a+b". Для повышения мобильности программного кода предпочтительнее использовать управление двоичным или текстовым режимом через переменную _fmode, так как реализации Си для других ОС могут и не содержать параметров b или t при открытии файла.

t

Файл открывается в текстовом режиме (см.3.1). Специализируется после r, w, a, r+, w+, a+, например “rt”.
Если данный файл открывается или создается в текстовом режиме, вы можете приписать символ t к значению параметра type (rt, w+t, и т.д.); аналогично, для спецификации бинарного режима вы можете к значению параметра type добавить символ b (wb, a+b, и т.д.).

Если в параметре type отсутствуют символы t или b, режим будет определяться глобальной переменной _fmode. Если переменная _fmode имеет значение O_BINARY, файлы будут открываться в бинарном режиме, иначе, если _fmode имеет значение O_TEXT, файлы открываются в текстовом режиме. Данные константы O_... определены в файле fcntl.h.

При открытии файла в режиме обновления (UPDATE), над результирующим потоком stream могут быть выполнены как операции ввода, так и вывода. Тем не менее вывод не может следовать непосредственно за вводом без вмешательства функций fseek или rewind. Также ввод, без применения функций fseek, rewind не может непосредственно следовать за выводом или вводом, который встречает конец файла (EOF).

Пример:

#include <stdio.h>

int main(void)

{

FILE *in, *out;

if((in = fopen("\\AUTOEXEC.BAT","rt"))==NULL)

{

fprintf(stderr, "Не могу открыть файл \n");

return(1);

}

if((out = fopen("\\AUTOEXEC.BAK","wt"))==NULL)

{

fprintf(stderr, "Не могу открыть выходной файл \n");

return(1);

}

while(!feof(in))
fputc(fgetc(in), out);
fclose(in);

fclose(out);

return 0;

}

^

Функция fclose


Функция

#include <stdio.h>

int fclose (FILE * stream);
закрывает указанный поток stream. Все буфера, связанные с потоком stream, перед закрытием сбрасываются. Буфера, размещенные системой, освобождаются во время процесса закрытия. Буфера, назначенные функциями setbuf или setvbuf, не освобождаются автоматически. (Однако, если в качестве указателя, функции setvbuf передать 0, то он будет освобожден при закрытии потока.)

Функция fclose при успешном завершении возвращает 0. Если были обнаружены какие-либо ошибки, функция fclose возвращает значение EOF.

Пример:

#include<string.h>

#include<stdio.h>

int main(void)

{

FILE *fp;

char buf[11] = "0123456789";

/* создать файл содержащий 10 байт */

fp = fopen("DUMMY.FIL","w");

if(fp)

{

fwrite(&buf,strlen(buf),1,fp);

/* закрыть файл */

fclose(fp);

}

else

{

printf("Ошибка, при открытии файла\n");

}

return 0;

}

^ Функция fcloseall

Функция

#include <stdio.h>

int fcloseall (void)

закрывает все открытые потоки ввода-вывода. за исключением stdin, stdout, stderr, stdaux, stdprn. Возвращает общее число потоков, закрытых функцией, либо EOF, если обнаружены какие-либо ошибки при закрытии файлов.

Пример:

#include<stdio.h>

int main(void)

{

FILE *fp1,*fp2;

int streams_closed;

/* открыть два потока */

fp1 = fopen("DUMMY.ONE","w");

fp2 = fopen("DUMMY.TWO","w");

/* закрыть открытые потоки */

streams_closed = fcloseall();

if(streams_closed == EOF)

/* вывести сообщение об ошибке */

perror(" Ошибка ");

else

/* вывести результат работы функции */

printf("Было закрыто %d потока\n",streams_closed);

return 0;

}
^ Функция feof

Функция

#include<stdio.h>

int feof(FILE * stream);

является макрокомандой, которая производит проверку данного потока stream на признак конца файла (EOF). Если признак получил значение хотя бы один раз, то операции чтения файла сохраняют это значение до тех пор, пока не будет вызвана функция rewind или файл не будет закрыт. Признак конца файла сбрасывается при каждой операции ввода.

Функция feof возвращает ненулевое значение, если при последней операции ввода потока stream был обнаружен конец файла, и 0 в противном случае.

Пример:

#include <stdio.h>

int main(void)

{

FILE *stream;

char ch;

/* открыть файл для чтения */

stream = fopen("DUMMY.FIL", "r");
/* ввести из файла символ */

ch = fgetc(stream);

/* конец файла? */

if(feof(stream))

printf("Конец файла\n");

/* закрыть файл */

fclose(stream);

return 0;

}

^ Функция fscanf
Функция

#include <stdio.h>

int fscanf(FILE * stream, char * format[, adress,...]);

сканирует посимвольно набор вводимых полей, считывая их из потока. Затем каждое поле из потока форматируется в соответствии со спецификацией формата, которая передается fscanf в виде указателя на строку format. Полученное в результате этого поле fscanf запоминает в аргументах, передаваемых функции fscanf после параметра format. Количество аргументов должно совпадать с количеством спецификаций формата.

Описание спецификаций формата приведено в описании функции scanf.

Функция fscanf завершает сканирование отдельного поля при появлении пробела, являющегося разделителем, или при вводе поля, для которого указана ширина. Эти случаи обсуждаются в описании функции scanf.

Функция fscanf возвращает количество успешно прочитанных, преобразованных и запомненных входных полей; возвращаемое значение не включает в себя прочитанные поля, которые не были сохранены.

Если fscanf делает попытку чтения в конце файла, то возвращается EOF. Если не было записано ни одного поля, возвращается значение 0.

Пример:

#include<stdlib.h>

#include<stdio.h>

int main(void)

{

int i;

printf("Введите целое число:");

/* ввести из стандартного потока stdout целое число */

if(fscanf(stdin,"%d",&i))

printf("Целое равно:%d\n",i);

else

{

fprintf(stderr,"Ошибка чтения целого\n");

exit(1);

}

return 0;

}


Самостоятельная проработка:



Функция freopen

Функция

#include <stdio.h>

FILE*freopen (const char*filename, const char*mode, FILE*stream)

закрывает поток, на описание которого указывает stream, а затем открывает файл, на спецификацию которого указывает ASCIIZ-строка filename. Режим открытия файла задает ASCIIZ- строка mode. Символы, формирующие режим, приведены в табл.3.1. В случае успеха функция возвращает указатель на описание открытого потока, которое будет совпадать с stream. В противном случае функция возвращает NULL. Повторное открытие того же самого файла изменяет права доступа, очищает внутренние буферы и позиционирует указатель записи-чтения либо на начало файла (r, w, r+, w+), либо на его конец (а, а+). Если файлы разные, переоткрытие приводит к переадресации файлового ввода-вывода. Эта функция обычно применяется для переадресации предоткрытых потоков stdin, stdout, stderr, stdaux, stdprn в файлы, определяемые пользователем.

^ Функция ftmpfile

Функция

#include<stdio.h>

FILE*tmpfile (void)

Создает и открывает временный файл в текущей директории текущего накопителя для потокового ввода-вывода. Файл открывается с правами “w+b”. В случае успеха функция возвращает указатель на начало описания открытого потока. В противном случае возвращается NULL. Отсутствует возможность определить имя созданного файла. После завершения программы или закрытия файла он автоматически удаляется. Функция используется тогда, когда программе необходимо временно переместить промежуточные данные на диск.

Пример тестовой программы:

/*L3_1.C*/

#include<stdio.h>

#include<process.h>

#include<errno.h>

void file_prt(FILE*);

void main(int argc, char**argv)

{ FILE*fptr;

if(argc<3)/* все ли аргументы заданы?*/

{ printf(“\аНеправильно заданы аргументы. “\

“Использование программы:\n”\

“L3_1[d:][маршрут_директория ] имя_файла”\

“[.расширение] режим_открытия\n”);

exit(1); }

if((fptr=fopen(argv[1], argv[2]))!=NULL)

{ file_prt(fptr); /*распечатывает поля fptr*/

fclose(fptr); } /*открытый файл закрывается*/

else perror(“\aОшибка открытия файла”);

}

/*Внутренняя функция L3_1.C. Распечатывает поля переменной, описывающей открытый поток, на которую указывает fptr.*/

void file_prt(FILE*fptr)

{ printf(“ Поля переменной по шаблону FILE после открытия\n\n”\

“level=%#06x flags=%#06x fd =%#06x”\

“hold=%#06x bsize=%#06x\nbuffer=%#06x”\

“curp=%#06x istemp=%#06x token=%#06x\n” ,

fptr->level,fptr->flags,fptr->fd,

fptr->hold,fptr->bsize,fptr->buffer,

fptr->curp,fptr->istemp,fptr->token);

/* Вывод символического представления флагов*/

printf(“\nСимволическое представление флагов открытия\n”\

“ (Да=1, Нет=0) \n”\

“_F_READ %d Файл открыт для чтения\n”\

“_F_WRITE %d Файл открыт для записи\n”\

“_F_BUF %d Файл имеет выделенный динамически буфер данных\n”\

“_F_LBUF %d Построчно буферизуемый файл\n”\

“_F_ERR %d Индикатор наличия ошибки при выполнении файлового доступа\n”\

“_F_EOF %d Индикатор наступления условия конца файла\n”\

“_F_BIN %d Признак открытия файла в двоичном режиме\n”\

“_F_IN %d Осуществляется чтение(ввод) данных из файла\n”\

“_F_OUT %d Осуществляется запись(вывод) данных в файла\n”\

“_F_TERM %d Файл является терминалом\n”,

fptr->flags&_F_READ,( fptr->flags&_F_WRIT)>>1,

(fptr->flags&_F_BUF)>>2,( fptr->flags&_F_LBUF)>>3,

(fptr->flags&_F_ERR)>>4,( fptr->flags&_F_EOF)>>5,

(fptr->flags&_F_BIN)>>6,( fptr->flags&_F_IN)>>7,

(fptr->flags&_F_OUT)>>8,( fptr->flags&_F_TERM)>>9);

}

^ Функция 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);

}


^ Функция fgetpos

Функция

#include<stdio.h>

int fgetpos(FILE * stream, fpos_t *pos);

сохраняет позицию указателя файла, связанного с потоком stream, в месте, указываемом pos.

Тип fpos_t описывается следующим образом:

typedef long fpos_t;
При успешном завершении fgetpos возвращает 0. При ошибке возвращает ненулевое значение и устанавливает errno в EBADF или EINVAL.

Пример:

#include<string.h>

#include<stdio.h>

int main(void)

{

FILE *stream;

char string[] = "Тестовый пример";

fpos_t filepos;

/* создать файл для его изменения */

stream = fopen("DUMMY.FIL","w+");

/* записать в файл данные */

fwrite(string,strlen(string),1,stream);

/* сообщить положение указателя */

fgetpos(stream,&filepos);

printf("Указатель находится в %ld позиции\n");

fclose(stream);

return 0;

}


^ Функция fgets

Функция

#include<stdio.h>

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

считывает из потока stream строку символов и помещает ее в s. Ввод завершается после ввода n-1 символа или при вводе символа перехода на следующую строку, смотря что произойдет раньше. В отличие от gets, fgets прекращает ввод строки при получении символа перехода на следующую строку.

Нулевой байт добавляется в конец строки для индикации ее конца.

При успешном завершении возвращает указатель на s, при ошибке или конце файла возвращает NULL.

Пример:

#include<string.h>

#include<stdio.h>

int main(void)

{

FILE *stream;

char string[] = "Тестовый пример";

char msg[20];

/* создать файл для его изменения */

stream = fopen("DUMMY.FIL","w+");

/* записать в файл данные */

fwrite(string,strlen(string),1,stream);

/* перейти в начало файла */

fseek(stream,0,SEEK_SET);

/* ввести строку из файла */

fgets(msg,strlen(string)+1,stream);

/* напечатать строку */

printf("%s",msg);

fclose(stream);

return 0;

}

^ Функция filelength

Функция

#include<io.h>

long filelength(int handle);

возвращает длину в байтах файла, соответствующего дескриптору handle.

При успешном завершении функция filelength возвращает значение типа long- длину файла в байтах. При ошибке функция возвращает значение -1L, и глобальной переменной errno присваивается: EBADF - Неверный номер файла.

Пример:

#include<stdio.h>

#include<io.h>

#include<fcntl.h>

#include<sys\stat.h>

#include<string.h>

int main(void)

{

int handle;

char buf[11] = "0123456789";

/* создать файл из 10 байт */

handle = open("DUMMY.FIL",O_RDWR|O_CREAT|O_TRUNC,S_IREAD|S_IWRITE);

write(handle,buf,strlen(buf));

/* напечатать размер файла */

printf("Размер файла в байтах : %ld\n",filelength(handle));

/* закрыть файл */

close(handle);

return 0;

}
^ Функция fileno

Функция

#include<stdio.h>

int fileno(FILE * stream);

представляет собой макрокоманду, которая возвращает логический номер файла для заданного потока stream. Если поток stream имеет более одного номера, функция fileno возвращает номер, назначенный данному потоку при первом открытии.

Функция fileno возвращает целое число, обозначающее значение дескриптор файла, соответствующий потоку stream.

Пример:

#include<stdio.h>

int main(void)

{

FILE *stream;

int handle;

/* создать файл */

stream = fopen("DUMMY.FIL","w");

/* получить дескриптор файла */

handle = fileno(stream);

/* напечатать его */

printf("Дескриптор файла = %d\n",handle);

/* закрыть файл */

fclose(stream);

return 0;

}
^ Функция 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;

}

^ Функции ввода-вывода

  1   2   3



Скачать файл (357.8 kb.)

Поиск по сайту:  

© gendocs.ru
При копировании укажите ссылку.
обратиться к администрации
Рейтинг@Mail.ru