ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 23.06.2021

Просмотров: 1692

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

86 

-  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); 

23.5. Строковый ввод-вывод 

Для построчного ввода-вывода используются следующие функции: 

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”);//открыть принимающий файл для записи 


background image

87 

while(fgets(buf,MAXLINE,in)!=0)//прочитать байты из файла in в строку buf 
fputs(buf,out);//записать байты из строки buf в файл out 
fclose(in);fclose(out);//закрыть оба файла 
 

23.6. Блоковый ввод-вывод 

Для блокового ввода-вывода используются функции: 

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); 


background image

88 


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); 

23.7.

 Форматированный ввод-вывод

В некоторых случаях информацию удобно записывать в файл без 

преобразования, т. е. в символьном виде пригодном для непосредственного 
отображения на экран. Для этого можно использовать функции форматированного 
ввода-вывода: 

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); 


background image

89 

fclose(f); 

 

23.8. Прямой доступ к файлам 

Рассмотренные ранее средства обмена с файлами позволяют записывать и 

считывать данные только последовательно. Операции чтения/записи всегда 
производятся, начиная с текущей позиции в потоке. Начальная позиция 
устанавливается при открытии потока и может соответствовать начальному или 
конечному байту потока в зависимости от режима открытия файла. При открытии 
потока в режимах “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);//установить значение указателя на начало потока. 
 

23.9. Удаление и добавление элементов в файле 

Пример 1: 
void del(char *filename) 

//удаление записи с номером х 
FILE *f, *temp; 
f=fopen(filename,”rb”);//открыть исходный файл для чтения 
temp=fopen(“temp”,”wb”)//открыть вспомогательный файл для записи 
student a; 
 

 for(long i=0;.fread(&a,sizeof(student),1,f);i++) 

 if(i!=x) 

 { 

fwrite(&a,sizeof(student)1,temp); 

 } 

 else 


background image

90 

 { 

 cout<<a<<" - is deleting..."; 

 } 

 fclose(f); fclose(temp); 

 remove(filename); 

     rename(“temp”, filename);     

Пример 2: 
void add(char *filename) 

//добавление в файл 
 

student a; 

int n; 

f=fopen(filename,”ab”)открыть файл для добавления 

     

cout<<"\nHow many records would you add to file?"; 

cin>>n; 

for(int i=0;i<n;i++) 

прочитать объект 

    fwrite(&a,sizeof(student),1,f);//записать в файл 

fclose(f);//закрыть файл