Открытие и закрытие потоковых файлов
Файл прототипов <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;