Краткие теоретические и учебно-методические материалы 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Краткие теоретические и учебно-методические материалы



По теме лабораторной работы

Для осуществления операций с файлами предусмотрено три класса: ifstream, ofstream и fstream. Эти классы являются производными, соответственно, от классов istream, ostream iostream. Поскольку эти последние классы, в свою очередь, являются производными от класса ios, классы файловых потоков наследуют все функциональные возможности своих родителей (перегруженные операции << и >> для встроенных типов, функции и флаги форматирования, манипуляторы и пр.). Для реализации файлового ввода-вывода нужно включить в программу заголовочный файл fstream.h.

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

Для создания файлового потока эти классы предусматривают следующие формы конструктора: создать поток, не связывая его с файлом:

ifstream(); ofstream(); fstream();

создать поток, открыть файл и связать поток с файлом:

ifstream(const char *name, ios::openmode mode = ios::in); ofstream(const char* name, ios::openmode mode=ios::out | ios::trunc); fstream(const char * name, ios::openmode mode = ios::in | ios::out);

Чтобы открыть файл для ввода или вывода, можно использовать вторую форму нужного конструктора

fstream fs("FileName.dat");

или вначале создать поток с помощью первой формы конструктора, а затем открыть файл и связать поток с открытым файлом, вызвав функцию-член open(). Эта функция определена в каждом из классов потокового ввода-вывода и имеет следующие прототипы:

void ifstream::open(const char *name, ios::openmode mode = ios::in); void ofstream::open (const char * name, ios::openmode mode = ios::out | ios::trunc); void fstream::open (const char * name, ios::openmode mode = ios::in | ios::out);

Режимы открытия файла представляют собой битовые маски, поэтому можно задавать два или более режима, объединяя их побитовой операцией ИЛИ. В следующем фрагменте кода файл открывается для вывода с помощью функции open():

ofstream ofs; ofs.open("FileName.dat");

Обратим внимание, что по умолчанию режим открытия файла соответствует типу файлового потока. У потока ввода или вывода флаг режима всегда установлен неявно. Например, для потока вывода в режиме добавления файла можно вместо оператора

ofstream ofs("FName.txt", ios::out | ios::app); написать ofstream ofs("FName.txt", ios::app);

Между режимами открытия файла ios::ate и ios::app имеется небольшая разница.

Если файл открывается в режиме добавления, весь вывод в файл будет осуществляться в позицию, начинающуюся с текущего конца файла, безотносительно к операциям позиционирования в файле. В режиме открытия ios::ate (от английского "at end") можно изменить позицию вывода в файл и осуществлять запись, начиная с нее. Для потоков вывода режим открытия эквивалентен ios::out | ios::trunc, то есть можно опустить режим усечения файла. Однако для потоков ввода-вывода его нужно указывать явно. Файлы, которые открываются для вывода, создаются, если они еще не существуют.

Если открытие файла завершилось неудачей, объект, соответствующий потоку, будет возвращать 0:

if (!ofs){ cout << "Файл не открыт\n";}

Проверить успешность открытия файла можно также с помощью функции-члена is_open(), имеющей следующий прототип:

int is_open() const;

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

if (!ofs.is_open()){ cout << "Файл не открыт\n"; return; }

Если при открытии файла не указан режим ios::binary, файл открывается в текстовом режиме и после того, как файл успешно открыт, для выполнения операций ввода-вывода можно использовать операторы извлечения и вставки в поток. Для проверки, достигнут ли конец файла, можно использовать функцию ios::eof(), имеющую прототип int eof();

Завершив операции ввода-вывода, необходимо закрыть файл, вызвав функцию-член close() с прототипом void close():

ofs.close();

Закрытие файла происходит автоматически при выходе потокового объекта из области существования, когда вызывается деструктор потока.

 

Пример Функции работы с файлами

Рисунок 1 – Экранная форма добавление записи

 

Рисунок 2– Экранная форма редактирование записи

void Table::fail()

{

 

fstream f;

p = new Spicok[n];

f.open("input.txt");

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

{

       f>>p[i].ID;

       f>>p[i].Name;

       f>>p[i].adress;

       f>>p[i].tip;

       f>>p[i].spec;

       f>>p[i].ks;

}

f.close();

}

void Table::tabl(list **begin)

{chet1=0;

       list *print1 = *begin;

       while(print1!= NULL)

       {

                   chet1 ++;

                   print1->spic.ID = chet1;

                   print1 = print1->next;

                   }

           

       list *print = *begin;

       cout<<endl;

       cout<<"Таблица: "<<endl;

       cout<<"-------------------------------------------------------------------------------"<<endl;

       cout<<"# |Название|    Вид деятельности   | Адрес| Год создания |Колич.Сотр "<<endl;

       cout<<"-------------------------------------------------------------------------------"<<endl<<" ";

       while(print!= NULL)

       {

                   cout<<print->spic.ID;                   std::cout.width(1); cout<< "|"; std::cout.width(6);

                   cout<<print->spic.Name;              std::cout.width(3); cout<< "|"; std::cout.width(20);

                   cout<<print->spic.adress; std::cout.width(2); cout<< "|"; std::cout.width(20);

                   cout<<print->spic.tip;                   std::cout.width(5); cout<< "|"; std::cout.width(5);

                   cout<<print->spic.spec;                std::cout.width(5); cout<< "|"; std::cout.width(2);

                   cout<<print->spic.ks;        std::cout.width(2);

cout<<endl;

                   print = print->next;

           

       }

       cout<<endl;

}

int Table::Stroka()

{

       Spicok p;

       fstream f;

       f.open("input.txt");

       while (true)

{

   string str;

   getline(f,str);

   if(!f.eof())       

   n++;

   else

       break;

}

return n;

}

void Table::Init(list **begin)

{

 *begin = new list;

 (*begin)->spic.Name = p->ID;

 (*begin)->spic.Name = p->Name;

 (*begin)->spic.adress = p->adress;

 (*begin)->spic.tip = p->tip;

 (*begin)->spic.spec = p->spec;

 (*begin)->spic.ks = p->ks;

 (*begin)->next= NULL;

 list *end= *begin;

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

 {

        end->next= new list;

        end = end->next;

        end->spic.ID = p[i].ID;

        end->spic.Name = p[i].Name;

        end->spic.adress = p[i].adress;

        end->spic.tip = p[i].tip;

        end->spic.spec = p[i].spec;

        end->spic.ks = p[i].ks;

        end->next = NULL;

 }

}

void Table::Add(list **begin)

{

       int nomer(0);

       cout<<"Добавить в конец таблице или в начало? "<<endl;

       cout<<"1. Добавить в начало таблице"<<endl;

       cout<<"2. Добавить в конец таблице "<<endl;

       cin>>nomer;

                   string ID1, Name1, adress2, tip2, spec2;

       int ks2(20000);

       cout<<"Добавить запись в таблицу "<<endl;

       cout<<endl;

       cout<<"Название Банка: "<<endl;

       cin>>Name1;

       cout<<"Вид деятельности Банка: "<<endl;

       cin>>adress2;

       cout<<"Адрес: "<<endl;

       cin>>tip2;

       cout<<"Количество Колич.Сотр: "<<endl;

       cin>>ks2;

       cout<<"Год создания: "<<endl;

       cin>>spec2;

       list *head = new list;

       head->spic.Name = ID1;

       head->spic.Name = Name1;

       head->spic.adress = adress2;

       head->spic.tip = tip2;

       head->spic.spec = spec2;

       head->spic.ks = ks2;

                       

       if(nomer == 2)

       {

       head->next = NULL;

       list *add = *begin;

                   while(add!= NULL)

                   {

                              if(add->next == NULL)

                              {add->next = head; return;}

                   add= add->next;

                   }

       }

       else

                   if(nomer == 1)

                   {

                              head->next = *begin;

                              *begin = head;

                   }

}

void Table::delite(list **begin)

{

           

       int id2;

       list *b = *begin;

       cout<<endl;

       metka.tabl(&b);

       cout<<"Напишите ID Банка для удаления: "<<endl;

       cin>>id2;

       list *t = *begin;

       if(t->spic.ID == id2)

       {

       *begin = t->next;

       delete t;

       return;

       }

       list *p = t->next;

       while (p)

       {

                       

                   if(p->spic.ID == id2)

                              {

                              t->next = p->next;

                              delete p;

                              return;

                              }

                   t= p;

                   p = p->next;

                   }

}

void Table::redaktir(list**begin)

       {

       string ID1, Name1, adress2, tip2, spec2;

       int ks2(20000);

       int nomer= 1;

       int id2;

       list *b = *begin;

       cout<<endl;

       metka.tabl(&b);

       cout<<"Напишите ID Банка для его редактирования: "<<endl;

       cin>>id2;

       list *t = *begin;

       if(t->spic.ID == id2)

       {

                   *begin = t->next;

       delete t;

       return;

       }

       list *p = t->next;

       while (p)

       {if(p->spic.ID == id2)

                              {

                              t->next = p->next;

                              delete p;

                                  

       cout<<"Добавить запись в таблицу "<<endl;

       cout<<endl;

       cout<<"Название Банка: "<<endl;

       cin>>Name1;

       cout<<"Вид деятельности Банка: "<<endl;

       cin>>adress2;

       cout<<"Адрес: "<<endl;

       cin>>tip2;

       cout<<"Количество Колич.Сотр: "<<endl;

       cin>>ks2;

       cout<<"Год создания: "<<endl;

       cin>>spec2;

       list *head = new list;

       head->spic.Name = ID1;

       head->spic.Name = Name1;

       head->spic.adress = adress2;

       head->spic.tip = tip2;

       head->spic.spec = spec2;

       head->spic.ks = ks2;

                       

       if(nomer == 1)

       {

       head->next = NULL;

       list *add = *begin;

                   while(add!= NULL)

                   {

                              if(add->next == NULL)

                              {add->next = head; return;}

                   add= add->next;

       }

}

       }

                   t= p;

                   p = p->next;

       }

       }

Задания для лабораторной работы:

Завершить написание программного кода для классов UML.

Контрольные вопросы

1.Как проверить успешность открытия файла?

2.Как создать поток?

3.Какой встроенный класс нужно вызвать для файлового ввода-вывода?

4.Что делает команла ofs.open?

 


Лабораторная работа №13-14

«Генерация программного кода диаграммы состояний

на языке программирования Си ++ »

Цель работы: получение навыков при генерации кода выбранной диаграммы

Образовательные результаты, заявленные во ФГОС третьего поколения:

Студент должен

уметь:

- владеть основными методологиями процессов разработки программного обеспечения;

- использовать методы для получения кода с заданной функциональностью и степенью качества.

 

знать:

-модели процесса разработки программного обеспечения;

-основные принципы процесса разработки программного обеспечения;

-основные подходы к интегрированию программных модулей;

-основные методы и средства эффективной разработки;



Поделиться:


Последнее изменение этой страницы: 2021-12-07; просмотров: 26; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.140.185.147 (0.072 с.)