ТОР 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’ убирается.
Не нашли, что искали? Воспользуйтесь поиском:
|