Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика_и_Пр_Бизнес_лекции.doc
Скачиваний:
84
Добавлен:
10.05.2015
Размер:
1.21 Mб
Скачать

9.5. Изменение данных в текстовом файле

Данные, которые записаны в текстовом файле, как правило, не могут быть изменены «по месту». Например, если изменять запись текстового файла

Иванова Нина 77412345678 8000

по месту ее нахождения в файле на запись

Васильева Нина 77412345678 8000

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

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

#include <fstream.h>

#include <iostream.h>

#include <conio.h>

#include <stdio.h>

#include <string.h>

struct worker

{

char number[12];

char fam[15];

char name[15];

int salary;

};

void main()

{

worker w; //работник

fstream f1; //изменяемый файловый поток

fstream f2; //дополнительный файловый поток

char name[12];//имя файла

char n[12]; //номер страховки для поиска работника

cout<<"name f1: "; cin>>name;

f1.open(name,ios::in); //открытие для чтения

f2.open(“b.txt”,ios::out); //открытие вспомогательного файла

cout<<”n? “; cin>>n; //ввод номера страховки

//Цикл чтения файла и поиска работника

while (!f1.eof())

{

f1>>r.number >>r.fam>>r.name>>r. salary;//чтение из файла

if (!f1.eof()) //контроль конца файла

{

if(strcmp(r.number,n)==0 )

break; //работник найден

//Запись данных в дополнительный файл

f2<<r.number <<’ ‘<<r.fam<<’ ‘<<r.name<<’ ‘<<r. salary <<endl;

}

}

if (f1.eof()) //работник не найден: исходный файл не изменяется

{

cout <<”No”;

f1.close();

f2.close();

remove((“b.txt”); //удаление вспомогательного файла

}

else //работник найден

{

r.salary+=0.2*r.salary; //изменение зарплаты работника

//Запись в дополнительный файл измененной записи и

// без проверки перезапись в него конца исходного файла

while (!f1.eof())//

{

f2<<r.number<<’ ‘<<r.fam<<’ ‘<<r.name<<’ ‘<<r.salary <<endl;

f1>>r. number >>r.fam>>r.name>>r.salary;

}

f1.close(); //закрытие исходного файла

f2.close(); //закрытие дополнительного файла

remove(name); //удаление исходного файла

//Переименование дополнительного файла

rename((“b.txt”,name);

}

}

9.6. Вывод в двоичный файл

Функция write классов ofstream и fstream выводит в файловый поток заданное в функции количество байтов, извлекая их из определенной в функции области оперативной памяти.

Синтаксис вызова функции write:

f.write (адрес, количество байтов)

где f – файловая переменная. Первый аргумент функции – указатель на символ. Например, оператор:

f.write ((char*)&w,sizeof w );

записывает в файл sizeof w байтов, извлекая их из переменной w, содержащей информацию о работнике. Так как выражение &w имеет тип worker *, то здесь используется операция преобразования типа «указатель на структуру» в тип char*. Поток байтов записывается в то место файла, на которое указывает указатель файла. При открытии файла в режиме out первая порция данных записывается в начало файла. При записи данных указатель файла перемещается в позицию, следующую после последнего записанного байта. Повторное выполнение функции write записывает следующую порцию байтов в смежный участок файла без всяких разделителей.

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

#include <fstream.h>

#include <iostream.h>

#include <conio.h>

struct mo //модель муниципального округа

{

int number; //номер

char name[20]; //название

char ao[12]; //административный округ

char tel[12]; //телефон

};

void write_file(char file_name[ ]); //функция создания файла

void main()

{

write_file(“mo.mos”);

}

void write_file(char file_name[ ])

{

mo m; //муниципальный округ

ofstream f; //выходной файловый поток

f.open(file_name,ios::out|ios::binary); //открытие двоичного файла

for (int i=1; i<=123; i++)

{

cout<<”number? “;

cin>>m.number;

cout<<”name? “;

cin.get();

cin.getline(m.name,20);

cout<<”ao? “;

cin>>m.ao;

cout<<”tel? “;

cin>>m.tel;

f.write((char*)&m,sizeof m);

}

f.close(); }