ОАиП 2 Семестр / 7 файлы структуры
.doc
работа с файлами
До сих пор во всех наших программах ввод данных производился только с клавиатуры, а вывод – только на экран.
Следующий шаг – научиться писать программы, которые умели бы работать с файлами.
В языке С отсутствуют операторы для работы с файлами. Все необходимые действия с файлами выполняются с помощью функций стандартной библиотеки.
Прототипы функций для работы с файлами находятся в файле <stdio.h>.
Функция |
Краткое описание |
fopen() |
Открыть файл |
freopen() |
Переоткрыть файл с другими правами доступа |
Fclose() |
Закрыть файл |
fcloseall() |
Закрыть все открытые файлы |
fputc() |
Записать символ в файл |
fgetc() |
Прочитать символ из файла |
fputs() |
Записать строку в файл |
fgets() |
Прочитать строку из файла |
fprintf() |
Форматированный вывод в файл |
fscanf() |
Форматированный ввод из файла |
fwrite |
Записать блок данных в файл |
fread |
Прочитать блок данных из файла |
fflush() |
Дозаписать определенный поток в файл |
flushall() |
Дозаписать все открытые потоки в файлы |
feof() |
Возвращает значение true (истина), если достигнут конец файла |
fseek() |
Установить указатель текущей позиции на определенный байт файла |
ftell() |
Получить значение указателя текущей позиции в файле |
rewind() |
Устанавить указатель текущей позиции в начало файла |
Также в <stdio.h> определяется несколько макросов: EOF, FOPEN_MAX, SEEK_SET, SEEK_CUR и SEEK_END. Макрос EOF, часто определяемый как -1, является значением, возвращаемым тогда, когда функция ввода пытается выполнить ввод после конца файла. FOPEN_MAX определяет целое значение, равное допустимому максимальному числу одновременно открытых файлов. Другие макросы используются в функции fseek(), выполняющей операции прямого доступа к файлу.
Функция fopen() возвращает указатель файла – указатель на структурную переменную по шаблону FILE. Никогда не следует изменять значение этого указателя в программе. Если при открытии файла происходит ошибка, то fopen() возвращает пустой указатель (NULL).
Режимы открытия файла:
Режим |
Описание |
r |
Открыть существующий файл для чтения |
w |
Открыть существующий файл для записи с усечением (старое содержимое файла стирается). Если такого файла нет, он будет создан |
a |
Открыть файл для добавления в существующий файл (старое содержимое сохраняется). Если такого файла нет, он будет создан |
r+ |
Открыть существующий файл для чтения/записи. Чтение/запись допустимы в любом месте файла. В этом режиме невозможна запись в конец файла, то есть недопустимо увеличение размеров файла |
w+ |
Открыть файл для чтения/записи. Если файл с таким именем уже существует, он будет очищен. Чтение/запись допустимы в любом месте файла, в том числе запись разрешена и в конце файла, т.е. файл может увеличиваться. |
a+ |
Открыть файл для добавления или создать для чтения/записи, если он не существует. Чтение/запись допустимы в любом месте файла. При этом в отличие от режима "w+" можно открыть существующий файл и не уничтожать его содержимое; в отличие от режима "r+" в режиме "a+" можно вести запись в конец файла, то есть увеличивать его размеры. |
Для указания на текстовый режим работы с файлом после любого из этих значений может быть добавлен символ ‘t’ (режим по умолчанию), для указания на бинарный режим – символ ‘b’. В бинарном режиме с файлами рекомендуется работать с помощью функций блокового ввода/вывода fread() и fwrite().
Имеетсятекстовый файл, содержащий информацию о мобил.телефонах: бренд, тип корпуса, кол-во sim-карт, разр.способность камеры
Исходные данные считать из текстового файла. Исходные данные и результаты выполнения программы выводить на экран дисплея и в текстовый файл.
#include<stdio.h> #include<string.h> #include <conio.h> #include <windows.h>
main()
{
int i,n,kol,j;
char s[80],fn[10];
char proizv[20];
FILE *f,*f1;
struct Mob
{
char proizv[20];
char tip_korpus[20];
int sim;
float kamera;
};
Mob z[20];
puts("Enter file name");
gets(fn);
if((f=fopen(fn,"r"))==NULL)
puts("oshibka \n");
else
{
printf("File %s opened \n", fn);
puts("ishodn file");
puts("____________________________________________");
puts("! бренд ! тип корп ! к-во sim ! камера !");
puts("____________________________________________");
i=0;
while(!feof(f))
{
fscanf(f,"%s%s%d%f",&z[i].proizv,&z[i].tip_korpus,&z[i].sim,&z[i].kamera);
printf("!%-10s!%-10s!%-10d!%-10f !\n",z[i].proizv,z[i].tip_korpus,z[i].sim,z[i].kamera);
i++;
}
puts("____________________________________________");
n=i;
printf("v fail %d zapisi \n", n);
/* ******************************************/
puts("ENter file rezult");
gets(fn);
f1=fopen(fn,"w");
printf("FILE REZULTAT\n");
puts("____________________________________________");
puts("! ! ! ! !");
puts("____________________________________________");
for (i=0;i<n;i++)
{
printf("%-10s%-10s%-10d%-10f \n",z[i].proizv,z[i].tip_korpus,z[i].sim,z[i].kamera);
fprintf(f1,"!%-10s!%-10s!%-10d!%-10f \n",z[i].proizv,z[i].tip_korpus,z[i].sim,z[i].kamera);
}
puts("____________________________________________");
n=i;
printf("v fail %d zapisi \n", n);
// close the files
fclose(f);
fclose(f1);
}
printf("Press any key...");
getch();
return(0);
}