Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Стандартные файлы и функции для работы с нимиСодержание книги
Поиск на нашем сайте
Когда программа начинает выполняться, автоматически открываются несколько потоков, из которых основными являются: - стандартный поток ввода (stdin); - стандартный поток вывода (stdout); - стандартный поток вывода об ошибках (stderr). По умолчанию stdin ставится в соответствие клавиатура, а потокам stdout и stderr - монитор. Для ввода-вывода с помощью стандартных потоков используются функции: - getchar()/putchar() – ввод-вывод отдельного символа; - gets()/puts() – ввод-вывод строки; - scanf()/printf() – форматированный ввод/вывод. Функции рассматривались, когда мы рассматривали строковые и символьные данные. Теперь мы можем связать их со стандартными потоками: ввод осуществляется из стандартного потока stdin вывод осуществляется в стандартный поток stdout. Аналогично работе со стандартными потоками выполняется ввод-вывод в потоки, связанные с файлами. Символьный ввод-вывод Для символьного ввода-вывода используются функции: - int fgetc(FILE*fp), где fp – указатель на поток, из которого выполняется считывание. Функция возвращает очередной символ в форме int из потока fp. Если символ не может быть прочитан, то возвращается значение EOF. - int fputc(int c, FILE*fp), где fp – указатель на поток, в который выполняется запись, c – переменная типа int, в которой содержится записываемый в поток символ. Функция возвращает записанный в поток fp символ в форме int. Если символ не может быть записан, то возвращается значение EOF. Пример: #include <iostream.h> #include <stdio.h> #include <stdlib.h> void main() { FILE *f; char c; char *filename=”f.txt”; if((f=fopen(filename,”r”)==0) { perror(filename);exit(0); } while(c=fgetc(f)!=EOF) putchar(c);//вывод с на стандартное устройство вывода fclose(f); } Строковый ввод-вывод Для построчного ввода-вывода используются следующие функции: 1) char* fgets(char* s,int n,FILE* f), где char*s – адрес, по которому размещаются считанные байты, int n – количество считанных байтов, FILE* f – указатель на файл, из которого производится считывание. Прием байтов заканчивается после передачи n-1 байтов или при получении управляющего символа ‘\n’. Управляющий символ тоже передается в принимающую строку. Строка в любом случае заканчивается ‘\0’. При успешном завершении считывания функция возвращает указатель на прочитанную строку, при неуспешном – 0. 2) int puts(char* s, FILE* f), где char*s – адрес, из которого берутся записываемые в файл байты, FILE* f – указатель на файл, в который производится запись. Символ конца строки (‘\0’) в файл не записывается. Функция возвращает EOF, если при записи в файл произошла ошибка, при успешной записи возвращает неотрицательное число. Пример: //копирование файла in в файл out int MAXLINE=255;//максимальная длина строки FILE *in,//исходный файл *out;//принимающий файл char* buf[MAXLINE];//строка, с помощью которой выполняется копирование in=fopen(“f1.txt”,”r”);//открыть исходный файл для чтения out=fopen(“f2.txt”,”w”);//открыть принимающий файл для записи while(fgets(buf,MAXLINE,in)!=0)//прочитать байты из файла in в строку buf fputs(buf,out);//записать байты из строки buf в файл out fclose(in);fclose(out);//закрыть оба файла
Блоковый ввод-вывод Для блокового ввода-вывода используются функции: 1) int fread(void*ptr,int size, int n, FILE*f), где void*ptr – указатель на область памяти, в которой размещаются считанные из файла данные, int size – размер одного считываемого элемента, int n – количество считываемых элементов, FILE*f – указатель на файл, из которого производится считывание. В случае успешного считывания функция возвращает количество считанных элементов, иначе – EOF. 2) int fwrite(void*ptr,int size, int n, FILE*f), где void*ptr – указатель на область памяти, в которой размещаются считанные из файла данные, int size – размер одного записываемого элемента, int n – количество записываемых элементов, FILE*f – указатель на файл, в который производится запись. В случае успешной записи функция возвращает количество записанных элементов, иначе – EOF. Пример: struct Employee { char name[30]; char title[30]; float rate; }; void main() { Employee e; FILE *f; if((f=fopen(“f.dat”,”wb”))==NULL) { cout<<”\nCannot open file for writing”; exit(1); } int n; //запись в файл printf(“\nN-?”); scanf(“%d”,&n); for(int i=0;i<n;i++) { //формируем структуру е printf(“\nname:”);scanf(“%s”,&e.name); printf(“\ntitle:”);scanf(“%s”,&e.title); printf(“\nrate:”);scanf(“%s”,&e.rate); //записываем е в файл fwrite(&e,sizeof(Employee),1,f); } fclose(f); //чтение из файла if((f=fopen(“f.dat”,”rb”))==NULL) { cout<<”\nCannot open file for reading”; exit(2); } while(fread(&e,sizeof(Employee)1,f) { printf(“%s % s%f”, e.name, e.title, e.rate) } fclose(f); } Форматированный ввод-вывод В некоторых случаях информацию удобно записывать в файл без преобразования, т. е. в символьном виде пригодном для непосредственного отображения на экран. Для этого можно использовать функции форматированного ввода-вывода: 1) int fprintf(FILE *f, const char*fmt,...), где FILE*f – указатель на файл, в который производится запись, const char*fmt – форматная строка, ... – список переменных, которые записываются в файл. Функция возвращает число записанных символов. 2) 1) int fscanf(FILE *f, const char*fmt, par1,par2,...), где FILE*f – указатель на файл, из которого производится чтение, const char*fmt – форматная строка, par1,par2,... – список переменных, в которые заносится информация из файла. Функция возвращает число переменных, которым присвоено значение. Пример: void main() { FILE *f; int n; if((f=fopen(“int.dat”,”w”))==0) { perror(“int.dat”); exit(0); } for(n=1;n<11;n++) fprinf(f,”\n%d %d”,n,n*n); fclose(f); if((f=fopen(“int.dat”,”r”))==0) { perror(“int.dat”); exit(1); } int nn; while(fscanf(f, ”%d%d”,&n,&nn)) printf(“\n%d %d”,n,nn); fclose(f); }
Прямой доступ к файлам Рассмотренные ранее средства обмена с файлами позволяют записывать и считывать данные только последовательно. Операции чтения/записи всегда производятся, начиная с текущей позиции в потоке. Начальная позиция устанавливается при открытии потока и может соответствовать начальному или конечному байту потока в зависимости от режима открытия файла. При открытии потока в режимах “r” и “w” указатель текущей позиции устанавливается на начальный байт потока, при открытии в режиме “a” - за последним байтом в конец файла. При выполнении каждой операции указатель перемещается на новую текущую позицию в соответствии с числом записанных/прочитанных байтов. Средства прямого доступа дают возможность перемещать указатель текущей позиции в потоке на нужный байт. Для этого используется функция int fseek(FILE *f, long off, int org), где FILE *f - – указатель на файл, long off – позиция смещения int org – начало отсчета. Смещение задается выражение или переменной и может быть отрицательным, т. е. возможно перемещение как в прямом, так и в обратном направлениях. Начало отсчета задается одной из определенных в файле <stdio.h> констант: SEEK_SET ==0 – начало файла; SEEK_CUR==1 – текущая позиция; SEEK_END ==2 – конец файла. Функция возвращает 0, если перемещение в потоке выполнено успешно, иначе возвращает ненулевое значение. Примеры: fseek(f,0L,SEEK_SET); //перемещение к началу потока из текущей позиции fseek(f,0L,SEEK_END); //перемещение к концу потока из текущей позиции fseek(f,-(long)sizeof(a),SEEK_SET); //перемещение назад на длину переменной а. Кроме этой функции, для прямого доступа к файлу используются: long tell(FILE *f);//получает значение указателя текущей позиции в потоке; void rewind(FILE *f);//установить значение указателя на начало потока.
|
||||
Последнее изменение этой страницы: 2021-12-15; просмотров: 44; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.143.24.110 (0.006 с.) |