Форум программистов, компьютерный форум CyberForum.ru

Поиск по структуре "Сотрудник" - C++

Восстановить пароль Регистрация
 
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
11.03.2014, 09:36     Поиск по структуре "Сотрудник" #1
Добрый день! Спасибо, что зашли!
Появились вопросы по структурам.

Задание:
Кликните здесь для просмотра всего текста

Струкутура:
Структура "Сотрудник":
- фамилия, имя, отчество;
- должность
- год рождения;
- заработная плата.
Удаление:
Удалить записи с указанной фамилией
Добавление:
Добавить K элементов в конец файла
Замена:
Заменить первые N записей на данные, введённые пользователем

Следующие задания требуется решить с привлечением двоичных файлов. Нужно:
1. Объявить структуру в соответствии с номером варианта
2. Написать функцию для заполнения вектора структурированными данными (данные получить с клавиатуры, для ввода полей структуры написать функцию Read() – без параметров, возвращающую структуру).
3. Написать функцию для создания двоичного файла со структурированными данными (параметры функции – вектор структур и имя файла).
4. Написать функцию для вывода содержимого двоичного файла на экран (параметр функции – имя файла)
5. Написать функцию для удаления из файла данных в соответствии с вариантом. Предусмотреть возможность записи удаляемых элементов в другой файл – текстовый. Для этого использовать функцию с параметрами по умолчанию: если указано имя файла, куда следует заносить удаляемую информацию, то удаляемые данные заносятся в указанный файл, в противном случае удалять бесследно. Значением функции является число удалённых элементов, параметрами – имена файлов.
6. Вывести измененный двоичный файл на экран.
7. Добавить в файл данные в соответствии с вариантом (написать соответствующую функцию).
8. Вывести измененный файл на экран.
9. Написать функцию, выполняющую замену указанной записи (в зависимости от варианта параметром является номер записи или признак записи, подлежащей замене)
10. Вывести измененный файл на экран.


Мой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
#include<iostream>
#include <ctime>  
#include <stdlib.h> 
#include <string>
#include <vector>
#include <fstream>
using namespace std;
 
struct person
{
    string surname;
    string name;
    string patronymic;
    string position;
    int age;
    double wages;
};
vector <person> mas;
int razmer=0;//временно
 
    void Read()
{
    system("pause");
    system("cls");
 
    int n;
    cout << "Сколько карточек сотрудников будет создано? "; cin >> n;
    razmer = n; //для дисплея т.к. рне знаю как пока решить
    person temp;
    for (int i = 0; i<n; i++)
    {
        cout << "Вам нужно будет ввести данные: Фамили, имя, отчество, должность, год рождения, зарплату. " << endl;
        cout << "После заполнения последнего параметра, консоль очиститься и заполнение начнется заного. " << endl;
        cout << "Сотрудник № " << (i+1)<<endl;
        cout << "Введите Фамилию: ";    //ввод одного элемента типа person из стандартного потока cin
        cin >> temp.surname;
        cout << "Введите Имя: ";
        cin >> temp.name;
        cout << "Введите Отчество: ";
        cin >> temp.patronymic;
        cout << "Введите Должность: ";
        cin >> temp.position;
        cout << "Введите Дату рождения: ";
        cin >> temp.age;
        cout << "Введите зарплату: ";
        cin >> temp.wages;
        mas.push_back(temp);
        system("cls");
    }
 
}
 
void ToFail(vector<person> &mas, string &name)
{
    std::ofstream fs(name, std::ios::binary);
 
    if (!fs.is_open())
    {
        std::cout << "Файл " << name << "не был открыт для записи";
        return;
    }
 
 
    int size = mas.size();
    cout << "Кол-во Сотрудников: " << size << endl;
    if (size == 0)
    {
        cout << " Вектор пуст." << endl;
        return;
    }
    else
    for (int i = 0; i<size; i++)
    {
 
        fs << mas[i].surname << " "
            << mas[i].name << " "
            << mas[i].patronymic << " "
            << mas[i].position << " " << mas[i].age
            << " " << mas[i].wages << endl;
    }
 
    fs.close();
}
 
 
void Display(string &name, int&razmer)
{
    person tmp;
    ifstream fs(name, ios::binary);
    if (!fs.is_open())
    {
        std::cout << "Файл " << name << "не был открыт для чтения";
        return;
    }
    /*
    fs.seekg(0, fs.end);
    int size = fs.tellg() / 6;
    fs.seekg(0, fs.beg);
    cout << "размер : " << size << endl;
    //не пойму, как правельно в таких случаях опеределять размер двоичного файла
    */
    for (int i = 0; i < razmer; i++)
    {
        fs >> tmp.surname;
        fs >> tmp.name;
        fs >> tmp.patronymic;
        fs >> tmp.position;
        fs >> tmp.age;
        fs >> tmp.wages;
        cout << "===========================" << endl;
        cout << "Сотрудник №" << (i + 1) << endl << "Фамилия: " << tmp.surname << endl << " Имя: " << tmp.name << endl << " Отчество: " << tmp.patronymic << endl << " Должность: " << tmp.position << endl << " Дата рождения: " << tmp.age << endl << " Зарплата: " << tmp.wages << "\n";
        if (fs.eof())break;
    }
    fs.close();
}
 
void Delet(string &name, string name2,int&razmer) // поиск и удаление
{
    string fam;
    cout << "Введите Фамилию для удаления: "; cin>>fam; cout << endl;
    person tmp;
    ifstream fs(name, ios::binary);
    if (!fs.is_open())
    {
        std::cout << "Файл " << name << "не был открыт для чтения";
        return;
    }
    for (int i = 0; i < razmer; i++)
    {
        /*читаем элементы типа person из файлового потока f в переменную p*/
        fs >> tmp.surname;
        fs >> tmp.name;
        fs >> tmp.patronymic;
        fs >> tmp.position;
        fs >> tmp.age;
        fs >> tmp.wages;
        if (fs.eof())break;
    }   
    fs.close();
 
}
 
 
 
 
int main()
{
    srand((unsigned)time(NULL));
    setlocale(LC_ALL, "Russian");
    cout << " Задание: " << endl;
    cout << " Задание №1. Объявить структуру в соответствии с номером варианта " << endl;
    cout << " Задание №2. Написать функцию для заполнения вектора структурированными данными (данные получить с клавиатуры, для ввода полей структуры написать функцию Read() – без параметров, возвращающую структуру).  " << endl;
    cout << " Задание №3. Написать функцию для создания двоичного файла со структурированными данными (параметры функции – вектор структур и имя файла).  " << endl;
    cout << " Задание №4. Написать функцию для вывода содержимого двоичного файла на экран (параметр  функции – имя файла) " << endl;
    cout << " Задание №5. Написать функцию для удаления из файла данных в соответствии с вариантом. Предусмотреть возможность записи удаляемых элементов в другой файл – текстовый. Для этого использовать функцию с параметрами по умолчанию: если указано имя файла, куда следует заносить удаляемую информацию, то удаляемые данные заносятся в указанный файл, в противном случае удалять бесследно. Значением функции является число удалённых элементов, параметрами – имена файлов. " << endl;
    cout << " Задание №6. Вывести измененный двоичный файл на экран. " << endl;
    cout << " Задание №7. Добавить в файл данные в соответствии с вариантом (написать соответствующую функцию). " << endl;
    cout << " Задание №8. Вывести измененный файл на экран. " << endl;
    cout << " Задание №9. Написать функцию, выполняющую замену указанной записи (в зависимости от варианта параметром является номер записи или признак записи, подлежащей замене) " << endl;
    cout << " Задание №10.  Вывести измененный файл на экран. " << endl;
    cout << "\n********************************************************************************\n" << endl;
    ////////////////////////////шапка/////////////////////////////////////////////////////////////////////
    string name,name2, fam;
    Read(); //заполнение структуры 
    cout << "Введите название файла в который будет сохранена структура: "; cin >> name; cout << endl;
    ToFail(mas, name);
    Display(name,razmer);
    cout << "Введите название файла в который будет сохранена удаляемая информация: "; cin >> name; cout << endl;
    //Delet(name,name2,razmer);
 
    system("pause");
    return 0;
}
Помогите пожалуйста с поиском по фамилии.
Кликните здесь для просмотра всего текста
Написать функцию для удаления из файла данных в соответствии с вариантом. Предусмотреть возможность записи удаляемых элементов в другой файл – текстовый. Для этого использовать функцию с параметрами по умолчанию: если указано имя файла, куда следует заносить удаляемую информацию, то удаляемые данные заносятся в указанный файл, в противном случае удалять бесследно. Значением функции является число удалённых элементов, параметрами – имена файлов.


И хотелось бы совета, как правильно определить размер двоичного файла?
т.е. если я его как нибудь определю так:
C++
1
2
3
4
5
fs.seekg(0, fs.end);
    int size = fs.tellg() / 6;
    fs.seekg(0, fs.beg);
 
    cout << "размер : " << size << endl;
то выходит не то, что нужно. т.е. допустим, вводим 3 сотрудника. У каждого 6 параметров. 6*3=18, размер выходит. А мне нужно размер равный 3. Пытался делить на 6, но не получается. Как надо?

Добавлено через 17 часов 49 минут
никто не подскажет? (
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TenGen
Будущее рядом
 Аватар для TenGen
96 / 94 / 20
Регистрация: 06.03.2014
Сообщений: 342
11.03.2014, 09:43     Поиск по структуре "Сотрудник" #2
о_О_Кто_здесь, поиск по фамилии же

C++
1
2
for (int i = 0; i < mas.size(); i++)
if (mas[i].surname == value) cout << "нашёл!" << endl;
Или я что то не допонял?
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
11.03.2014, 20:19  [ТС]     Поиск по структуре "Сотрудник" #3
TenGen, я делал вчера по другому, попробую вечером. Сейчас на работе. Спасибо.

Добавлено через 10 часов 26 минут
не, так у меня почему то не сравнивает.
TenGen
Будущее рядом
 Аватар для TenGen
96 / 94 / 20
Регистрация: 06.03.2014
Сообщений: 342
11.03.2014, 20:54     Поиск по структуре "Сотрудник" #4
о_О_Кто_здесь, почему не сравнивает? Может с кодировками проблема? Или с ошибкой вылетает?
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
11.03.2014, 21:19  [ТС]     Поиск по структуре "Сотрудник" #5
TenGen, Скорей где-то я не компетентен..
Поиск:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
void Delet(string &name,int&razmer) // поиск и удаление
{
    string fam;
    cout << "Введите Фамилию для удаления: "; cin>>fam; cout << endl;
    person *tmp=new person; 
    std::ifstream fs(name, std::ios::binary); //открываем бинарный файл, куда до этого сохранили введенную структуру.
    if (!fs.is_open())
    {
        std::cout << " Файл " << name << " не был открыт для чтения ";
        return;
    }
    for (int i = 0; i < razmer; i++) // грузим в структуры (хотя не сказано куда можно загружать, хоть в вектора чтоли, но точно нужно выгрузить из файла) 
    {
        fs >> tmp[i].surname;
        fs >> tmp[i].name;
        fs >> tmp[i].patronymic;
        fs >> tmp[i].position;
        fs >> tmp[i].age;
        fs >> tmp[i].wages;
        if (fs.eof())break;
    }   
    fs.close();
    for (int i = 0; i < razmer; i++)
    {
        if (tmp[i].surname == fam) //теперь, когда выгрузили сверяем все в tmp[i].surname c fam пока не найдем совпадения в фамилии
        {
            cout << "нашёл!" << endl;
            cout << "===========================" << endl;
        //  cout << "Запись №" << (i + 1) << endl << "Фамилия: " << tmp.surname << endl << " Имя: " << tmp.name << endl << " Отчество: " << tmp.patronymic << endl << " Должность: " << tmp.position << endl << " Дата рождения: " << tmp.age << endl << " Зарплата: " << tmp.wages << "\n";
        }
        else  cout << "нет!" << endl;
    }
}
Сейчас ошибка:


Поиск по структуре "Сотрудник"

А до этого, вроде не было, не пойму что нахимичил)))
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
11.03.2014, 21:23  [ТС]     Поиск по структуре "Сотрудник" #6
Пытался, по колдовать с strcmp, переделывало, но что-то тоже все с ошибками...
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.03.2014, 06:05     Поиск по структуре "Сотрудник" #7
Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
И хотелось бы совета, как правильно определить размер двоичного файла?
Вы используете текстовые методы чтения/записи (и правильно делаете, с такими полями структуры), поэтому не нужно файл открывать в бинарном режиме (хотя и можно, символ новой строки будет по другому обрабатываться), а тем более оперделять размер файла так, как будто запись в нём сделана в бинарном режиме.

Добавлено через 3 минуты
Чтобы сравнение в коде работало с русским текстом, нужно русский ввод сделать:
C++
1
2
3
4
5
6
7
8
#include <windows.h>
 
int main()
{
  SetConsoleCP(1251);
  SetConsoleOutputCP(1251);
  ...
}
В свойствах консоли выбрать шрифт: Lucida Console.
Установка шрифта Lucida Console

Добавлено через 2 минуты
Если вектор используете, то не нужен razmer, вектор знает свой размер.
Добавлено через 2 минуты
Создаёте одну структуру:
C++
1
person *tmp=new person;
а работаете с ней, как с массивом:
C++
1
2
3
...
fs >> tmp[i].surname;
...
Память не освобождаете. Есть же вектор у вас, в него и читайте (предварительно очистив).
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
12.03.2014, 10:01  [ТС]     Поиск по структуре "Сотрудник" #8
alsav22, Признателен за советы, вечером попробую исправить. Спасибо!
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
15.03.2014, 18:03  [ТС]     Поиск по структуре "Сотрудник" #9
Добрый день! Немного по колдовал, теперь из двоичного файла загружаю в тот же вектор, предварительно очистив его. Вроде более менее получается, но есть вопросы.

Часть кода с поиском по фамилии:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
void Delet(vector<person> &mas, string &name) // поиск и удаление
{
    mas.clear(); //очищаем вектор
    string fam, name2, otvet;   int l = 0;
    cout << "===========================" << endl;
    cout << " Введите Фамилию для удаления: "; cin >> fam; cout << endl;
    cout << "===========================" << endl;
    person tmp;
    std::ifstream fs(name, std::ios::binary);
    if (!fs.is_open())
    {
        std::cout << " Файл " << name << " не был открыт для чтения ";
        return;
    }
    do
    {
        fs >> tmp.surname;
        fs >> tmp.name;
        fs >> tmp.patronymic;
        fs >> tmp.position;
        fs >> tmp.age;
        fs >> tmp.wages;
        mas.push_back(tmp);
    } while (fs.eof());
    fs.close();
 
    int size = mas.size();
    if (size == 0)
    {
        cout << "===========================" << endl;
        cout << " Вектор пуст." << endl;
        cout << "===========================" << endl;
    }
    else
    {
 
        for (int i = 0; i < size; i++)
        {
            if (mas[i].surname == fam) //поиск совпадении фамилии
            {
                cout << "===========================" << endl;
                cout << " Нашёл!" << endl;
                cout << "===========================" << endl;
                cout << " Запись №" << (i + 1) << endl << "Фамилия: " << mas[i].surname << endl << " Имя: " << mas[i].name << endl << " Отчество: " << mas[i].patronymic << endl << " Должность: " << mas[i].position << endl << " Дата рождения: " << mas[i].age << endl << " Зарплата: " << mas[i].wages << "\n";
                cout << "===========================" << endl;
                cout << " Вы желаете перед удалением сохранить данные в текстовый файл? " << endl;
                cout << " Y - да | N - нет " << endl;
                cout << " Введите ваше решение: "; cin >> otvet; cout << endl;
                if (otvet == "y")
                {
                    cout << "Введите название файла: "; cin >> name2; cout << endl;
                    std::ofstream in(name2);
                    in << mas[i].surname << " "
                        << mas[i].name << " "
                        << mas[i].patronymic << " "
                        << mas[i].position << " " << mas[i].age
                        << " " << mas[i].wages << endl;
                    in.close();
                    mas.erase(mas.begin() + i);
 
                    std::ofstream fs(name, std::ios::binary);
                    for (int i = 0; i < size; i++)
                    {
                        fs << mas[i].surname << " "
                            << mas[i].name << " "
                            << mas[i].patronymic << " "
                            << mas[i].position << " " << mas[i].age
                            << " " << mas[i].wages << endl;
                    }
                    fs.close();
                }
                else (otvet == "n");
            }
            else   cout << " Введенной фамилии нет в базе!" << endl;
        }
    }
}
Так вот, если я ищу фамилию, которая первая в списке, он ее находит:
Поиск по структуре "Сотрудник"
А вот если сотрудник с фамилией не первый в списке, тогда не находит, почему счетчик дальше не идет?
Поиск по структуре "Сотрудник"

Если использовать вместо
C++
1
if (mas[i].surname == fam) //поиск совпадении фамилии
допустим так:
C++
1
2
3
4
do
{
 
}while(mas[i].surname == fam)
пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
void Delet(vector<person> &mas, string &name) // поиск и удаление
{
    mas.clear(); //очищаем вектор
    string fam, name2, otvet;   int l = 0;
    cout << "===========================" << endl;
    cout << " Введите Фамилию для удаления: "; cin >> fam; cout << endl;
    cout << "===========================" << endl;
    person tmp;
    std::ifstream fs(name, std::ios::binary);
    if (!fs.is_open())
    {
        std::cout << " Файл " << name << " не был открыт для чтения ";
        return;
    }
    do
    {
        fs >> tmp.surname;
        fs >> tmp.name;
        fs >> tmp.patronymic;
        fs >> tmp.position;
        fs >> tmp.age;
        fs >> tmp.wages;
        mas.push_back(tmp);
    } while (fs.eof());
    fs.close();
 
    int size = mas.size();
    if (size == 0)
    {
        cout << "===========================" << endl;
        cout << " Вектор пуст." << endl;
        cout << "===========================" << endl;
    }
    else
    {
 
        for (int i = 0; i < size; i++ )
        {
            //if (mas[i].surname == fam) //поиск совпадении фамилии
            do
            {
                cout << "===========================" << endl;
                cout << " Нашёл!" << endl;
                cout << "===========================" << endl;
                cout << " Запись №" << (i + 1) << endl << "Фамилия: " << mas[i].surname << endl << " Имя: " << mas[i].name << endl << " Отчество: " << mas[i].patronymic << endl << " Должность: " << mas[i].position << endl << " Дата рождения: " << mas[i].age << endl << " Зарплата: " << mas[i].wages << "\n";
                cout << "===========================" << endl;
                cout << " Вы желаете перед удалением сохранить данные в текстовый файл? " << endl;
                cout << " Y - да | N - нет " << endl;
                cout << " Введите ваше решение: "; cin >> otvet; cout << endl;
                if (otvet == "y")
                {
                    cout << "Введите название файла: "; cin >> name2; cout << endl;
                    std::ofstream in(name2);
                    in << mas[i].surname << " "
                        << mas[i].name << " "
                        << mas[i].patronymic << " "
                        << mas[i].position << " " << mas[i].age
                        << " " << mas[i].wages << endl;
                    in.close();
                    mas.erase(mas.begin() +i);
                    
                    std::ofstream fs(name, std::ios::binary);
                    for (int i = 0; i<size; i++)
                    {
                        fs << mas[i].surname << " "
                            << mas[i].name << " "
                            << mas[i].patronymic << " "
                            << mas[i].position << " " << mas[i].age
                            << " " << mas[i].wages << endl;
                    }
                    fs.close();
                }
                else (otvet == "n");
            } while (mas[i].surname == fam);
            //else   cout << " Введенной фамилии нет в базе!" << endl;
        }
    }
    }
Тогда вроде бы ищет:
Поиск по структуре "Сотрудник"
НО, если мы попробуем ввести не существующую фамилию, он просто выдаст человека первого в списке.
Поиск по структуре "Сотрудник"
Хотелось бы реализовать через
C++
1
 if
HELP!
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.03.2014, 23:32     Поиск по структуре "Сотрудник" #10
Вот это:
C++
1
else   cout << " Введенной фамилии нет в базе!" << endl;
должно стоять после цикла for () (когда вся база просмотренна) и без else.

Добавлено через 7 минут
Чтение из файла вот так нужно сделать:
C++
1
2
3
4
5
6
7
8
9
10
     while (fs >> tmp.surname)
    {
        fs >> tmp.name;
        fs >> tmp.patronymic;
        fs >> tmp.position;
        fs >> tmp.age;
        fs >> tmp.wages;
        mas.push_back(tmp);
    } 
    fs.close();
Если как у вас, то при считывании конца файла (а считает его первая строка в while()) в tmp ничего не запишется (останется значение предыдущего чтения), и старое значение ещё раз добавится в вектор.

Добавлено через 7 минут
C++
1
2
if (otvet == "y" || otvet == "Y")
{...
Вот это лишнее:
C++
1
else (otvet == "n");
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.03.2014, 23:35     Поиск по структуре "Сотрудник"
Еще ссылки по теме:

Классы "Фигура", "Прямоугольник", "Круг" C++
Класс "Сотрудник" C++
Класс "Сотрудник" C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
о_О_Кто_здесь
11 / 11 / 1
Регистрация: 06.06.2011
Сообщений: 152
15.03.2014, 23:35  [ТС]     Поиск по структуре "Сотрудник" #11
alsav22, Спасибо, попробую. Очень благодарен за все ответы.
Yandex
Объявления
15.03.2014, 23:35     Поиск по структуре "Сотрудник"
Ответ Создать тему
Опции темы

Текущее время: 23:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru