Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
!1-25.doc
Скачиваний:
11
Добавлен:
28.10.2018
Размер:
2.62 Mб
Скачать

4.4 Написать 2 программы, демонстрир. Синхрониз. Процессов с пом. Событий.

// 1. События с автосбросом

#include "windows.h"

#include "process.h"

#include "stdio.h"

HANDLE hEvent1,hEvent2;

int a[5];

void WorkThread(void * pParam)

{

int i,num;

num=0;

while(true)

{

WaitForSingleObject(hEvent2,INFINITE);

for(i=0;i<5;i++) a[i]=num;

SetEvent(hEvent1);

num++;

}

}

void main()

{

hEvent1=CreateEvent(NULL,FALSE,TRUE,NULL);

hEvent2=CreateEvent(NULL,FALSE,FALSE,NULL);

_beginthread(WorkThread,0,NULL);

while(true)

{

WaitForSingleObject(hEvent1,INFINITE);

printf("%d %d %d %d %d\n",a[0],a[1],a[2],a[3],a[4],a[5]);

SetEvent(hEvent2);

}

}

//------------------------------------------------------------------------------------------------------------------------------------------

// 2. События со сбросом вручную

#include "windows.h"

#include "process.h"

#include "stdio.h"

HANDLE hEvent1,hEvent2;

int a[5];

void WorkThread(void * pParam)

{

int i,num;

num=0;

while(true)

{ WaitForSingleObject(hEvent2,INFINITE);

ResetEvent(hEvent2);

for(i=0;i<5;i++) a[i]=num;

SetEvent(hEvent1);

num++;

}

}

void main()

{

hEvent1=CreateEvent(NULL,TRUE,TRUE,NULL);

hEvent2=CreateEvent(NULL,TRUE,FALSE,NULL);

_beginthread(WorkThread,0,NULL);

while(true)

{ WaitForSingleObject(hEvent1,INFINITE);

ResetEvent(hEvent1);

printf("%d %d %d %d %d\n",a[0],a[1],a[2],a[3],a[4],a[5]);

SetEvent(hEvent2);

}

}

4.5

идентификаторы сетей 154.223.32.0, 154.223.96.0, 154.223.160.0

маска подсети 255.255.224.0

три подсети

по маске определяем шаг подсетей

22410 =111000002

25=32- шаг подсетей

от 154.223.32.1 до 154.223.63.254

от 154.223.96.1 до 154.223.127.254

от 154.223.160.1 до 154.223.191.254

идентификаторы сетей 14.16.0.0, 14.32.0.0, 14.48.0.0

маска подсети 255.248.0.0

три подсети

по маске определяем шаг подсетей

24810 =111110002

23=8- шаг подсетей

от 14.16.0.1 до 14.23.255.254

от 14.32.0.1 до 14.39.255.254

от 14.48.0.1 до 14.55.255.254

5.1 Бинарные файлы в С++. Виды доступа к файлам.

Когда данные сохраняются в файле, их можно сохранить в текстовой форме или в двоичном формате. Текстовая форма означает, что все данные сохраняются как текст, даже числа. Например, сохранение значения 2.3456236e05 в текстовой форме означает сохранение 14 символов, из которых состоит данное число. Для этого требуется, чтобы внутреннее представление компьютера для числа с плавающей точкой было преобразовано в текстовую форму, с этой целью выполняется операция вставки <<. Двоичный формат означает, что число сохраняется во внутреннем представлении, т.е. вместо символов сохраняется 64-разрядное (обычно) представление числа типа double. Для символа двоичное представление совпадает с его текстовым – двоичным представлением ASCII-кода (или его эквивалента) символа. Однако для чисел двоичное представление очень сильно отличается от их текстового представления.

Каждый формат имеет свои достоинства. Текстовый формат прост для чтения, поэтому для чтения и редактирования текстового файла можно воспользоваться любым редактором. В двоичном же формате числа сохраняются более точно, поскольку он позволяет сохранить точное внутреннее представление числа. Не происходит ошибок преобразования или округления. Сохранение данных в двоичном формате может происходить быстрее, поскольку при этом не происходит преобразования и данные можно сохранять большими блоками. Кроме того, двоичный формат обычно занимает меньше места (в зависимости от природы данных).

В следующем примере формируется двоичный файл структур.

Пример.

// filebin.cpp - запись информации в бинарный файл

#include <iostream.h>

#include <fstream.h>

#include <stdlib.h> //для функции exit()

void main()

{

struct person

{

char name[20]; // фамилия человека

int age; // возраст

char address[40]; // домашний адрес

};

person p1;

// вывести начальное содержимое файла

char namefile[20];

ifstream fin;

fin.open("persons.dat", ios::in|ios::binary); //двоичный файл

if (fin.is_open())

{

cout<<"The current contents of the "<<"persons.dat"<<" file:\n";

while (fin.read((char *) &p1, sizeof p1))

{

cout<<p1.name<<": "<<p1.age<<": "<<p1.address<<"\n";

}

}

fin.close();

//добавление новых данных

ofstream fout;

fout.open("persons.dat", ios::out|ios::app|ios::binary);

if (! fout.is_open())

{

cerr<<"Can't open "<<"persons.dat"<<" file for output:\n";

exit(1);

}

cout<<"Enter person name (enter a blank line to quit):\n";

cin.get(p1.name,20);

while (p1.name[0] != '\0')

{ while (cin.get()!='\n')

continue;

cout<<"Enter person age: ";

cin>>p1.age;

cout<<"Enter person address: ";

cin>>p1.address;

fout.write((char *) &p1, sizeof p1);

cout<<"Enter person name (enter a blank line to quit):\n";

cin.get(p1.name,20);

}

fout.close();

// вывести измененный файл

fin.open("persons.dat", ios::in|ios::binary);

if (fin.is_open())

{

cout<<"The new contents of the "<<"persons.dat"<<"file:\n";

while (fin.read((char *) &p1, sizeof p1))

{

cout<<p1.name<<": "<<p1.age<<": "<<p1.address<<"\n";

}

}

fin.close();

}

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

// конструктор с аргументом режима

ifstream fin(“file_in”, mode1);

ofstream fout();

// метод open() с аргументом режима

fout.open(“file_out”, mode2);

Класс ios_base определяет тип openmode для представления режима файла; это тип битовой маски. В классе ios_base определено несколько констант, которыми можно воспользоваться для указания режима файла. Константы режимов файлов

Константа

Значение

ios_base :: in

Открыт файл для чтения

ios_base :: out

Открыть файл для записи

ios_base :: ate

Переместить указатель в конец файла после его открытия

ios_base :: app

Добавить информацию к концу файла

ios_base :: trunc

Урезать файл, если он существует

ios_base :: binary

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

Конструкторы классов ifstream, ofstream, а также методы open() имеют по два аргумента, однако могут использоваться с одним аргументом, так как прототипы для этих функций-элементов класса обеспечивают для второго аргумента (аргумента режима файла) значения, заданные по умолчанию

ofstream fout(“file_out”, ios_base::out | ios_base::app);

Режимы открытия файлов С++

Режим

Значение

ios_base :: in

Открыт файл для чтения.

ios_base :: out

(То же самое, что и ios_base::out | ios_base::trunc).

ios_base::out | ios_base::trunc

Открыть для записи, урезав длину файла до нуля, если он уже существует.

ios_base::out | ios_base::app

Открыть файл для записи, но только для добавления к файлу.

ios_base::in | ios_base::out

Открыть для чтения и записи, причем запись разрешена в любом месте файла

ios_base::in | ios_base::out | ios_base::trunc

Открыть файл для чтения и записи, вначале урезав длину файла до нуля, если он уже существует.