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