КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Лекция 10. В стандарте языка С++ отсутствуют средства ввода-вывода
Файлы. Лекция 9 В стандарте языка С++ отсутствуют средства ввода-вывода. Все операции реализуются с помощью функций. Особенностью языка является отсутствие заранее спланированных структур файлов. Все файлы рассматриваются как неструктурированная последовательность байтов. При таком подходе к организации файлов удалось распространить понятие файла и на различные устройства. Библиотека языка С++ поддерживает три уровня ввода-вывода:
На уровне потокового ввода-вывода обмен данными производится побайтно. Такой ввод-вывод возможен для устройств побайтового обмена (печатающее устройство, дисплей), для файлов на диске. Функции потокового ввода-вывода предоставляют буферизованный форматный и бесформатный ввод-вывод данных. При чтении файла данные помещаются в буфер операционной системы, а затем побайтно или определенными порциями передаются программе. При записи данных в файл, они накапливаются в буфере и при заполнении буфера за одно обращение записываются в виде одного блока в файл. Функции ввода-вывода сгруппированы в 3-х библиотеках: ü stdio.h – функции стандартного ввода-вывода, константы, типы, структуры для работы функций обмена с потоком; ü conio.h – функции консольного терминала и порта; ü io.h – функции, выполняющие операции над файлами. Все функции ввода-вывода верхнего уровня можно разделить на группы: ü доступ к файлам: открытие и закрытие файлов; ü бесформатный ввод-вывод в текстовые файлы (посимвольный и построчный); ü форматный ввод-вывод в текстовые файлы; ü ввод-вывод записей; ü анализ положения указателя и управление положением указателя; ü обработка ошибок. Открытие, закрытие и удаление файлов. Перед работой необходимо открыть поток, т.е. его инициализировать. При этом поток связывается со структурой типа FILE. В структуре FILE содержатся указатель на буфер, указатель (индикатор) текущей позиции в потоке и другая информация. Указатель на поток объявляется в программе следующим образом: #include <stdio.h> FILE *f1; Открытие файла связывает его с соответствующей структурой типа FILE и производится функцией fopen, имеющей прототип: FILE *fopen(char *filename, char *type); - filename – полное имя файла; это может быть указатель-константа, указатель-переменная строки или строковая константа, которая содержит имя файла; - type – определяет способ доступа к файлу:
Поток можно открыть либо в текстовом, либо в бинарном режиме. Для текстового режима в строке type должен быть символ t, для бинарного – b. Например, “wb”. По умолчанию ставится текстовый режим. FILE *f1, *f2, *f3; f1=fopen(“t1.txt”,”r”); для чтения f2=fopen(filename, “a+”); для чтения и дополнения f3=fopen(“con”,”w”); для вывода данных на экран. При вводе данных с клавиатуры команда Ctrl+Z интерпретируется как символ конца файла. Если открытие файла прошло успешно, функция fopen возвращает значение-указатель на переменную типа FILE и связывает файл программы с физическим файлом, а если открытие не состоялось, то функция возвращает NULL. Открытие может не состояться если:
if (f1==NULL) printf(“\n ERROR”); Для вывода на экран текстового сообщения об ошибке при открытии потока используется стандартная библиотечная функция perror(), прототип которой в stdlib.h имеет вид void perror(const char* s); функция выводит строку символов, за которой располагается двоеточие, пробел и сообщение об ошибке. Текст сообщения выбирается функцией на основании номера ошибки. if ((f1=fopen(“t.txt”,”w”))==NULL) {perror(“\n ошибка при чтении”); Функция fclose закрывает один заданный поток (файл). Функция fcloseall закрывает все потоки, открытые fopen, кроме stdin, stdout, stderr. Прототипы функций: int fclose(FILE *stream); int fcloseall(); Например, fclose(f1); fcloseall(); После выполнения этих функций, производится запись буферированных данных их буфера в файл. Все буферы, связанные с потоками, сбрасываются и ОП освобождается. Функция fclose возвращает 0, если поток успешно закрыт. Функция fcloseall возвращает количество закрытых потоков. Если при закрытии произошла ошибка, то обе функции возвращают (-1). Для удаления файла используется функция remove: int remove (const char *filename); Перед удалением файл необходимо закрыть. В случае успешного удаления функция возвращает 0 и не 0 - при неуспешном. Бесформатный ввод-вывод данных в текстовые файлы. getc, fgetc – ввод символа из входного потока; getchar, fgetchar – ввод символов с клавиатуры. int fgetc(FILE* stream) Функции getc, getchar читают символ и перемещают указатель на следующий символ. Они возвращают значение кода прочитанного символа или EOF в случае ошибки или конца файла. char ch; ch=getc(f1); Функция ungetc, ungetchar возвращает символ с во входной поток (если был прочитан лишний символ). int ungetc(int c, FILE *stream); Возвращаемое значение – код символа или EOF при неудаче. Функции putc и fputc вводят один символ в текущую позицию входного потока. int putc(int c, FILE *stream); где с- код вводимого символа Возвращаемое значение – код символа или EOF при неудаче. В качестве символов можно использовать и управляющие символы, например, '\n'. Программа копирует все буквы из одного файла в другой. #include <stdio.h> #include <conio.h> #include <stdlib.h> int main() { clrscr(); FILE *fout; FILE *fin; char c; fout=fopen("t3.txt","w"); if ((fin=fopen("t1.txt","r"))==NULL) printf("\nerror\n"); else { while ((c=getc(fin))!=EOF) if ((c>'a') && (c<'z')) putc(c,fout); fclose(fin); fclose(fout); }} Построчный ввод-вывод данных. char* fgets(char* string, int n, FILE* stream); string – указатель на значение вводимой строки; n – количество вводимых символов, увеличенное на 1; stream – указатель входного потока. Функция fgets читает строку из входного потока до наступления одного из событий: 1. конец строки (\n), который включается в считанную строку; 2. достигнут конец файла; 3. прочитано (n-1) символов. Результат помещается в строку и дополняется символом конца строки. Возвращаемое значение – адрес строки (при успешном чтении) и NULL (при достижении конца файла). Программа читает строки из файла в массив символов. Ввод будет неуспешным, если при выполнении будет обнаружен только конец файла. FILE *f; f=fopen(“t1.txt”,”r”); char a[50]; if(!fgets(a,9,f)) printf(“\n Ошибка при вводе”); Пример ввода строк до конца файла на основе анализа результата feof: while (! feof(f)) { fgets(str, 50, f);………}) Функция getpass используется для ввода с клавиатуры пароля, т.е. строки без эхопечати char* getpass (char *zapros); где zapros – указатель на символьную константу, содержащую приглашение ко вводу пароля. char *b; b=getpass(“\n введите пароль”); if (strcmp(b,”parol”)) //истинно при несовпадении строк printf(“\n ошибка”);
Построчный вывод данных осуществляется функцией fputs. int fputs (char* string, FILE *stream) Функция копирует строку string в поток stream с текущей позиции. Если ввод успешен, то возвращается код последнего введенного символа, если нет – значение EOF. Программа построчно вводит и выводит данные. FILE *f1, *f2; int i; char d[3][17]; f1=fopen(“t1.txt”,”r”); f2=fopen(“con”,”w”); for (i=0;i<3;i++) { fgets(d[i], 17, f1)); fputs(d[i], f2); } fclose(f1); fclose(f2); Программа читает строки из одного текстового файла и записывает в другой. #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <string.h> void main() { clrscr(); FILE *fin,*fout; char *c; fout=fopen("t3.txt","w"); if ((fin=fopen("t2.txt","r"))==NULL) printf("\nerror\n"); else //read from file while (fgets(c,20,fin)!=NULL) { puts(c); printf("\n%d",strlen(c)); //write to file if (strlen(c)==4) fputs(c,fout); } fclose(fin); fclose(fout); getch(); } Форматный ввод-вывод дланных текстовых файлов. При форматном вводе данных введенные значения интерпретируются в соответствии с типом форматов и присваивают эти значения соответствующим переменным. int fscanf (FILE* stream, char * format [, arg….]) Ввод значений различных типов из файла. FILE *f1; int a, e; float b, d; char c[7], g, *ft=”a=%d b=%f c=%s”; f1=fopen(“t1.txt”,”r”); fscanf(f1, ft, &a, &b, &c[0]); fclose(f); Аналогично осуществляется форматный вывод данных int fprintf (FILE* stream, char * format [, arg….]) Программа переписывает в другой файл каждое второе прочитанное число. #include <stdio.h> #include <conio.h> #include <stdlib.h> void main() { clrscr(); int k,l; FILE *fin, *fout; if ((fout=fopen("t4.txt","w"))==NULL) printf("\nerror w\n"); if((fin=fopen("t2.txt","r"))==NULL) printf("\nerror\n"); else { for(int i=1; i<6; i++) { fscanf(fin,"%d %d",&k, &l); printf("%5d",l); fprintf(fout," %3d",l); } } getch(); }
Дата добавления: 2014-01-06; Просмотров: 493; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |