- •Конспект лекций по дисциплине "Программирование"(іі часть)
- •123 "Компьютерная инженерия"
- •1 Функции 6
- •1 Функции
- •1.1 Определение, описание, вызов функции
- •Void prn1(int X)
- •Void prn2()
- •Void main()
- •1.2 Передача параметров в функции по значению и по указателю
- •Void func(int intg,float fltp)
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •1.3 Функции и массивы
- •Int func1(int arr[]) {...}
- •Void main()
- •Void main()
- •Void main()
- •1.4 Функции с умалчиваемыми значениями параметров
- •Void main()
- •Void main()
- •1.5 Функции с переменным числом параметров
- •Void main()
- •Void main()
- •1.6 Передача параметров в функцию main()
- •Int main(int argc,char**argv,char**envp)
- •Int main(int argc,char **argv)
- •1.7 Рекурсивные и подставляемые функции
- •Void main()
- •Void main()
- •1.8 Функции, возвращающие указатель
- •Void main()
- •1.9 Функции и структуры
- •Void f1(stud a)
- •Void f3(stud *p)
- •Void main()
- •1.10 Перегрузка функций
- •Void main()
- •Void main()
- •Int mul(double X,double y)
- •Int sum(int X) {return 2*X;}
- •Void main()
- •1.11 Шаблоны функций
- •Int main()
- •Void func(a);
- •Int main()
- •1.12 Указатели на функции
- •Void main()
- •Int f2(int X){return X*X;};
- •Void main()
- •Void main()
- •2 Работа с файлами
- •2.1 Потоковый ввод-вывод
- •2.2 Открытие и закрытие потока
- •Int fclose(file *имя);
- •Int main()
- •Void perror(const char *str);
- •2.3 Посимвольный ввод-вывод
- •Int fputc(int ch, file *fp);
- •Int fgetc(file *fp);
- •2.4 Построчный ввод-вывод
- •Int fputs(char*string, file *fp);
- •2.5 Форматированный ввод-вывод
- •Int fprintf(file *fp, char *format [,аргумент]…);
- •Int fscanf(file *fp, char *format [,указатель]…);
- •2.6 Форматированные вывод в строку и ввод из строки
- •Int a2; long b2;
- •2.7 Блоковый ввод-вывод
- •Int fwrite(void *ptr, int size, int n, file *fp);
- •Int fread(void *ptr,int size,int n,file *fp);
- •2.8 Произвольный доступ к файлу
- •Int fseek(file *fp, long offset, int from_where);
- •Int main()
- •3 Многофайловая компиляция
- •Void main()
- •Void main()
- •4 Объекты и их атрибуты
- •Void main()
- •5 Ссылки
- •Int &хref; // ошибка!!
- •Int f2_ptr(int *a, int *b) {return *a-*b;}
- •Int f4_ref(const int&a, int &b)
- •Void main()
- •Литература
Int a2; long b2;
sscanf(buf1,"a1=%d, b1=%ld",&a2,&b2);
printf("a2=%d b2=%ld\n",a2,b2); //a2=10 b2=50000
2.7 Блоковый ввод-вывод
Эти функции предназначены для ввода-вывода блоков байт. Блок – это группа рядом расположенных байт, между которыми нет никаких специальных разделителей. Для того чтобы не иметь проблем с символами '\n', '\0', блоковый ввод-вывод выполняют в бинарном режиме. За одно обращение можно переносить несколько блоков.
Функция блокового записи (вывода) в файл имеет прототип:
Int fwrite(void *ptr, int size, int n, file *fp);
Эта функция записывает через поток fp в открытый файл N блоков, размером size байт каждый, из области памяти, определяемой указателем ptr. В случае успеха возвращает число блоков, а в случае ошибки – EOF.
Пример. Запись блоков данных в открытый для записи в двоичном режиме файл через поток fp
FILE *fp=fopen(“abc.txt”,"wb");
if(fp==NULL){puts("ошибка открытия файла"); return -1;}
struct REC{int a[2]; float b;}; //определение структ.типа
REC str1={1,2, 3.3}; //определение и инициализация структуры
fwrite(&str1,sizeof(REC),1,fp); // запись структуры в файл
REC str2[3]={{3,4, 5.5},{6,7, 8.8},{9,10, 1.1}};
fwrite(str2,sizeof(REC),3,fp);//запись массива структур в файл
fclose(fp);
Функция блокового чтения (ввода) из файла имеет прототип:
Int fread(void *ptr,int size,int n,file *fp);
Эта функция считывает через поток fp из открытого файла N блоков, размером size байт каждый, в область памяти, определяемой указателем ptr. В случае успеха возвращает число блоков, а в случае ошибки или достижения конца файла – EOF.
Пример. Чтение блоков данных из открытого для чтения в двоичном режиме файла через поток fp
FILE *fp=fopen(“abc.txt”,"rb");
if(fp==NULL){puts("ошибка открытия файла"); return -1;}
REC str3, str4[3]; //определение структуры и массива структур
fread(&str3,sizeof(REC),1,fp); // чтение структуры из файла
printf("%d %d %f\n",str3.a[0],str3.a[1],str3.b);
fread(str4,sizeof(REC),3,fp);//чтение массива структур из файла
for(int i=0;i<3;i++) //вывод массива структур на экран
printf("%d %d %f\n",str4[i].a[0],str4[i].a[1],str4[i].b);
fclose(fp);
2.8 Произвольный доступ к файлу
При обмене данными с файлом (записи и чтении) – место, куда записывается или считывается информация, определяется указателем записи-чтения. Ранее рассматривались функции обмена с файлом, которые осуществляли последовательный доступ к файлу. В библиотеке языка Си имеются функции, позволяющие выполнить произвольный доступ к файлу, т.е. доступ в любую точку файла.
Функция установки указателя записи-чтения на начало файла имеет прототип void rewind(FILE *fp); Например: rewind(fp);
Функция установки указателя записи-чтения в произвольную точку файла имеет прототип:
Int fseek(file *fp, long offset, int from_where);
Эта функция устанавливает указатель записи-чтения в потоке fp на offset байт вправо или влево. Если offset>0, то указатель сдвигается в сторону конца файла, если offset<0, то указатель сдвигается в сторону начала файла. Параметр from_where задает точку отсчета для сдвига: SEEK_SET – сдвиг от начала файла, SEEK_CUR – сдвиг от текущей позиции указателя, SEEK_END – сдвиг от конца файла. В случае успеха функция возвращает 0, иначе – EOF.
Установка указателя записи-чтения левее начала файла считается ошибкой, установка указателя правее конца файла делает значение указателя записи-чтения неопределенным. Например:
//установка указателя записи-чтения через 10байт от начала файла fseek(fp,10L,SEEK_SET);
Функция определения текущего положения указателя записи-чтения имеет прототип: long ftell(FILE *fp);
Эта функция возвращает значение в байтах (тип long) от начала файла до текущего положения указателя записи-чтения файла, открытого через поток fp. В случае ошибки функция возвращает –1L. Например:
long cur=ftell(fp);
Пример. Запись и добавление в файл блоков данных (структур) и чтение одной заданной структуры записанных ранее в файл структур.
#include<stdio.h>
struct REC{unsigned id;char name[20];unsigned mark;};
