- •Конспект лекций по дисциплине "Программирование"(іі часть)
- •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 fclose(file *имя);
Эта функция закрывает открытый поток. В функцию передается указатель на структуру типа FILE (имя открытого потока), и при успешном закрытии потока функция возвращает 0, иначе – EOF(–1). Эта функция удаляет структуру типа FILE, выгружает содержимое буфера на диск, если файл был открыт для записи, и вызывает функцию закрытия файла, которая обновляет содержимое директория (обновляет информацию о размере, дате и времени). Например: fclose(fp);
В программе может быть открыто несколько файлов. В конце работы с ними их необходимо все закрыть. Есть функция закрытия всех открытых файлов с прототипом: int fcloseall(void);
Эта функция возвращает число закрытых файлов, или EOF, если хотя бы один файл не удалось закрыть.
int n=fcloseall(void);
printf("n=%d",n); //n=2,если закрылись два открытых потока)
// или n=-1,если какой-либо поток из двух открытых не закрывается
Для переоткрытия файла с другим режимом доступа существует функция со следующим прототипом:
FILE *freopen(const char *filename,const char*mode,FILE *fp);
Эта функция закрывает поток fp с прежним именем файла и открывает снова этот же поток с именем файла, на который указывает строка filename в режиме, указанном в строке mode. В случае успеха функция возвращает указатель на описание открытого потока, которое будет совпадать с fp, иначе NULL. Если имена файлов разные, происходит переадресация файлового ввода-вывода.
fp=freopen("D:\\User\\myfile.txt","a",fp);
FILE *fp1=freopen("D:\\User\\myfile1.txt","ab",fp);
freopen("D:\\User\\abc.txt","r",fin);
Пример. Файл сначала открывается для чтения, затем снова открывается для дополнения.
#include<stdio.h>
Int main()
{FILE *fp;
char buff[100], *fname ="myfile.txt";
fp=fopen(fname,"r"); //открытие потока для чтения из файла
if(fp!=NULL)fgets(buff,50,fp);//чтение из файла строки
else {puts("ERROR_1"); return -1;}
puts(buff); //вывод на экран считанной из файла строки
fp=freopen(fname,"a",fp); //переоткрытие потока
if(fp!=NULL) fputs("abcdef",fp);//добавление строки
else {puts("ERROR_2"); return -1;}
fclose(fp); //закрытие потока
return 0;}
При работе с файлами большая роль отводится обработке ошибок. Для анализа ошибок можно использовать функцию c прототипом:
Void perror(const char *str);
Эта функция выводит в поток (на экран) строку str вместе с системной ошибкой. Список системных ошибок определен в файле <stdlib.h>.
FILE *ptr=fopen("abc.doc","r"); // открытие файла для чтения
if(fp==NULL){perror("Не могу открыть файл: "); return -1;}
char c=fgetc(ptr); // чтение одного символа
fclose(ptr); //закрытие потока
Если файл в текущем директории отсутствует, то на экран выведется:
Не могу открыть файл: No such file or directory
После успешного открытия файла программа может осуществлять файловый ввод-вывод.
2.3 Посимвольный ввод-вывод
Функция посимвольной записи (вывода) в файл имеет прототип:
Int fputc(int ch, file *fp);
Эта функция помещает символ int ch после преобразования в тип char в открытый поток fp, связанный с файлом. В случае успеха возвращает код записываемого в файл символа, а в случае ошибки или достижения конца файла – EOF.
Пример. Запись символов в открытый для записи файл через поток fp
FILE *fp=fopen("abc.txt","w"); //открытие потока для записи
if(fp==NULL){puts("ошибка открытия файла"); return -1;}
char s1='Z', str1[]="Запорожье",s2;
fputc(s1,fp); // запись символа в файл через поток fp
for(int i=0; i<9; i++)
fputc(str1[i],fp); // запись 9 символов в файл
fputc('\n',fp); // запись символа \n в файл
printf("Введите символ или Ctrl-Z");
while((s2=getchar())!=EOF)
fputc(s2,fp); //запись символов в файл
fclose(fp); //закрытие потока
Функция посимвольного чтения (ввода) из файла имеет прототип:
