Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на языке Си.doc
Скачиваний:
38
Добавлен:
27.03.2016
Размер:
2.8 Mб
Скачать

Vector_2:

1 2 3 4 5 6 7 8 9 10 11 12 4 3 2 1

Пример 3: создать базу данных на текстовом файлеmy_base.txt– в каждой его строке записать следующие данные о студентах:

группастрокадлиной 10 символов,

фамилиястрокадлиной 20 символов,

имястрокадлиной 10 символов,

средний балл сессии– вещественноечисло,

оценка по информатике– целоечисло.

Опишем исходные данные:

char gruppa[10];

char fam[20];

char name[10];

float sr_ball;

Int ocenka;

Создадим текстовый файл my_base.txtи откроем его для записи:

FILE *f_base; // указатель на создаваемый файл

f_base=fopen(“D:/User/my_base.txt”, “w”);

Данные в базу будем вводить циклом с постусловием. Интерфейс программы:

Gruppa: IS-09

Familija: Pupkin

Imja: Vasilij

Sr. ball: 3.14

Ocenka: 3

Gruppa: IS-09

Familija: Ivanov

Imja: Ivan

Sr. ball: 4.09

Ocenka: 5

Gruppa: 0

Запросы продолжаются до тех пор, пока вместо номера группы не введем цифру ноль– этотерминатор(прерыватель цикла ввода).

После ввода данных об очередном студенте записываем их в файл форматнымспособом, указывая длину каждого записываемого данного:

fprintf(f_base, “%10s%20s%10s%5.2f%2d\n”, gruppa, fam, name, sr_ball, ozenka);

Программа

FILE *f_base; // указатель на создаваемый файл

char gruppa_1[10];

char fam_1[20];

char name_1[10];

float sr_ball;

Int ocenka;

f_base=fopen("D:/User/my_base.txt", "w");

do

{

printf("\n gruppa:");

scanf("%s", gruppa);

if (gruppa[0]=='0') // если ноль – выход из цикла ввода

break;

printf("\n familija:");

scanf("%s", fam);

printf("\n imja:");

scanf("%s", name);

printf("\n sr. ball:");

scanf("%f", &sr_ball);

printf("\n ocenka:");

scanf("%d", &ocenka);

fprintf(f_base, "%10s%20s%10s%7.2f%5d\n", gruppa, fam, name, sr_ball, ocenka);

}

while (1); // псевдобесконечный цикл

fclose(f_base); //после записи файл обязательно закрыть!

Структура файла:

IS-09 Pupkin Vasilij 3.14 3

IS-09 Ivanov Ivan 4.09 5

Прочитаем этот файл с выводом на экран прочитанных данных:

f_base=fopen("D:/User/my_base.txt", "r"); // файл открыт

// для чтения

while (!feof(f_base)) // пока не конец файла

{ // читать данные

fscanf(f_base, "%s%s%s%f%d", gruppa, fam, name, &sr_ball, &ocenka);

printf("\n%10s%20s%10s%7.2f%5d", gruppa, fam, name, sr_ball, ocenka); // и выводить их на экран

}

На экран будет выведено:

IS-09 Pupkin Vasilij 3.14 3

IS-09 Ivanov Ivan 4.09 5

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

Бинарные файлы

Бинарные файлы представляют собой последовательность символов длиной один байт, нумерация которых начинается снуля. В конце файла стоит метка EOFEnd Of File.

Объявляется бинарный файл так же, как и текстовый:

FILE *f;

где fуказательна файл – имя логического файла,

FILE– служебное слово – толькозаглавнымибуквами!

Перед началом работы с файлом необходимо связать имя логического файла (файловую переменную) с соответствующим ему физическим файлом на внешнем носителе – открыть файл:

f=fopen(“путь”, “режим”);

где путь– полный путь к файлу на внешнем носителе,

режим– режим открытия файла:

rb– чтение (bbinary– бинарный, двоичный),

wb– запись,

ab – добавление в конец файла,

r+b– чтение с обновлением(rb + wb),

w+b– запись с обновлением,

a+b– добавление с обновлением.

FILE *f_bin;

f_bin=fopen(“D:/User/my_file.dat”, “wb”); // по указанному // пути создан бинарный файл // my_file.dat и открыт // для записи

Если файл с таким именем уже существовал, то он очищается (из него удаляется информация).

Форматированная запись (вывод) в файл осуществляется функцией

fprintf(указатель на файл, формат вывода, список вывода);

Пример: записать в файл my_file.dat строку символов abc12345+*-/%&@

FILE *f_bin;

const int n=15;

int i;

char d;

char str[n]=”abc12345+*-/%&@”;

f_bin=fopen(“D:/User/my_file.dat”, “wb”); // файл открыт // для записи

for (i=0; i<n; i++)

fprintf(f_bin, “%c”, str[i]); // запись в файл посимвольно

fclose(f_bin); //после записи файл обязательно закрыть!

Структура файла my_file.dat:

abc12345+*-/%&@

Внимание! В бинарных файлах нельзя использовать символ перехода на новую строку.

Перед чтением (вводом) данных из файла его необходимо открыть для чтения:

f=fopen(“путь”, “rb”);

Если файл не найден, то значение указателя f будет равноNULL.

Форматированное чтение (ввод) из файла осуществляется посимвольно функцией

fscanf(указатель на файл, формат ввода, список ввода);

Прочитаем созданный бинарный файл посимвольно и выведем на экран:

f_bin=fopen("D:/User/my_file.dat", "rb");

while (!feof(f_bin)) // пока не конец файла

{

fscanf(f_bin, "%c", &d); // читаем очередной символ // в переменную d

printf("%c", d);

}

На экран будет выведено:

abc12345+*-/%&@

Над бинарными файлами определены следующие операции:

a) перемещениеуказателя файла в заданную позицию

fseek(указатель на файл, позиция, параметр)

где позиция– количество байтов (символов), отстоящих от заданного места,параметрSEEK_SET– начало файла,

SEEK_CUR– текущая позиция файла,

SEEK_END– конец файла.

Пример 1: прочитать символ из бинарного файла, отстоящий от начала файла на 9 байтов:

f_bin=fopen("D:/User/my_file.dat", "rb");

fseek(f_bin, 9, SEEK_SET);

fscanf(f_bin, "%c", &d);

printf("%c", d);

На экран будет выведено:

*

Пример 2: прочитать символ из бинарного файла, отстоящий от конца файла на 6 байтов:

f_bin=fopen("D:/User/my_file.dat", "rb");

fseek(f_bin, -6, SEEK_END);

fscanf(f_bin, "%c", &d);

printf("%c", d);

На экран будет выведено:

+

б) определениеномера текущей позиции, занимаемой указателем файла (нумерация позиций начинается снуля)

fgetpos(указатель на файл, fpos_t *pos)

где pos текущая позиция указателя файла – переменная типа fpos_t (определен в stdio.h).

Пример: определить номера позиций начального и конечного символов файла:

fpos_t *nomer;

f_bin=fopen("D:/User/my_file.dat", "rb");

fgetpos(f_bin, &nomer); // номер начального символа

printf("\n nomer=%d", nomer);

while (!feof(f_bin)) // читаем файл до конца

{

fscanf(f_bin, "%c", &d);

}

fgetpos(f_bin, &nomer); // номер конечного символа

printf("\n nomer=%d", nomer);

На экран будет выведено:

nomer=0

nomer=15