Открытие и закрытие потоковых файлов


Файл прототипов <stdio.h>.

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

где 1-й параметр – имя файла, может быть указан полный маршрут, иначе в текущей директории. 2-й параметр – режим открытия файла. Если файл открывается успешно, то возвращается ссылка на структурную переменную, характеризующую поток, иначе – NULL.

Режимы открытия.

“r" – только для чтения и для существующего файла,

позиционирование в начало. Если файл не существует, то NULL.

”w” - только для записи; если файл не существует, то он создается; позиционирование в

начало и если файл уже существует, то старое содержимое затрется.

“a” - наполнение файла; позиционирование в конец файла и таким образом возможна

дозапись в файл; если файл не существует, то он создается.

“r+” - для обновления ( т.е. чтения/записи) позиционирование в начало; файл не

усекается, т.е. текущий указатель записи/чтения левее EOF и выполняется

закрытие, то хвост файла сохраняется старый, длина файла остается прежней т.е.

возможно частичное перекрытие старого.

“w+”- для обновления; после закрытия файл усекается; позиционирование в начало; т.е.

частичное перекрытие (возможно чтение/запись), но хвост отбрасывается.

“a+” – для обновления (чтения/записи); после закрытия усечения не происходит;

позиционирование в конец файла.

“b” - двоичный режим.

“t” - текстовый режим.

“b” и “t” указывается после остальных символов режимов, например “r+b” или “a+t”.

Пример

FILE* file_ptr;

if((file_ptr = fopen(“cdirfile.txt”, ”r”)) != NULL)

{

/* действия, связанные с успешным открытием файла*/

}

else

{

/* действия по неудаче открытия файла, например анализ флага ошибок*/

}

 

Анализ ошибок

Для анализа ошибок могут быть использованы функции perror() и strerror(). Первая – печатает строку-аргумент в стандартный поток stderr, затем “:”, потом своё системное сообщение, которое соответствует значению переменной errno и ВК-ПС. Вторая – возвращает указатель на строку системного сообщения. Аргумент должен быть номером ошибки. Значение этого номера можно извлечь из внешней переменной errno из файла <errno.h>, которая содержит код ошибки, если она присутствует.

Пример

#include <stdio.h>

#include <process.h>

#include <errno.h>

void f_job (FILE *);

void main (int argc, char **argv)

{

file * fptt; char * mes;

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

{printf (“\a неполный список аргументов! \n”);

printf (“Необходимо указать:\n”\

“Имя_программы [накопитель:] [ маршрут_ директория]”\

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

exit (1);

{

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

{f_job(fptr); /*основная обработка*/ fclose (fptr);

}else{mes = (char*)malloc(80); mes[0]=’\a’;

mes[1]=’\0’;

perror (strncat(mes,argv[1], 78);

}

Исходные параметры (1) накопитель: маршрут, имя файла и (2) режим доступа указывается в командной строке при запуске программы. “\a “ – включает звуковой сигнал. Если вызывается функция perror(), то печатается:

Полное имя файла программы: No such file or directory.

Другой вариант обработки ошибки это проанализировать код в переменной int errno (errno.h, stddef.h или stdlib.h) или int _doserrno (dos.h, stdlib.h). Последняя переменная содержит коды ошибок регистрируемых в MS DOS, а errno, - регистрируемых в Турбо Си программе.

Переменная char * sys_ errlist [ ] (в stdlib.h) содержит указатели на сообщения об ошибках. В качестве индекса для массива об ошибках можно использовать errno. Переменная sys_nerr (в stdlib.h) указывает число строк сообщений об ошибках в массиве sys_ errlist.

Пример.

void clearer (fptr); /*сброс индикатора конца файла*/

/* и наличие ошибки */

/* операция ввода/вывода */

if (ferror (fptr)){

switch (errno){

cases 2:

cases 3:

cases 35: error Drive (errno); /* обработка специальных*/

break; /* случаев*/

default: perror (“\a Неисправимые ошибки! \n”);

exit (1);

}

}

Самостоятельно: в <stdlib.h> или <errno.h> просмотреть возможные коды, в errno. Определить максимальный код!

Закрытие файла выполняется:

int fclose (FILE *fp)

Возврат 0 в случае успеха, иначе – EOF

int fcloseall (void)

Закрывает все открытые потоки ввода/вывода.

Возвращает общее число закрытых потоков или EOF, если обнаружит какие-либо

ошибки при закрытии.

FILE * freopen (const char * filename,

cjnst char * mode, FILE * stream)

 

закрывает файл, связанный с потоком stream и открывает файл filename в режиме

mode с этим же потоком.

Возвращает NULL, если неуспех или СС на поток. Возможно переоткрытие того же

файла. Фактически используют ту же структурную переменную, но для нового потока!

Пример

freopen (“c:\\fdata 1.tmp”,”w”, stdout);

Выполняется переадресация стандартного ввода в файл fdata 1.tmp.

Обратить внимание, что в соответсвии с соглашениями о строках символ “\ “ в

строках удваивается “\ \“.



Дата добавления: 2016-05-26; просмотров: 1430;


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

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.011 сек.