- •Конспект лекций по дисциплине "Программирование"(іі часть)
- •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()
- •Литература
Void main()
{float res1, res2, A[3]={1.5,2.0,3.0};
res1=summa(sqr,A,3); //2.25+4+9=15.25
res2=summa(cube,A,3); //3.375+8+27=15.25
printf("res1=%.3f res2=%.3f\n",res1,res2);}
На экран выведется: res1=15.250 res2=38.375
2 Работа с файлами
Функции разделяют на: потоковые и префиксные. Главное их отличие в том, что потоковые функции выполняют дополнительную буферизацию информации.
Мы будем рассматривать потоковые функции работы с файлами. Для пользователей поток – это последовательность байтов, которые передаются в файл или из файла, либо на физическое устройство или с физического устройства (например, монитор, клавиатура).
Ввод-вывод потока позволяет выполнять следующие действия: 1) открывать и закрывать потоки; 2) создавать и удалять временные потоки; 3) считывать и записывать символы, строки, форматированные и неформатированные данные; 4) анализировать ошибки ввода-вывода потока и условия конца потока (конца файла) и т.д.
2.1 Потоковый ввод-вывод
С началом выполнения программы автоматически открываются стандартные потоки: ввод (с клавиатуры), вывод (на экран монитора), вывод сообщений об ошибках (на экран монитора). Для функций библиотеки <stdio.h> эти потоки stdin, stdout, stderr, которые работают с консолью (клавиатурой и монитором).
Все другие потоки для обмена данными между файлами нужно открыть явно. Причем, эти потоки могут открываться в одном направлении (только для чтения или записи) и в двух направлениях (для чтения и записи). Когда поток открывается, он связывается со структурой типа FILE, содержащей всю информацию для работы с потоком. Тип этой структуры имеет следующий вид:
struct FILE
{int level; // пуст или полон буфер
unsigned flags; // флаги состояния файла
char fd; // логический номер файла, дескриптор файла
unsigned char hold; // непереданный символ
int bsize; // размер буфера
unsigned char _FAR *buffer;// указатель на буфер потока
unsigned char _FAR *curp; // указатель текущей позиции
unsigned istemp; // флаг временного файла
short token; // маркер действительности файла
};
Флаги состояния задают битовую позицию в члене структуры flags.
Определена специальная константа, обозначающая конец файла:
#define EOF (-1) //индикатор конца файла
Функции обмена с файлами могут работать в двух режимах: текстовом и двоичном. По умолчанию режим устанавливается текстовый. В текстовом режиме при записи в файл символ '\n' (перевод на начало новой строки) преобразуется в два символа '\n' и '\0', а при чтении из файла такие символы уже воспринимаются как два символа '\n' и '\0'. Также нажатие клавиш Ctrl-Z (конец ввода строки) воспринимается как конец строки '\0', который не записывается в файл.
При обмене с файлом в двоичном режиме никаких преобразований символов не производится.
В файлах <fcntl.h> и <stdlib.h> определена специальная переменная _fmode, которая может принимать значения O_BINARY (бинарный режим) или O_TEXT (текстовый режим). Например:
_fmode=O_BINARY;
2.2 Открытие и закрытие потока
Для начала обмена данными между программой и файлом необходимо открыть поток.
Функция открытия потока имеет прототип:
FILE* fopen(const char* filename, const char* mode);
Эта функция открывает поток, который связывает программу с заданным файлом. В случае успешного открытия возвращается указатель на структуру типа FILE (FILE*), описывающую открытый поток. Если файл не удалось открыть, функция возвращает значение NULL-указатель. Возвращаемое значение указателя присваивается ранее определенной переменной типа FILE*, которую в дальнейшем можно использовать для обмена данными с файлами.
Переменная char* filename – указатель на строку, задающую спецификацию открытого файла, т.е. путь и имя файла. Если путь не задан, то по умолчанию выбирается текущие диск и директорий.
Переменная char* mode ‑ указатель на строку, задающую режим открытия потока и состоящую из определенных символов:
r – поток открывается только для чтения из существующего файла, r+ – поток открывается для чтения из существующего и записи в существующий файл;
w – поток открывается только для записи в файл, w+ – поток открывается для записи в файл и для чтения из файла. Если файла нет, он создается, если файл существует, его старое содержимое пропадает;
a – поток открывается для добавления данных в конец файла, a+ – поток открывается для добавления данных в конец файла и для чтения из файла. Если файл не существует, он создается;
t – поток открывается в текстовом режиме, задается после r, w, a;
b – поток открывается в двоичном режиме, задается после r, w, a.
Пример. Фрагмент программы, в которой открывается поток fp для записи данных в файл myfile.txt и поток fin для записи данных в файл abc.txt на диске D в директории USER:
FILE *fp, *fin;
fp=fopen("D:\\User\\myfile.txt","w");
char *fname=("D:\\User\\abc.txt");
fin=fopen(fname,"r");
Если открытие потока оказалось неудачным, то функция возвращает NULL-указатель. При открытии потока рекомендуется выполнять проверку возвращаемого значения функции открытия файла:
if(fp==NULL){puts(“ошибка открытия файла”); return -1;}
if(fin==NULL){puts("ошибка открытия файла");return -1;}
После работы с потоком его закрывают.
Функция закрытия потока имеет прототип:
