Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lec_prog2_ru_2016_3.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
334 Кб
Скачать
☆

Int main()

{FILE *out,*in; REC rec;

int flag, sz=sizeof(REC); long len,kol,n;

if((out=fopen("mark.txt","wb"))==NULL)

{perror("Выходной файл не открыт"); return 1;}

do {puts("Введите номер записи, фамилию, оценку");

scanf("%d",&rec.id); gets(rec.name);

scanf("%d",&rec.mark);

fwrite(&rec,sz,1,out);//запись в файл блока данных

puts("Продолжить ввод? Да-1, Нет-0");

scanf("%d",&flag);

}while(flag);

fclose(out);// закрытие файла

if((in=fopen("mark.txt","rb"))==NULL)

{perror("Входной файл не открыт"); return 2;}

//сдвиг указателя чтения-записи на конец файла

fseek(in,0,SEEK_END);

len=ftell(in); //определение текущего зн-ия указателя чтения-записи

kol=len/sz; //количество блоков в файле

printf("В файле %d записей\n", kol);

puts("Введите номер записи для чтения:");

scanf("%ld",&n);

if(n>0&&n<=kol)

{fseek(in,(n-1)*sz,SEEK_SET); // установка указателя

//чтения-записи на заданный блок от начала файла

fread(&rec,sz,1,in); //чтение из файла блока данных

printf("%d %s – %d\n",rec.id_rec,rec.name,rec.mark);

}

else puts("Вне файла!");

fclose(in); //закрытие файла

return 0;}

3 Многофайловая компиляция

Программы – это обычно совокупность функций. Функции, как правило, размещают в разных файлах, группируя их по каким-либо признакам. В результате для создания конечной программы необходимо их объединить в единое целое.

Напомним, что из всей совокупности функций в программе может быть только одна главная функция main(), которая является точкой входа в программу.

Для объединения функций в одну программу существует несколько механизмов.

Самый простой способ: создать программу из нескольких файлов, используя препроссесорную директиву #include.

Пример.

// файл file1.cpp

extern int b; // описание внешней переменной b

int func2(int,int); //прототип функции func2

int a=5; // определение внешней переменной а

int func1(int c) // определение функции func1

{int f=func2(c,a); // f=30

return f*b; } // 30*10=300

// файл file2.cpp

extern int k; // описание внешней переменной k

int func2(int x, int y) // определение функции func2

{return x*y+k;} // 2*5+20=30

// файл file3.cpp

#include<stdio.h> //подключение библиотечных функций

#include "file1.cpp" //подключение файла file1.cpp

#include "file2.cpp" //подключение файла file2.cpp

int b=10; // определение внешней переменной b

int k=20; // определение внешней переменной k

Void main()

{int d=2,res;

res=func1(d);//вызов фукции func1 res=300

printf(“k=%d res=%d”,k,res);//вывод результатов на экран

}

В данном примере препроцессор подставил в файл filе3.cpp тексты файлов filе1.cpp и file2.cpp. Переменная a (определена как внешняя в файле filе1), функции func1(), func2() видны и в файле filе3, благодаря работе препроцессора. В файле filе1 для доступа к функции func2() (определена в файле filе2) прописан прототип этой функции. В файлах filе1, filе2 для доступа к пере­менным b, k (определены как внешние в файле filе3) эти перемен­ные описаны со словом extern.

Поведем некоторые итоги.

1) Функции по определению являются глобальными, и им по умолча­нию присваивается класс памяти extern, поэтому функции доступ­ны во всех файлах. Но перед первым использованием функций необ­ходимо записать прототипы, которые необходимы для компилятора.

2) Другие объекты (переменные, массивы, структуры и т.д.) также могут использоваться в файлах, где они не определены. Но они долж­ны быть глобальными, т.е. определены вне функций, и им необходимо присвоить класс памяти extern, если они используются выше своего определения при данном методе создания многофайловой программы.

Каждый объект может быть определен только один раз, но может быть неоднократно описан.

Если использовать в разных файлах одни и те же функции, пере­менные, то в начале всех файлов необходимо поместить прототипы нужных функций и объявление переменных. Можно поместить про­тотипы функций, объявления переменных в отдельный файл с расши­рением .h, и включать этот файл в начало других файлов с помощью оператора #include.

// файл common.h

exrtern int a;

exrtern int b;

exrtern int k;

int func1(int);// прототип функции func1

int func2(int, int);// прототип функции func2

// файл filе1.cpp

#include "common.h"

int a=5; // определение внешней переменной а

int func1(int c){int f=func2(c,a);return f*b;}

// файл file2.cpp

#include "common.h"

int func2(int x, int y) {return x*y+k;}

// файл file3.cpp

#include<stdio.h> //подключение библиотечных функций

#include "common.h" //подключение заголовочного файла

#include "file1.cpp" //подключение файла file1.cpp

#include "file2.cpp" //подключение файла file2.cpp

int b=10; // определение внешней переменной b

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]