41

(4 відповідей, залишених у C++)

Itari, дякую, але я вже розібралась.

42

(4 відповідей, залишених у C++)

Задача: Написати програму, що реалізує копіювання каталогу за вказаним шляхом та всіх його даних у вказане місце.

Ось те, що зробила я:

Прихований текст
#include <iostream>
#include <cstring>
#include <io.h>
#include <direct.h>
#include <Windows.h>
#include <conio.h>

#pragma warning (disable:4996)

using namespace std;

const int MAX_LENGTH = 255;

bool IsFile(char *name)
{
    _finddata_t * file_info = new _finddata_t;
    long done = _findfirst(name, file_info);
    if (done != -1)
    {
        if (file_info->attrib != _A_SUBDIR)
        {
            _findclose(done);
            return true;
        }
    }
    _findclose(done);
    return false;
}

bool PointInName(char *name)
{
    if (name[strlen(name) - 4] == '.')
        return true;

    return false;
}

int PosLastSlash(char *path)
{
    int length = strlen(path);

    int i = length;
    while (i >= 0 && path[i] != '\\')
        ++i;

    if (i != 0)
        return i;
    else
        return -1;
}

char *GetNewName(char *path, int length)
{
    char *temp_name = new char[MAX_LENGTH];
    strncpy(temp_name, "\0", MAX_LENGTH);

    strncpy(temp_name, path, length);
    strcat(temp_name, " - Copy");
    strcat(temp_name, path + length);
    strcat(temp_name, "\0");

    return temp_name;
}

void Copy(char *old_path, char *new_path)
{
    int done, length = 0;
    char *temp_name = NULL;
    long search = 0;

    if (strcmp(old_path, new_path) == 0)
    {
        if (PointInName(old_path))
            length = strlen(old_path) - 4;
        else
            length = strlen(old_path);

        temp_name = GetNewName(new_path, length);

        done = CopyFile(old_path, temp_name, false);
        if (done != 0)
            cout << "\nDONE\n";
        else
            cout << "\nERROR!\n";

        delete []temp_name;
        temp_name = NULL;
    }
    else
    {
        if (IsFile(old_path))
        {
            done = CopyFile(old_path, new_path, false);

            if (done != 0)
                cout << "\nDONE\n";
            else
                cout << "\nERROR!\n";
        }
    }
}

char *NameWithMask(char *path, char *mask)
{
    int size = strlen(path) + strlen(mask) + 1;

    char* temp_path = new char[size];
    strcpy_s(temp_path, size, path);
    strcat_s(temp_path, size, mask);

    return temp_path;
}

void CopyR(char* old_path, char *new_path)
{
    _finddata_t * fileinfo = new _finddata_t;
    
    char *path = NameWithMask(old_path, "\\*");

    long done = _findfirst(path, fileinfo);
    int next = done;
    while (next != -1)
    {
        if (fileinfo->attrib != _A_SUBDIR)
            Copy(old_path, new_path);

        _mkdir(new_path);
        int old_path_length = strlen(old_path) + strlen(fileinfo->name) + 10;

        char* old_path_buff = new char[old_path_length];
        strcpy_s(old_path_buff, old_path_length, old_path);
        strcat_s(old_path_buff, old_path_length, "\\");
        strcat_s(old_path_buff, old_path_length, fileinfo->name);

        int new_path_length = strlen(new_path) + strlen(fileinfo->name) + 10;

        char *new_path_buff = new char[new_path_length];
        strcpy_s(new_path_buff, new_path_length, new_path);
        strcat_s(new_path_buff, new_path_length, "\\");
        strcat_s(new_path_buff, new_path_length, fileinfo->name);

        CopyR(old_path_buff, new_path_buff);

        delete[]old_path_buff;
        delete[]new_path_buff;

        next = _findnext(done, fileinfo);
    }
    delete[]path;

    _findclose(done);

    delete fileinfo;
}

int main()
{
    char cur_path[MAX_LENGTH];
    char new_path[MAX_LENGTH];

    strncpy(cur_path, "C:\\Users\\virynka\\Documents\\ШАГ\\test.copy", MAX_LENGTH);
    strncpy(new_path, "C:\\Users\\virynka\\Documents\\ШАГ\\Програмування\\test.copy", MAX_LENGTH);

    CopyR(cur_path, new_path);
       
    _getch();
    return 0;
}

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

43

(1 відповідей, залишених у Інше)

Букрідер не збільшує шрифт у pdf-файлах, а він там геть дрібний. Знайшла ось такий онлайн-конвертер http://go4convert.com/ToFb2_Ru, але він псує таблиці і, можливо, ще щось. Підкажіть, будь ласка, якесь вирішення даної проблеми.

44

(12 відповідей, залишених у C++)

koala написав:

На парі якраз Push і Pop використовувалися. Щоправда, непослідовно. Але у вас - взагалі без них, вони тільки проголошуються.

То був чорновий варіант: я розбиралась з видаленням, а ось остаточний:

Прихований текст
#include <iostream>

using namespace std;

template <typename T>
class Stack
{
    T value;
    Stack *next;
    Stack *top;
    
public:

    Stack(int number_elements = 0)
    {
        if (number_elements > 0)
        {
            this->top = new Stack;

            cout << "Enter value: ";
            cin >> top->value;

            top->next = NULL;
            number_elements--;

            Stack *p = top;
            while (number_elements > 0)
            {
                Stack* element = new Stack;
                cout << "Enter value: ";
                cin >> element->value;
                element->next = p;
                p = element;
                number_elements--;
            }
            top = p;
        }
        else
        {
            value = 0;
            next = NULL;
            top = NULL;
        }
    }

    void Push(T value)
    {
        Stack* element = new Stack;
        element->value = value;
        element->next = top;
        top = element;
    }

    Stack* Pop()
    {
        Stack *element = top;
        top = top->next;
        return element;
    }

    void Show()
    {
        if (top != NULL)
        {
            cout << "Stack:\n";
            Stack *p = top;
            while (p != NULL)
            {
                cout << p->value << "\n";
                p = p->next;
            }
            cout << "\n";
        }
        else
            cout << "Stack is empty!\n";
    }


    void DeleteStack()
    {
        if (top != NULL)
        {
            Stack *p = top;
            while (p != NULL)
            {
                //Stack *element = p;
                top = top->next;
                delete p;
                p = top;
            }

            top = NULL;
        }
    }

    ~Stack()
    {
        if (top != NULL)
            DeleteStack();
    }
};

int main()
{
    int number_elements;
    cout << "Enter the number of elements in the list: ";
    cin >> number_elements;

    Stack <int>stack(number_elements);
    system("cls");
    stack.Show();

    cout << "\n\tPop\n\n";
    stack.Pop();
    stack.Show();

    cout << "\n\tPush\n\n";

    int push_element;
    cout << "Enter element that you want add to stack: ";
    cin >> push_element;

    stack.Push(push_element);
    stack.Show();

    return 0;
}

45

(12 відповідей, залишених у C++)

Дуже Вам дякую, спробую щось зробити.

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

46

(12 відповідей, залишених у C++)

koala написав:

У вас тут, фактично, немає стеку, а є список з назвою "стек".

Я читала, що стеки можна реалізувати як список або як масив.
Як правильно зробити, щоб стек був стеком? Направте, будь ласка.
Дякую.

47

(12 відповідей, залишених у C++)

Я всім дякую за допомогу, але проблема вирішилась після того як я додала, до полів класу, вказівник на верхівку стеку.
Ось так:

Прихований текст
#include <iostream>

using namespace std;

template <typename T>
class Stack
{
    T value;
    Stack *next;
    Stack *top;
    
public:

    Stack(int number_elements = 0)
    {
        if (number_elements > 0)
        {
            this->top = new Stack;

            cout << "Enter value: ";
            cin >> top->value;

            top->next = NULL;
            number_elements--;

            Stack *p = top;
            while (number_elements > 0)
            {
                Stack* element = new Stack;
                cout << "Enter value: ";
                cin >> element->value;
                element->next = p;
                p = element;
                number_elements--;
            }
            top = p;
        }
        else
        {
            value = 0;
            next = NULL;
            top = NULL;
        }
    }

    void Push(T value)
    {
        Stack* element = new Stack;
        element->value = value;
        element->next = this;
        top = element;
    }

    Stack* Pop()
    {
        Stack *element = top;
        top = top->next;
        return element;
    }

    void Show()
    {
        if (top != NULL)
        {
            cout << "Stack:\n";
            Stack *p = top;
            while (p != NULL)
            {
                cout << p->value << "\n";
                p = p->next;
            }
            cout << "\n";
        }
        else
            cout << "Stack is empty!\n";
    }


    void DeleteStack()
    {
        if (top != NULL)
        {
            Stack *p = top;
            while (p != NULL)
            {
                //Stack *element = p;
                top = top->next;
                delete p;
                p = top;
            }

            top = NULL;
        }
    }

    ~Stack()
    {
        if (top != NULL)
            DeleteStack();
    }
};

int main()
{
    int number_elements;
    cout << "Enter the number of elements in the list: ";
    cin >> number_elements;

    Stack <int>stack(number_elements);
    system("cls");
    stack.Show();

    return 0;
}

48

(12 відповідей, залишених у C++)

Вітаю всіх з Новим роком!!!

І я до вас знову з проблемкою :[

Задача: Створити клас Стек на основі структури та функцій, розроблених на занятті.
Визначити клас, як шаблонний.

Ось те, що ми робили на парі:

Прихований текст
struct Stack
{
int value;
Stack* next;
};

Stack* MakeStack(int n)
{
int value;
cout<<"Enter "<<n<<" elements: "<<endl;
if(n>0)
{
Stack *top=new Stack;
top->next=NULL;
cin>>value;
top->value=value;
n--;
Stack *p=top;
while(n>0)
{
Stack* el = new Stack;
cin>>value;
el->value=value;
el->next=p;
p=el;
n--;
}
top=p;
return top;
}
return NULL;
}

void Push(Stack*&top, int value)
{
Stack* el = new Stack;
el->value=value;
el->next=top;
top=el;
}

Stack* Pop(Stack *&top)
{
Stack *el=top;
top=top->next;
return el;
}

void Show(Stack *top)
{
cout<<"Stack:\n";
Stack *p=top;
while(p!=NULL)
{
cout<<p->value<<endl;
p=p->next;
}
cout<<endl;
}

void DelStack(Stack*& s)
{
if(s!=NULL)
{
Stack* el, *p=s;
while(p!=NULL)
{
el=p;
p=p->next;
delete el;
}
s=NULL;
}
}


int main()
{
Stack* stack=MakeStack(3);
Show(stack);
Push(stack, 4);
Push(stack, 5);
Show(stack);
cout<<"Main while: "<<endl;
while(stack)
{
Stack* el = Pop(stack);
cout<<el->value<<endl;
delete el;
}
DelStack(stack);

return 0;
}

А ось те, що зробила я (реалізовано поки метод Show, ну і, конструктор і деструктор):

Прихований текст
#include <iostream>

using namespace std;

template <typename T>
class Stack
{
    T value;
    Stack *next;
    
public:

    Stack(int number_elements = 0)
    {
        if (number_elements > 0)
        {
            Stack *top = new Stack;

            cout << "Enter value: ";
            cin >> top->value;

            top->next = NULL;
            number_elements--;

            Stack *p = top;
            while (number_elements > 0)
            {
                Stack* element = new Stack;
                cout << "Enter value: ";
                cin >> element->value;
                element->next = p;
                p = element;
                number_elements--;
            }
            *this = *p;
        }
        else
        {
            this->value = 0;
            next = NULL;
        }
    }

    void Push(T value)
    {
        Stack* element = new Stack;
        element->value = value;
        element->next = this;
        this = element;
    }

    Stack* Pop()
    {
        Stack *element = this;
        this = this->next;
        return element;
    }

    void Show()
    {
        cout << "Stack:\n";
        Stack *p = this;
        while (p != NULL)
        {
            cout << p->value << "\n";
            p = p->next;
        }
        cout << "\n";
    }


    void DeleteStack()
    {
        if (this != NULL)
        {
            Stack* element, *p = this;
            while (p != NULL)
            {
                element = p;
                p = p->next;
                delete element;
            }
            *this = NULL;
        }
    }

    ~Stack()
    {
        if (this != NULL)
            DeleteStack();
    }
};

int main()
{
    int number_elements;
    cout << "Enter the number of elements in the list: ";
    cin >> number_elements;

    Stack <int>stack(number_elements);
    system("cls");
    stack.Show();

    return 0;
}

І, власне, сама проблема: в мене програма вилітає на ось цьому рядку

delete element;

Підкажіть, будь ласка, чому і як правильно реалізувати видалення елементів стеку у класі.
Дякую.

49

(9 відповідей, залишених у C++)

Я вже зрозуміла і в мене все вийшло. Дуже Вам дякую

50

(9 відповідей, залишених у C++)

FakiNyan написав:
pika1989 написав:
FakiNyan написав:

чому не допомагає? ви не розумієте зв'язку між delete temp, і отими методами?

Ви маєте на увазі, що delete очищує пам'ять,а потім спрацьовує деструктор? Чи про що Ви?

ага, а деструктор викликає DeleteAll(), котрий і видаляє всі об'єкти.

Дякую, щось я про це не подумала. Але тоді є питання: як мені зробити правильно видалення?

51

(9 відповідей, залишених у C++)

FakiNyan написав:

чому не допомагає? ви не розумієте зв'язку між delete temp, і отими методами?

Ви маєте на увазі, що delete очищує пам'ять,а потім спрацьовує деструктор? Чи про що Ви?

52

(9 відповідей, залишених у C++)

FakiNyan написав:

p.s. ви аніме? :3

Я не аніме - я людина)))

Логічно, що проблема з видаленням там, де є слово delete, але Ваша відповідь абсолютно не допомагає.

Задача: Створити клас Список. Клас повинен містити поля:
●    інформаційне поле – ( int data );
●    Вказівник на наступний елемент списку;
●    Вказівник на перший елемент списку – static
І методи:
●    додавання елемента(вкінець, на певну позицію, перед певним елементом та після певного елемента);
●    видалення(останній, по-значенню, за позицією)
Та реалізувати ще деякі методи(пошук, перевірка чи порожній список)

Ось те, що я зробила:

Прихований текст
#include <iostream>
#include <conio.h>

using namespace std;

class List
{
    int data;
    List *next;
    static List *first;

public:
    List(int number_elements = 0)
    {
        if (number_elements > 0)
        {
            first = new List;
           
            cout << "Enter value: ";
            cin >> first->data;

            first->next = NULL;
            number_elements--;

            if (number_elements > 0)
            {
                List *element = new List;
                cout << "Enter value: ";
                cin >> element->data;
                element->next = NULL;
                first->next = element;
                number_elements--;

                List *p = first->next;
                while (number_elements > 0)
                {            
                    List *element = new List;
                    cout << "Enter value: ";
                    cin >> element->data;
                    element->next = NULL;
                    p->next = element;
                    p = p->next;

                    number_elements--;
                }
            }
        }
        else
        {
            data = 0;
            next = NULL;
        }
    }

    void Show()
    {
        List *p = first;

        cout << "\n\nList: ";
        while (p != NULL)
        {
            cout << p->data << " ";
            p = p->next;
        }
        cout << "\n";
    }

    void Add(int add_elem)
    {
        if (first == NULL)
        {
            first = new List;
            first->next = NULL;
            first->data = add_elem;
        }
        else
        {
            List *p = first;

            while (p->next != NULL)
                p = p->next;

            List *element = new List;
            element->data = add_elem;
            element->next = NULL;
            p->next = element;
        }
    }

    void AddAfter(int add_elem, int value)
    {
        List *p = first;

        while (p != NULL && p->data != value)
            p = p->next;

        if (p != NULL)
        {
            List *element = new List;
            element->next = p->next;
            element->data = add_elem;
            p->next = element;
        }
    }

    void AddBefore(int add_elem, int value)
    {
        if (first != NULL)
        {
            if (first->data == value)
            {
                List *element = new List;
                element->data = add_elem;
                element->next = first;
                first = element;
            }
            else
            {
                List *p = first;
                while (p->next != NULL && p->next->data != value)
                    p = p->next;

                if (p->next != NULL)
                {
                    List *element = new List;
                    element->data = add_elem;
                    element->next = p->next;
                    p->next = element;
                }
            }
        }
    }

    void AddByPos(int add_elem, int pos)
    {
        if (pos >= 0)
        {
            if (pos == 0)
            {
                List *element = new List;
                element->data = add_elem;
                element->next = first;
                first = element;
            }
            else
            {
                int counter = 0;
                List *p = first;

                while (counter < pos - 1 && p != NULL)
                {
                    p = p->next;
                    counter++;
                }
                if (p != NULL)
                {
                    List *element = new List;
                    element->data = add_elem;
                    element->next = p->next;
                    p->next = element;
                }
            }
        }
    }

    void DeleteElement()
    {
        List *p = first;

        while (p->next->next != NULL)
            p = p->next;

        if (p->next->next == NULL)
        {
            List *temp = p->next;
            p->next = NULL;
            delete temp;
        }
    }


    void DeleteByValue(int value)
    {
        if (first != NULL)
        {
            if (first->data == value)
            {
                List *el = first;
                first = first->next;
                delete el;
            }
            else
            {
                List *p = first;
                while (p->next != NULL && p->next->data != value)
                    p = p->next;
                if (p->next != NULL)
                {
                    List *element = p->next;
                    p->next = p->next->next;
                    delete element;
                }
            }
        }
    }

    void DeleteByPos(int pos)
    {
        if (first != NULL)
        {
            if (pos == 0)
            {
                List *element = first;
                first = first->next;
                delete element;
            }
            else if (pos > 0)
            {
                int count = 0;
                List *p = first;

                 while (count < (pos - 1) && p->next != NULL)
                 {
                    p = p->next;
                    count++;
                 }

                 if (p->next != NULL)
                 {
                     List *element = p->next;
                     p->next = p->next->next;
                     delete element;
                 }
             }
        }
    }

    int FindEl(int find_elem)
    {
        List *p = first;
        int count = 1;
        while (p != NULL&&p->data != find_elem) 
        {
            p = p->next;
            count++;
        }

        if (p != NULL)
        {
            return count;
        }
        else
        {
            return -1;
        }
    }

    int FindPos(int pos)
    {
        List *p = first;
        int counter = 1;
        if (p != NULL && pos == 1)
        {
            return first->data;
        }
        else
        {
            while (p != NULL && counter != pos) 
            {
                p = p->next;
                counter++;
            }

            if (counter == pos)
            {
                return p->data;
            }
        }

        return -1;
    }
    
    void DeleteAll()
    {
        List *p;
        p = first;
        while (p != NULL)
        {
            first = first->next;
            delete p;
            p = first;
        }
    }

    bool EmptyList()
    {
        if (first != NULL)
            return false;
        else
            return true;
    }

    ~List()
    {
        DeleteAll();
    }
};

List *List::first = NULL;

int main()
{
    int number_elements;
    cout << "Enter the number of elements in the list: ";
    cin >> number_elements;

    List list(number_elements);
    system("cls");
    list.Show();

    cout << "\n\tAdd element:\n";
    list.Add(100);
    list.Show();

    cout << "\nAdd by position:\n";
    list.AddByPos(200, 3);
    list.Show();

    cout << "\nAdd after:\n";
    list.AddAfter(50, 2);
    list.Show();

    cout << "\nAdd befor:\n";
    list.AddBefore(30, 1);
    list.Show();

    _getch();
    system("cls");

    list.Show();
    cout << "\n\tFind\n";
    cout << "\n\nPos of " << 3 << " is " << list.FindEl(3) << "\n";
    cout << "\n\nIn pos " << 3 << " is " << list.FindPos(3) << "\n";

    _getch();
    system("cls");

    list.Show();
    cout << "\n\tDelete\n";

    cout << "\nDelete last item:\n";
    list.DeleteElement();
    cout << "List is empty: "<< boolalpha << list.EmptyList() << "\n";
    list.Show();

    cout << "\nDelete by position:\n";
    list.DeleteByPos(1);
    cout << "List is empty: " << boolalpha << list.EmptyList() << "\n";
    list.Show();

    cout << "\nDelete by value:\n";
    list.DeleteByValue(3);
    cout << "List is empty: " << boolalpha << list.EmptyList() << "\n";
    list.Show();
    
    return 0;
}

Все працює нормально, окрім видалення: після будь-якого видалення список стає пустим.
Що не так? В чому може бути проблема?

54

(18 відповідей, залишених у C++)

Саме під такі завдання й роблять класи, у яких монтуються спеціальні методи

На жаль, ми їх ще не вивчали, але іноді руки так і "чешуться" зробити шось по-іншому))

55

(18 відповідей, залишених у C++)

Itari, може Ви порадите, де можна більш детально почитати про серіалізацію, буду дуже вдячна

56

(18 відповідей, залишених у C++)

Я Вам дякую, буду розбиратись...
Але є одне питання: якщо брати мою стурктуру Worker, то мені для кожного поля таким чинном прописувати?

57

(18 відповідей, залишених у C++)

Itari написав:

І вона знову ж таки працює...

Запусти програму. Створи та наповни файл. Закрий программу, заново запусти. Считай з файла одразу після запуску й подивись буде вона працювати чи зчитае якусь "лабудусь".

Саме так і перевіряла - працює

58

(18 відповідей, залишених у C++)

Я програму викладача переробила ось так:

Прихований текст
#include <iostream>
#include <string>
#include <fstream>
#include <conio.h>
using namespace std;

struct Person
{
    string name;
    int age;
    string gender;
};


void Show(const Person &p);
void SaveToFile(string filename, const Person p[], int size);
void  LoadFromFile(string filename, Person *&p, int & size);

int  main()
{

    //Person persons[] = { "Ann", 19, "Ivan", 18, "Oleg", 24, "Lora", 22 };
    
    const int NUMBER_PERSONS = 5;
    Person persons[NUMBER_PERSONS];
    int numPersons = sizeof(persons) / sizeof(Person);
    Person * base;
    int numInBase = 0;

    int choice;
    bool exit = false;
    do{
        system("cls");
        cout << "1 - Save to file\n";
        cout << "2 - Load from file\n";
        cout << "0 - exit\n";
        cout << "Choice: ";
        cin >> choice;
        switch (choice)
        {
        case 1:
            system("cls");
            for (int i = 0; i < NUMBER_PERSONS; ++i)
            {
                cout << "Enter name: ";
                cin >> persons[i].name;
                cout << "Enter age: ";
                cin >> persons[i].age;
                cout << "Enter gender: ";
                cin >> persons[i].gender;
            }
            SaveToFile("Persons.dat", persons, numPersons); //пишемо у файл масив персон
            break;
        case 2:
            system("cls");
            LoadFromFile("Persons.dat", base, numInBase); //читаємо з файлу дані у масив персон

            for (int i = 0; i < numInBase; ++i)
                Show(base[i]);
            break;
        case 0:
            exit = true;
            break;
        }
        _getch();
    } while (!exit);
}
void Show(const Person &p)
{
    cout << "Person " << p.name << ' ' << p.age << " " << p.gender << endl;
}

void SaveToFile(string filename, const Person p[], int size)
{
    ofstream file(filename, ios_base::binary); // відкрили бінарний файловий потік для запису 

    file.write((char *)p, sizeof(Person) * size); //пишемо всі екземпляри масиву персон у файл

    cout << "We are writing(into file) " << size << "persons\n";
    file.close();
}
void  LoadFromFile(string filename, Person *&p, int & size)
{
    ifstream file(filename, ios_base::binary); // відкрили бінарний файловий потік для читання
    file.seekg(0, ios_base::end); //перемістили файловий курсор у кінець файлу
    size = file.tellg() / sizeof(Person); //обчислили кількість екземплярів Person, що записана у файлі

    p = new Person[size]; // створили дин масив, куди будемо читати дані про персон

    file.seekg(0);// перейшли на початок файлу
    file.read((char *)p, sizeof(Person) * size); // читаємо з файл все( у масив р)
    cout << "\nWe are loading data(from  file) int array of Persons\n\n";
    file.close();

}

І вона знову ж таки працює... Може я чогось не розумію...

59

(18 відповідей, залишених у C++)

Зчитування з файлу я робила спираючись на приклад викладача:

Прихований текст
#include <iostream>
#include <string>
#include <fstream>
using namespace std;

struct Person
{    
    string name;
    int age;
};


void Show(const Person &p); 
void SaveToFile(string filename, const Person p[], int size);
void  LoadFromFile(string filename,  Person *&p, int & size);

int  main()
{

    Person persons[]  = { "Ann", 19, "Ivan", 18 , "Oleg", 24, "Lora", 22};
    int numPersons = sizeof(persons) / sizeof(Person );

    SaveToFile("Persons.dat", persons, numPersons); //пишемо у файл масив персон

    Person * base;
    int numInBase = 0;
    LoadFromFile("Persons.dat", base, numInBase); //читаємо з файлу дані у масив персон

    for(int i = 0; i < numInBase; ++i) 
        Show(base[i]);

}
void Show(const Person &p) 
{
    cout << "Person " << p.name << ' ' << p.age <<endl;
}

void SaveToFile(string filename, const Person p[], int size)
{
    ofstream file(filename, ios_base::binary); // відкрили бінарний файловий потік для запису 

    file.write((char * )p, sizeof(Person) * size); //пишемо всі екземпляри масиву персон у файл

    cout << "We are writing(into file) " << size  << "persons\n";
    file.close();
}
void  LoadFromFile(string filename,  Person *&p, int & size)
{
    ifstream file(filename,  ios_base::binary); // відкрили бінарний файловий потік для читання
    file.seekg(0, ios_base::end); //перемістили файловий курсор у кінець файлу
    size = file.tellg() / sizeof(Person); //обчислили кількість екземплярів Person, що записана у файлі

    p = new Person [size]; // створили дин масив, куди будемо читати дані про персон

    file.seekg(0);// перейшли на початок файлу
    file.read((char * )p, sizeof(Person) * size); // читаємо з файл все( у масив р)
    cout << "\nWe are loading data(from  file) int array of Persons\n\n";
    file.close();

}

І тут все працює, думала і у мене все буде працювати :(

60

(18 відповідей, залишених у C++)

Стурктура Worker має ось такий вигляд:

struct PersonalInfo
{
    string surname;
    string name;
    string birthday;
    struct Adress
    {
        string city;
        string street;
        int house_number;
        int flat_number;
    } adress;
    string phone_number;
    string education;                             
};

struct Worker
{
    string ID;
    PersonalInfo personal;
    string department_name;
    string position;
    double salary;
    int experience;
    string work_status;
};
Itari написав:

Доречі, можливо треба явно визначити відлік позиції від початку.

    f_in.seekg(0,f_in.beg);

Хоча варіант з одним параметром повинен робити по абсолюту.

Він працює - це я перевіряла шляхом виведення позиції