Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь 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; просмотров: 86; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.196 (0.008 с.) |