Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЗФ_ОАиП / Курс Лекций ОАиП.doc
Скачиваний:
65
Добавлен:
21.03.2016
Размер:
5.89 Mб
Скачать

8.7 Пример обработки текстового файла и бинарного файла

/* Построчное считывание данных из текстового файла dbase.txt в буферную переменную s, формирование из них структуры db и запись ее в двоичном режиме в выходной файл "dbout.dat".

Считывание из двоичного файла записи с номером i и вывод ее на экран.

Считывание из двоичного файла записей и вывод на экран только тех записей, для которых фамилия есть "ivanoff ". */

Таблица 8.1

Таблица соответствия переменных

Идентификатор

Тип

Комментарий

1

lfio

const int

Длина поля фио

2

lyear

const int

Длина поля г. рожд.

3

lo

const int

Длина поля оклада

4

l

const int

Длина записи

5

db

Запись

Запись

6

s

строка

Строка с содерж. записи

7

fin

Текстовый файл

Исходный текстовый файл

8

fo

Двоичный файл

Двоичный файл, получ. из fin

9

kol

int

Кол-во записей файла fin

10

i

int

Номер записи файла fin

Листинг программы:

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <iostream.h>

main()

{

const int lfio=15, lpay=5, lo=10,//длины полей: фио, г.рожд., оклада в т. файле

l=lfio+lpay+lo; //длина записи в т. файле

struct Man

{ char fio[lfio]; // фио

int year; // год рожд.

float pay; // оклад

};

Man db;

char s[l]; //строка для записи в файл

FILE *fin, // Исх. файл

*fo ; // Вых. файлы

if ((fin=fopen("dbase.txt", "r"))==NULL)

{

puts("Ошибка открытия файла\n");

fflush(stdin); getchar(); return (1);

}

puts("Файл открыт");

fo=fopen("dbout.dat","w+b");

int kol=0; //кол. зап. в текст. файле

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

{

fgets(s,l,fin); // читается строка

puts(s);

strncpy(db.fio,s,lfio-1); //из строки формир. структура db

db.fio[lfio-1]='\0';

db.year=atoi(&s[lfio]);

db.pay=atof(&s[lfio+lpay]);

fwrite(&db, sizeof (db) ,1, fo); // структура зап. в бинарный файл

kol++;

}

fclose(fin);

// чтение зап. с ном. i из бин. файла и вывод ее на экран

int i;

printf("Введите номер записи (0-%d)", kol-1);

cin>>i;

if(i>=kol || i<0) { cout<<"Запись не существует"; fclose(fo); return (1);}

fseek(fo, sizeof (db)*i, SEEK_SET); //установ. указ. на зап. с ном. i

fread(&db, sizeof(db), 1, fo); //чтение зап. из файла

cout << db.fio << " "<< db.year<<" " << db.pay; //вывод зап. на экран

// Вывод записей с фам. ivanoff

fseek(fo,0,SEEK_SET); //указ. на нач. файла

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

{ printf("\n");

fread(&db,sizeof (db),1,fo);

if(!strcmp ( db.fio," ivanoff "))

printf(“% -15s % 5d %/.0f \n”, db.fio, db.year, db.pay);

}

fclose(fo);

fflush(stdin); getchar();

return (0);

}