Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






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




Файл прототипов <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.

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

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

Потоки стандартного ввода/вывода

Эти потоки открываются автоматически при запуске программы. Внешние указатели stdin, stdout, stderr, stdanx и stdprn – являются указателями на соответствующие переменные типа FILE. Первые три связаны с консолью (потоки ввода, вывада и ошибок – клавиатура-экран),

stdaux – допускает как чтение так и запись и связан поток с портом адаптера

последовательной связи,

stdprn – параллельный порт для принтера.

При вводе информации в потоки stdout и stderr некоторые символы являются управляющими:

‘\a’ – включает звуковой сигнал,

‘\0’ - ограничитель выводной строки символов,

‘\n’ - перевод строки,

‘\r’ - возврат в начало строки,

‘\b’ - возврат на 1 символ,

‘\t’ - табуляция, на 5 символов вправо.

Функции потокового ввода/вывода

Функции потокового ввода/вывода можно разделить на 4 группы:

(1) посимвольного вводы/вывода, (2) построчного ввода/вывода, (3) блокового ввода/вывода, (4) форматированного ввода/вывода.

Функции посимвольного ввода/вывода

Это функции или макро поставляемые с применением <stdio.h>; типа: fgetc(), getc(), fgetchar(), ungetc (), fputc (), putc (), fputchar (), putchar ().

Часть из них требует указания СС на поток, часть работ со стандартными потоками stdin и stdout. Посимвольный ввод выполняется через запрос к MS-DOS для стандартного ввода stdin и поэтому реализуется “эхо”.

Функция getchar () и прочие используют буфер и поэтому программа приостанавливается на этой функции пока не будет заполнен буфер на 127 символов или не будет введено “Enter”. Затем только выполниться выход из getchar (). И если цикл, то все символы из буфера.

Построчный ввод/вывод

Функции специфицируются в файле прототипов stdio.h. Они работают как со стандартными потоками, так и с потоками указанными в качестве параметров. Часть функций при вводе ограничивает число вводимых символов и они считаются более безопасными, иначе ввод может идти за буфер: gets (), fgets (), fputs (), puts ().

Обычно символ f в имени функции означает требование указания потока – параметра так же как и для пассивного ввода/вывода. Отличие функций без f в том, что они выполняют трансляцию ‘\n’ в ‘\0’ при вводе и наоборот при выводе, а символом f в том, что передается при вводе \n’ и добавляется в конце ‘\0’, а при выводе ‘\0’ убирается.

 






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных