int size – размер одного считываемого элемента,
int n – количество считываемых элементов,
FILE*f – указатель на файл, из которого производится считывание.
В случае успешного считывания функция возвращает количество считанных элементов, иначе – EOF.
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);//установить значение указателя на начало потока.
Удаление и добавление элементов в файле
Пример 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
{
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);//закрыть файл
}
ПРАКТИЧЕСКИЕ ЗАНЯТИЯ
Практическое занятие № 1
Тема: . Основные понятия
Цель: Ознакомить студентов, с основными понятиями, которые встречаются при компиляции программ, а также рассмотреть понятия программных модулей, препроцессора, системы программирования.
Краткие теоретические сведения по теме
1.1. Программные модули
Исходный модуль(source code) – это текст программы на языке программирования.
Объектный модуль (object code) – результат обработки компилятором исходного модуля. Объектный модуль не может быть выполнен. Это незавершенный вариант машинной программы. К объектному модулю в общем случае должны быть подсоединены модули стандартной библиотеки, и он должен быть настроен по месту выполнения.
Исполняемый (абсолютный) модуль создает компоновщик (linker), объединяя в один общий модуль объектные модули, реализующие отдельные части алгоритма. На этом этапе к машинной программе подсоединяются необходимые функции стандартной библиотеки.
Стандартная библиотека (library) – набор программных модулей, выполняющих наиболее часто встречающихся в программировании задачи: ввод, вывод данных, вычисление математических функций, сортировки, работа, с памятью и т. д. Модули библиотеки хранятся в откомпилированном виде.
Ошибки, возникающие на этапе компиляции, - ошибки компиляции. Их разделяют на синтаксические и семантические.
В период выполнения программы могут быть ошибки выполнения. Они появляются либо из-за некорректной постановки задачи, либо из-за недопустимых данных и др.
Все программы, выполняемые на компьютере, составляют его программное обеспечение. Работают программы благодаря его аппаратному обеспечению.
Распределение ресурсов компьютера при решении различных задач осуществляет операционная система – комплекс программных модулей. Она контролирует работу аппаратуры исполняемой программы и обеспечивает связь программиста с программой.
Несколько объединенных между собой компьютеров образуют компьютерную сеть. Эти компьютеры могут поочередно использовать некоторые общие ресурсы, как аппаратные, так и программные.
1.2. Препроцессор
До компиляции над программой обычно выполняются некоторые предварительные действия: подключение текстов других исходных модулей, формирование микроопределений, планирование условной компиляции и др. Эта работа выполняется так называемым препроцессором, обычно являющимся составной частью компилятора.
Директивы препроцессора начинаются знаком # (на английском hash). Директива может занимать несколько строк. В конце каждой строки, имеющей продолжение (т. е. кроме последней), ставится обратная косая черта. Например,
#define text Этот текст \
будет замещать \
слово text в программе.
Чаще всего препроцессор используется для того, чтобы подсоединить к компилируемой программе файлы с текстами программных модулей пользователя и соответствующих разделов системной библиотеки. Например,
#include<stdio. h>
#include<iostream. h>
#include<math. h>
#include<alloc. h>
Первые две дерективы обеспечивают подсоединение к программе разделов библиотек, осуществляющих ввод/вывод данных, используемый в языке программирования Borland C++; третья строка – раздел библиотеки с математическими функциями; последняя – с функциями для работы с динамической памятью.
#include“progr. cpp”
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |


