Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.80/55: Рейтинг темы: голосов - 55, средняя оценка - 4.80
0 / 0 / 1
Регистрация: 01.04.2016
Сообщений: 76

Запись структуры в файл, чтение из файла и удаление (файловый ввод/вывод)

01.12.2016, 17:00. Показов 12166. Ответов 80
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер! Возникла такая проблема, что при добавлении записи, удаляются уже имеющиеся записи в файле.
Также не помешала бы помощь в вопросе удаления записи, с указанным возрастом. Ну и вывод всего содержимого в файле.
Спасибо, за помощь.
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
#include <iostream>
#include <fstream>
 
enum ChosenOperation { ADD = 1, SHOW, DELETE, EXIT };
 
enum SearchingCriteria { NAME = 1, ADDRESS, PHONE, AGE };
 
struct Human
{
    std::string full_name;  // фамилия имя отчество
    std::string address;    // домашний адрес
    std::string phone;      // телефон
    unsigned int age;       // возраст
};
 
void add_new_entry_to_file( std::string filename )
{
    std::cout << "\n\n\tAdding new student to database.\n\n";
 
    std::cout << "Enter number of entries: ";
    unsigned int number_of_entries;
    std::cin >> number_of_entries;
 
    std::cout << "\n\n\tEnter all nessesary data of each entry.\n\n";
    struct Human* human = new struct Human[number_of_entries];
 
    for ( unsigned int i = 0, nth; i < number_of_entries; ++i )
    {
        nth = i + 1;
        while ( std::cin.get() != '\n' );
 
        std::cout
            << "Enter full name of "
            << nth
            << " student: ";
        std::getline( std::cin, human[i].full_name );
 
        std::cout
            << "Enter address of "
            << nth
            << " student: ";
        std::getline( std::cin, human[i].address );
 
        std::cout
            << "Enter phone number of "
            << nth
            << " student: ";
        std::getline( std::cin, human[i].phone );
 
        std::cout
            << "Enter age of "
            << nth
            << " student: ";
        std::cin >> human[i].age;
        std::cout << "\n";
    }
 
    std::ofstream fout( filename.c_str() );
    for ( unsigned int i = 0; i < number_of_entries; ++i )
    {
        fout
            << human[i].full_name
            << "|"
            << human[i].address
            << "|"
            << human[i].phone
            << "|"
            << human[i].age
            << "\n";
    }
    fout.close();
 
    delete [] human;
}
 
void show_data( std::string filename )
{
    // TODO
}
 
void delete_data_in_file( std::string filename, int searching_criteria )
{
    // TODO
}
 
int main()
{
    int key = 0;
    while ( key != ChosenOperation::EXIT )
    {
        std::cout
            << "MENU:\n\n"
            << "\t1 - ADD\n"
            << "\t2 - SHOW\n"
            << "\t3 - Delete\n"
            << "\t4 - EXIT(Esc)\n\n"
            << "Press any key: ";
 
        std::cin >> key;
 
        switch ( key )
        {
            case ChosenOperation::ADD :
                add_new_entry_to_file( "Person.txt" );
 
            case ChosenOperation::SHOW :
                show_data( "Person.txt" );
 
            case ChosenOperation::SEARCH :
                delete_data_in_file( "Person.txt", SearchingCriteria::NAME );
 
            case ChosenOperation::EXIT :
                key = ChosenOperation::EXIT;
        }
    }
 
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.12.2016, 17:00
Ответы с готовыми решениями:

Ввод с клавиатуры и запись в файл, чтение из файла и запись в массив, вывод из массива на экран
1.Ввод с клавиатуры и запись в файл, чтение из файла и запись в массив, вывод из массива на экран 2.Ввод с клавиатуры и запись в массив,...

Чтение из файла STL (файловый ввод/вывод)
В чем проблема? map.ccp void Map::ReadFromFile(fstream&amp; F) { string s,key; int k, value, counter; map &lt;string, Pr&gt; ob; map...

Открыть текстовый файл, дозаписать в него данные, вывести содержимое файла (файловый ввод/вывод)
Открыть текстовый файл 1.txt, имя файла указывается в командной строке. Дозаписать в него данные. Вывести содержимое файла 1.txt построчно.

80
0 / 0 / 1
Регистрация: 01.04.2016
Сообщений: 76
02.12.2016, 23:11  [ТС]
Студворк — интернет-сервис помощи студентам
А что значит: "не совсем гладко?"
Спасибо, огромное
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
02.12.2016, 23:13
georgiisav988, я хотел сделать, чтобы прога удаляла все записи по выбранному критерию, а она удаляет только первую найденную запись, удовлетворяющую заданному условию - это раз. И если выбираем удалять по заданному возрасту (скажем, всех людей, у которых возраст равен 24), то он удаляет первую запись с таким возрастом, а в остальных почему-то возраст меняет, прибавляя единицу - где-то вкралась ошибка, никак найти её не могу.
А по одной записи если удалять, то вроде норм работает.
1
0 / 0 / 1
Регистрация: 01.04.2016
Сообщений: 76
02.12.2016, 23:20  [ТС]
Т.е. надо удалить одну запись, потом перезапустить и выбрать еще раз?

Добавлено через 4 минуты
Можно еще одну просьбу.
Можешь объяснить кратко или подробно. Что для чего?!Если не сложно.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
02.12.2016, 23:23
georgiisav988, да вы потестите. Сами увидите. Вот попробуйте ввести такие данные:
Миниатюры
Запись структуры в файл, чтение из файла и удаление (файловый ввод/вывод)   Запись структуры в файл, чтение из файла и удаление (файловый ввод/вывод)   Запись структуры в файл, чтение из файла и удаление (файловый ввод/вывод)  

1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
03.12.2016, 16:21
Цитата Сообщение от georgiisav988 Посмотреть сообщение
Можешь объяснить кратко или подробно. Что для чего?!Если не сложно.
Это уже завтра. У меня тут пол-второго ночи, меня уже вырубает.
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
03.12.2016, 16:21
georgiisav988, как-то очень тяжко всё идёт. Попытался то, что есть разбить на отдельные функции и файлы - взорвал себе мозг появлением новых ошибок. Продолжаю грызть гранит. У меня сильное подозрение, что всё это решается в две строчки, но поскольку я нуб, то как у всех нубов моя основная проблема - нехватка нужных знаний и, как следствие, чудовищный overengineering.
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
03.12.2016, 16:39
Person.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ifndef PERSON_H
#define PERSON_H
 
#include <string>
 
struct Person
{
    std::string full_name = "Default name";     // фамилия имя отчество
    std::string address = "Default address";    // домашний адрес
    std::string phone = "Default phone number"; // телефон
    unsigned int age = 999;                     // возраст
 
    void show() const;
};
 
#endif // PERSON_H

Person.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "Person.h"
#include <iostream>
 
void Person::show() const
{
    std::cout
        << "\n"
        << full_name
        << "\n"
        << address
        << "\n"
        << phone
        << "\n"
        << age
        << "\n";
}

my_functions.h

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
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
#ifndef MY_FUNCTIONS_H
#define MY_FUNCTIONS_H
 
#include "Person.h"
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <vector>
#include <string>
#include <algorithm>
#include <type_traits>
 
enum ChosenOperation { ADD = 1, SHOW, DELETE, EXIT };
enum SearchingCriteria { NAME = 1, ADDRESS, PHONE, AGE };
 
// This implementation of the template function argument
// type checking was kindly provided by Croessmah:
namespace details
{
    template <typename T>
    void promt_user_input_data_of_selected_field_impl(T &value)
    {
        std::cin >> value;
        while ( std::cin.get() != '\n' ) {}
    }
 
    template <>
    void promt_user_input_data_of_selected_field_impl<std::string>(std::string &value)
    {
        std::getline( std::cin, value );
    }
}
// powered by Croessmah
 
 
 
size_t promt_user_input_number_of_entries()
{
    size_t number_of_entries = 0;
    std::cout << "Enter number of entries: ";
    std::cin >> number_of_entries;
    while ( std::cin.get() != '\n' ) {}
 
    return number_of_entries;
}
 
template <typename T>
void promt_user_input_data_of_selected_field
    (
        const std::string message,
        size_t number_of_entry,
        T selected_field
    )
{
    std::cout << message << " number #" << number_of_entry << ": ";
    ::details::promt_user_input_data_of_selected_field_impl<std::decay_t<T>>( selected_field );
}
 
template <typename T>
void promt_user_choose_deleting_criteria( T deleting_criteria )
{
    std::cout << "\nSelect deleting criteria:\n\n";
    ::details::promt_user_input_data_of_selected_field_impl<std::decay_t<T>>( deleting_criteria );
}
 
int promt_user_choose_searching_criteria()
{
    int key = 0;
    std::cout
        << "\nSelect searching criteria:\n\n"
        << "\t1 - SEEK ENTRY BY NAME\n"
        << "\t2 - SEEK ENTRY BY ADDRESS\n"
        << "\t3 - SEEK ENTRY BY PHONE\n"
        << "\t4 - SEEK ENTRY BY AGE\n"
        << "\nMake your choice (press any key): ";
    std::cin >> key;
    return key;
}
 
void add_new_entries_to_array( std::vector<Person> & pers )
{
    pers.resize( promt_user_input_number_of_entries() );
 
    std::cout << "\n\tEnter all nessesary data of each entry.\n";
 
    for ( unsigned int i = 0, nth = 1; i < pers.size(); ++i, ++nth )
    {
        promt_user_input_data_of_selected_field( "Enter full name of student", nth, pers[i].full_name );
        promt_user_input_data_of_selected_field( "Enter address of student", nth, pers[i].address );
        promt_user_input_data_of_selected_field( "Enter phone number of student", nth, pers[i].phone );
        promt_user_input_data_of_selected_field( "Enter age of student", nth, pers[i].age );
        std::cout << "\n";
    }
}
 
void copy_entries_to_file( const std::vector<Person> & pers, const std::string & filename )
{
    std::ofstream fout( filename.c_str() );
    for ( size_t i = 0; i < pers.size(); ++i )
    {
        fout
            << pers[i].full_name
            << "|"
            << pers[i].address
            << "|"
            << pers[i].phone
            << "|"
            << pers[i].age
            << "\n";
    }
    fout.close();
}
 
int promt_user_choose_menu_operation()
{
    int key = 0;
    std::cout
        << "\nMENU:\n\n"
        << "\t1 - ADD\n"
        << "\t2 - SHOW\n"
        << "\t3 - DELETE\n"
        << "\t4 - EXIT\n"
        << "\nMake your choice (press any key): ";
    std::cin >> key;
    return key;
}
 
void delete_chosen_data_from_array( std::vector<Person> & pdata )
{
    std::string str_deleting_criteria;
    size_t int_deleting_criteria;
 
    std::cout << "\nNow you can mark entries to deleting.";
    int key = promt_user_choose_searching_criteria();
    std::cout << "\nNow you can delete selected entries.";
 
    if ( key == NAME || key == ADDRESS || key == PHONE)
        promt_user_choose_deleting_criteria( str_deleting_criteria );
    else
        promt_user_choose_deleting_criteria( int_deleting_criteria );
 
    switch ( key )
    {
        case NAME :
        {
            pdata.erase
                (
                    std::remove_if
                        (
                            pdata.begin(),
                            pdata.end(),
                            [&]( const Person & p ){ return p.full_name == str_deleting_criteria; }
                        )
                );
            break;
        }
 
        case ADDRESS :
        {
            pdata.erase
                (
                    std::remove_if
                        (
                            pdata.begin(),
                            pdata.end(),
                            [&]( const Person & p ){ return p.address == str_deleting_criteria; }
                        )
                );
            break;
        }
 
        case PHONE :
        {
            pdata.erase
                (
                    std::remove_if
                        (
                            pdata.begin(),
                            pdata.end(),
                            [&]( const Person & p ){ return p.phone == str_deleting_criteria; }
                        )
                );
            break;
        }
 
        case AGE :
        {
            pdata.erase
                (
                    std::remove_if
                        (
                            pdata.begin(),
                            pdata.end(),
                            [&]( const Person & p ){ return p.age == int_deleting_criteria; }
                        )
                );
            break;
        }
 
        default :
            std::cout << "\nIt seems like wrong number. Try again.\n";
            break;
    } // end switch ( button )
 
    std::cout << "\nSelected data has been erased.\n";
}
#endif // MY_FUNCTIONS_H

main.cpp

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
#include <iostream>
#include <vector>
#include "Person.h"
#include "my_functions.h"
 
int main()
{
    std::vector<Person> pdata;
 
    int key = 0;
    while ( key != EXIT )
    {
        key = promt_user_choose_menu_operation();
        switch ( key )
        {
            case ADD :
                std::cout << "\n\tAdding new student to database.\n";
                add_new_entries_to_array( pdata );
                copy_data_to_file( pdata, "Person.txt" );
                break;
 
            case SHOW :
                if ( !pdata.empty() )
                {
                    // show( pdata );
                    for ( const auto & elem : pdata )
                        elem.show();
                    std::cout << "\n\n";
                }
                else
                    std::cout << "\n\tNo entries were found!\n";
                break;
 
            case DELETE :
                if ( !pdata.empty() )
                {
                    delete_chosen_data_from_array( pdata );
                    copy_data_to_file( pdata, "Person.txt" );
                }
 
                else
                    std::cout << "\n\tNo entries were found!\n";
                break;
 
            case EXIT :
                key = EXIT;
                break;
 
            default :
                std::cout << "\nIt seems like wrong number. Try again.\n";
                break;
 
        } // end switch ( key )
 
    } // end while ( key != EXIT )
 
    return 0;
}


Благодаря ребятам я решил проблему с вводом в массив данных разного типа, но теперь появились новые ошибки - где-то я чего-то упускаю, почему-то данные с консоли я ввожу, но массив (вектор) остаётся пустой и при выводе на консоль выводятся значения по умолчанию. У меня уже глаз дёргается.
Миниатюры
Запись структуры в файл, чтение из файла и удаление (файловый ввод/вывод)  
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
03.12.2016, 17:45
Коллега Mr.X напомнил про банальную перегрузку функций. Она у меня просто вылетела из головы. Теперь вот эту часть можно чуть-чуть упростить:
my_functions.h

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
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
#ifndef MY_FUNCTIONS_H
#define MY_FUNCTIONS_H
 
#include "Person.h"
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <vector>
#include <string>
#include <algorithm>
#include <type_traits>
 
enum ChosenOperation { ADD = 1, SHOW, DELETE, EXIT };
enum SearchingCriteria { NAME = 1, ADDRESS, PHONE, AGE };
 
void get_data_from_user( std::string & str )
{
    std::getline( std::cin, str );
}
 
void get_data_from_user( unsigned int & uint )
{
    std::cin >> uint;
    while ( std::cin.get() != '\n' ) {}
}
 
size_t promt_user_input_number_of_entries()
{
    size_t number_of_entries = 0;
    std::cout << "Enter number of entries: ";
    std::cin >> number_of_entries;
    while ( std::cin.get() != '\n' ) {}
 
    return number_of_entries;
}
 
template <typename T>
void promt_user_input_data_of_selected_field
    (
        const std::string message,
        size_t number_of_entry,
        T selected_field
    )
{
    std::cout << message << " number #" << number_of_entry << ": ";
    get_data_from_user( selected_field );
}
 
template <typename T>
void promt_user_choose_deleting_criteria( T deleting_criteria )
{
    std::cout << "\nSelect deleting criteria:\n\n";
    get_data_from_user( deleting_criteria );
}
 
int promt_user_choose_searching_criteria()
{
    int key = 0;
    std::cout
        << "\nSelect searching criteria:\n\n"
        << "\t1 - SEEK ENTRY BY NAME\n"
        << "\t2 - SEEK ENTRY BY ADDRESS\n"
        << "\t3 - SEEK ENTRY BY PHONE\n"
        << "\t4 - SEEK ENTRY BY AGE\n"
        << "\nMake your choice (press any key): ";
    std::cin >> key;
    return key;
}
 
void add_new_entries_to_array( std::vector<Person> & pers )
{
    pers.resize( promt_user_input_number_of_entries() );
 
    std::cout << "\n\tEnter all nessesary data of each entry.\n";
 
    for ( unsigned int i = 0, nth = 1; i < pers.size(); ++i, ++nth )
    {
        promt_user_input_data_of_selected_field( "Enter full name of student", nth, pers[i].full_name );
        promt_user_input_data_of_selected_field( "Enter address of student", nth, pers[i].address );
        promt_user_input_data_of_selected_field( "Enter phone number of student", nth, pers[i].phone );
        promt_user_input_data_of_selected_field( "Enter age of student", nth, pers[i].age );
        std::cout << "\n";
    }
}
 
void copy_entries_to_file( const std::vector<Person> & pers, const std::string & filename )
{
    std::ofstream fout( filename.c_str(), std::ios::ate );
    for ( size_t i = 0; i < pers.size(); ++i )
    {
        fout
            << pers[i].full_name
            << "|"
            << pers[i].address
            << "|"
            << pers[i].phone
            << "|"
            << pers[i].age
            << "\n";
    }
    fout.close();
}
 
int promt_user_choose_menu_operation()
{
    int key = 0;
    std::cout
        << "\nMENU:\n\n"
        << "\t1 - ADD\n"
        << "\t2 - SHOW\n"
        << "\t3 - DELETE\n"
        << "\t4 - EXIT\n"
        << "\nMake your choice (press any key): ";
    std::cin >> key;
    return key;
}
 
void delete_chosen_data_from_array( std::vector<Person> & pdata )
{
    std::string str_deleting_criteria;
    size_t int_deleting_criteria;
 
    std::cout << "\nNow you can mark entries to deleting.";
    int key = promt_user_choose_searching_criteria();
    std::cout << "\nNow you can delete selected entries.";
 
    if ( key == NAME || key == ADDRESS || key == PHONE)
        promt_user_choose_deleting_criteria( str_deleting_criteria );
    else
        promt_user_choose_deleting_criteria( int_deleting_criteria );
 
    switch ( key )
    {
        case NAME :
        {
            pdata.erase
                (
                    std::remove_if
                        (
                            pdata.begin(),
                            pdata.end(),
                            [&]( const Person & p ){ return p.full_name == str_deleting_criteria; }
                        )
                );
            break;
        }
 
        case ADDRESS :
        {
            pdata.erase
                (
                    std::remove_if
                        (
                            pdata.begin(),
                            pdata.end(),
                            [&]( const Person & p ){ return p.address == str_deleting_criteria; }
                        )
                );
            break;
        }
 
        case PHONE :
        {
            pdata.erase
                (
                    std::remove_if
                        (
                            pdata.begin(),
                            pdata.end(),
                            [&]( const Person & p ){ return p.phone == str_deleting_criteria; }
                        )
                );
            break;
        }
 
        case AGE :
        {
            pdata.erase
                (
                    std::remove_if
                        (
                            pdata.begin(),
                            pdata.end(),
                            [&]( const Person & p ){ return p.age == int_deleting_criteria; }
                        )
                );
            break;
        }
 
        default :
            std::cout << "\nIt seems like wrong number. Try again.\n";
            break;
    } // end switch ( button )
 
    std::cout << "\nSelected data has been erased.\n";
}
#endif // MY_FUNCTIONS_H


Добавлено через 10 минут
Цитата Сообщение от georgiisav988 Посмотреть сообщение
Можешь объяснить кратко или подробно. Что для чего?!
Эээ... кратко: мне лениво постоянно читать данные из файла и писать туда их снова, потом снова читать и снова писать. Я просто один раз спросил у пользователя данные - засунул их в вектор (который на протяжении всего времени работы программы весит в оперативной памяти) и все манипуляции произвожу с ним (с вектором). После того, как всё, что надо удалено из вектора, я записываю оставшиеся элементы вектора в файл. То есть, по сути, я реализовал только запись в файл и обошёлся без чтения из файла. Не знаю, пойдёт ли Вам такое решение?

Добавлено через 5 минут
Ну и да, пока этот кот1 не очень жизнеспособный. Но я над ним работаю.

________________________
1семиногий трёхглазый кот с двумя головами, крыльями, ослиным хвостом, человеческими руками (обе левые) и драконьим гребнем на спине
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
03.12.2016, 17:46
georgiisav988, нашёл ошибку. Вот пока что последняя версия:
Person.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ifndef PERSON_H
#define PERSON_H
 
#include <string>
 
struct Person
{
    std::string full_name = "Default name";     // фамилия имя отчество
    std::string address = "Default address";    // домашний адрес
    std::string phone = "Default phone number"; // телефон
    unsigned int age = 999;                     // возраст
 
    void show() const;
};
 
#endif // PERSON_H

Person.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "Person.h"
#include <iostream>
 
void Person::show() const
{
    std::cout
        << "\n"
        << full_name
        << "\n"
        << address
        << "\n"
        << phone
        << "\n"
        << age
        << "\n";
}

my_functions.h

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
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
#ifndef MY_FUNCTIONS_H
#define MY_FUNCTIONS_H
 
#include "Person.h"
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <vector>
#include <string>
#include <algorithm>
#include <type_traits>
 
enum ChosenOperation { ADD = 1, SHOW, DELETE, EXIT };
enum SearchingCriteria { NAME = 1, ADDRESS, PHONE, AGE };
 
int promt_user_choose_menu_operation()
{
    int key = 0;
    std::cout
        << "\nMENU:\n\n"
        << "\t1 - ADD\n"
        << "\t2 - SHOW\n"
        << "\t3 - DELETE\n"
        << "\t4 - EXIT\n"
        << "\nMake your choice (press any key): ";
    std::cin >> key;
    return key;
}
 
void get_data_from_user( std::string & str )
{
    std::getline( std::cin, str );
}
 
void get_data_from_user( unsigned int & uint )
{
    std::cin >> uint;
    while ( std::cin.get() != '\n' ) {}
}
 
size_t promt_user_input_number_of_entries()
{
    size_t number_of_entries = 0;
    std::cout << "Enter number of entries: ";
    std::cin >> number_of_entries;
    while ( std::cin.get() != '\n' ) {}
 
    return number_of_entries;
}
 
template <typename T>
void promt_user_input_data_of_selected_field
    (
        const std::string message,
        size_t number_of_entry,
        T & selected_field
    )
{
    std::cout << message << " number #" << number_of_entry << ": ";
    get_data_from_user( selected_field );
}
 
template <typename T>
void promt_user_choose_deleting_criteria( T deleting_criteria )
{
    std::cout << "\nSelect deleting criteria:\n\n";
    get_data_from_user( deleting_criteria );
}
 
int promt_user_choose_searching_criteria()
{
    int key = 0;
    std::cout
        << "\nSelect searching criteria:\n\n"
        << "\t1 - SEEK ENTRY BY NAME\n"
        << "\t2 - SEEK ENTRY BY ADDRESS\n"
        << "\t3 - SEEK ENTRY BY PHONE\n"
        << "\t4 - SEEK ENTRY BY AGE\n"
        << "\nMake your choice (press any key): ";
    std::cin >> key;
    return key;
}
 
void add_new_entries_to_array( std::vector<Person> & pers )
{
    pers.resize( promt_user_input_number_of_entries() );
 
    std::cout << "\n\tEnter all nessesary data of each entry.\n";
 
    for ( unsigned int i = 0, nth = 1; i < pers.size(); ++i, ++nth )
    {
        promt_user_input_data_of_selected_field( "Enter full name of student", nth, pers[i].full_name );
        promt_user_input_data_of_selected_field( "Enter address of student", nth, pers[i].address );
        promt_user_input_data_of_selected_field( "Enter phone number of student", nth, pers[i].phone );
        promt_user_input_data_of_selected_field( "Enter age of student", nth, pers[i].age );
        std::cout << "\n";
    }
}
 
void copy_data_to_file( const std::vector<Person> & pers, const std::string & filename )
{
    std::ofstream fout( filename.c_str() );
    for ( size_t i = 0; i < pers.size(); ++i )
    {
        fout
            << pers[i].full_name
            << "|"
            << pers[i].address
            << "|"
            << pers[i].phone
            << "|"
            << pers[i].age
            << "\n";
    }
    fout.close();
}
 
void delete_chosen_data_from_array( std::vector<Person> & pdata )
{
    std::string str_deleting_criteria;
    size_t int_deleting_criteria;
 
    std::cout << "\nNow you can mark entries to deleting.";
    int key = promt_user_choose_searching_criteria();
    std::cout << "\nNow you can delete selected entries.";
 
    if ( key == NAME || key == ADDRESS || key == PHONE)
        promt_user_choose_deleting_criteria( str_deleting_criteria );
    else
        promt_user_choose_deleting_criteria( int_deleting_criteria );
 
    switch ( key )
    {
        case NAME :
        {
            pdata.erase
                (
                    std::remove_if
                        (
                            pdata.begin(),
                            pdata.end(),
                            [&]( const Person & p ){ return p.full_name == str_deleting_criteria; }
                        )
                );
            break;
        }
 
        case ADDRESS :
        {
            pdata.erase
                (
                    std::remove_if
                        (
                            pdata.begin(),
                            pdata.end(),
                            [&]( const Person & p ){ return p.address == str_deleting_criteria; }
                        )
                );
            break;
        }
 
        case PHONE :
        {
            pdata.erase
                (
                    std::remove_if
                        (
                            pdata.begin(),
                            pdata.end(),
                            [&]( const Person & p ){ return p.phone == str_deleting_criteria; }
                        )
                );
            break;
        }
 
        case AGE :
        {
            pdata.erase
                (
                    std::remove_if
                        (
                            pdata.begin(),
                            pdata.end(),
                            [&]( const Person & p ){ return p.age == int_deleting_criteria; }
                        )
                );
            break;
        }
 
        default :
            std::cout << "\nIt seems like wrong number. Try again.\n";
            break;
    } // end switch ( button )
 
    std::cout << "\nSelected data has been erased.\n";
}
#endif // MY_FUNCTIONS_H

main.cpp

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
#include <iostream>
#include <vector>
#include "Person.h"
#include "my_functions.h"
 
int main()
{
    std::vector<Person> pdata;
 
    int key = 0;
    while ( key != EXIT )
    {
        key = promt_user_choose_menu_operation();
        switch ( key )
        {
            case ADD :
                std::cout << "\n\tAdding new student to database.\n";
                add_new_entries_to_array( pdata );
                copy_data_to_file( pdata, "Person.txt" );
                break;
 
            case SHOW :
                if ( !pdata.empty() )
                {
                    // show( pdata );
                    for ( const auto & elem : pdata )
                        elem.show();
                    std::cout << "\n\n";
                }
                else
                    std::cout << "\n\tNo entries were found!\n";
                break;
 
            case DELETE :
                if ( !pdata.empty() )
                {
                    delete_chosen_data_from_array( pdata );
                    copy_data_to_file( pdata, "Person.txt" );
                }
 
                else
                    std::cout << "\n\tNo entries were found!\n";
                break;
 
            case EXIT :
                key = EXIT;
                break;
 
            default :
                std::cout << "\nIt seems like wrong number. Try again.\n";
                break;
 
        } // end switch ( key )
 
    } // end while ( key != EXIT )
 
    return 0;
}
1
03.12.2016, 17:56

Не по теме:

Цитата Сообщение от gru74ik Посмотреть сообщение
exit( EXIT_FAILURE );
Я понимаю, что это учебный пример, но к сожалению, ученики насмотревшись на такие примеры, потом и в реальных программах такое пишут. Я уже намучился отучать. И ведь всегда главный аргумент - "я такое в книге/статье видел". Не надо так...

0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
03.12.2016, 18:13
DrOffset, а надо как? Исключения ловить?

Добавлено через 1 минуту
DrOffset, я думаю у ТСа и так глаза уже на лоб вылезли от обилия всего - шаблоны, лябмды, range-based-for, перегруженные функции, STL...

Добавлено через 1 минуту
DrOffset, как бы всё это сделать проще и чище?
1
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
03.12.2016, 19:36
Цитата Сообщение от gru74ik Посмотреть сообщение
а надо как? Исключения ловить?
Это вопрос отдельный - не обязательно, нужно просто обрабатывать ошибку так, чтобы уже созданные объекты корректно уничтожились или, по крайней мере, остались в корректном состоянии. Тем более, что в последнем коде #29 я exit не вижу.
Конкретно exit опасен тем, что при его использовании не будут вызваны деструкторы всех уже созданных автоматических объектов. В учебных задачах - это вообще не страшно, но потом наученные таким образом товарищи приходят работать и пишут точно так же. Во-первых не все ресурсы процесс сможет при таком выходе отдать операционной системе (да, память и файловые дескрипторы будут отданы, но не ими едиными), во-вторых совершенно не всегда нужно\возможно делать такой бескомпромиссный выход, да еще и с потерей контекста ошибки.
2
0 / 0 / 1
Регистрация: 01.04.2016
Сообщений: 76
03.12.2016, 19:37  [ТС]
Спасибо большое. Но я новичок совсем, и смотрю сейчас и не понимаю, что и как мне засунуть в проект?
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
03.12.2016, 20:16
georgiisav988, ахахахаха, я это сделал!

Person.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ifndef PERSON_H
#define PERSON_H
 
#include <string>
 
struct Person
{
    std::string full_name = "Default name";     // фамилия имя отчество
    std::string address = "Default address";    // домашний адрес
    std::string phone = "Default phone number"; // телефон
    unsigned int age = 999;                     // возраст
 
    void show() const;
};
 
#endif // PERSON_H

Person.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "Person.h"
#include <iostream>
 
void Person::show() const
{
    std::cout
        << "\n"
        << full_name
        << "\n"
        << address
        << "\n"
        << phone
        << "\n"
        << age
        << "\n";
}

my_functions.h

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
174
175
176
177
178
179
180
181
182
#ifndef MY_FUNCTIONS_H
#define MY_FUNCTIONS_H
 
#include "Person.h"
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
 
enum ChosenOperation { ADD = 1, SHOW, DELETE, EXIT };
enum SearchingCriteria { NAME = 1, ADDRESS, PHONE, AGE };
 
int promt_user_choose_menu_operation()
{
    int key = 0;
    std::cout
        << "\nMENU:\n\n"
        << "\t1 - ADD\n"
        << "\t2 - SHOW\n"
        << "\t3 - DELETE\n"
        << "\t4 - EXIT\n"
        << "\nMake your choice (press any key): ";
    std::cin >> key;
    return key;
}
 
void get_data_from_user( std::string & str )
{
    std::getline( std::cin, str );
}
 
void get_data_from_user( unsigned int & uint )
{
    std::cin >> uint;
    while ( std::cin.get() != '\n' ) {}
}
 
size_t promt_user_input_number_of_entries()
{
    size_t number_of_entries = 0;
    std::cout << "Enter number of entries: ";
    std::cin >> number_of_entries;
    while ( std::cin.get() != '\n' ) {}
 
    return number_of_entries;
}
 
template <typename T>
void promt_user_input_data_of_selected_field
    (
        const std::string message,
        size_t number_of_entry,
        T & selected_field
    )
{
    std::cout << message << " number #" << number_of_entry << ": ";
    get_data_from_user( selected_field );
}
 
template <typename T>
void promt_user_choose_deleting_criteria( T & deleting_criteria )
{
    std::cout << "\n\nSelect deleting criteria: ";
    get_data_from_user( deleting_criteria );
}
 
int promt_user_choose_searching_criteria()
{
    unsigned int searching_criteria = 0;
    std::cout
        << "\n\nSelect searching criteria:\n\n"
        << "\t1 - SEEK ENTRY BY NAME\n"
        << "\t2 - SEEK ENTRY BY ADDRESS\n"
        << "\t3 - SEEK ENTRY BY PHONE\n"
        << "\t4 - SEEK ENTRY BY AGE\n"
        << "\nMake your choice (press any key): ";
    get_data_from_user( searching_criteria );
    return searching_criteria;
}
 
void add_new_entries_to_array( std::vector<Person> & pers )
{
    auto number_of_entries = promt_user_input_number_of_entries();
 
    std::cout << "\n\tEnter all nessesary data of each entry.\n";
    Person p;
    for ( unsigned int nth = 1; nth <= number_of_entries; ++nth )
    {
        promt_user_input_data_of_selected_field( "Enter full name of student", nth, p.full_name );
        promt_user_input_data_of_selected_field( "Enter address of student", nth, p.address );
        promt_user_input_data_of_selected_field( "Enter phone number of student", nth, p.phone );
        promt_user_input_data_of_selected_field( "Enter age of student", nth, p.age );
        pers.push_back( p );
        std::cout << "\n";
    }
}
 
void copy_data_to_file( const std::vector<Person> & pers, const std::string & filename )
{
    std::ofstream fout( filename.c_str() );
    for ( size_t i = 0; i < pers.size(); ++i )
    {
        fout
            << pers[i].full_name
            << "|"
            << pers[i].address
            << "|"
            << pers[i].phone
            << "|"
            << pers[i].age
            << "\n";
    }
    fout.close();
}
 
void delete_chosen_data_from_array( std::vector<Person> & pdata )
{
    std::string str_deleting_criteria;
    size_t int_deleting_criteria;
 
    std::cout << "\nNow you can mark entries to deleting.";
    int key = promt_user_choose_searching_criteria();
    std::cout << "\nNow you can delete selected entries.";
 
    if ( key == NAME || key == ADDRESS || key == PHONE)
        promt_user_choose_deleting_criteria( str_deleting_criteria );
    else
        promt_user_choose_deleting_criteria( int_deleting_criteria );
 
    std::vector<Person>::iterator it;
    int counter;
    switch ( key )
    {
        case NAME :
            counter = std::count_if( pdata.begin(), pdata.end(), [&]( const Person & p ){ return p.full_name == str_deleting_criteria; } );
            for ( int i = 0; i < counter; ++i)
            {
                it = std::find_if( pdata.begin(), pdata.end(), [&]( const Person & p ){ return p.full_name == str_deleting_criteria; } );
                pdata.erase( it );
                std::vector<Person>( pdata ).swap( pdata );
            }
            break;
 
        case ADDRESS :
            counter = std::count_if( pdata.begin(), pdata.end(), [&]( const Person & p ){ return p.address == str_deleting_criteria; } );
            for ( int i = 0; i < counter; ++i)
            {
                it = std::find_if( pdata.begin(), pdata.end(), [&]( const Person & p ){ return p.address == str_deleting_criteria; } );
                pdata.erase( it );
                std::vector<Person>( pdata ).swap( pdata );
            }
            break;
 
        case PHONE :
            counter = std::count_if( pdata.begin(), pdata.end(), [&]( const Person & p ){ return p.phone == str_deleting_criteria; } );
            for ( int i = 0; i < counter; ++i)
            {
                it = std::find_if( pdata.begin(), pdata.end(), [&]( const Person & p ){ return p.phone == str_deleting_criteria; } );
                pdata.erase( it );
                std::vector<Person>( pdata ).swap( pdata );
            }
            break;
 
        case AGE :
            counter = std::count_if( pdata.begin(), pdata.end(), [&]( const Person & p ){ return p.age == int_deleting_criteria; } );
            for ( int i = 0; i < counter; ++i)
            {
                it = std::find_if( pdata.begin(), pdata.end(), [&]( const Person & p ){ return p.age == int_deleting_criteria; } );
                pdata.erase( it );
                std::vector<Person>( pdata ).swap( pdata );
            }
            break;
 
        default :
            std::cout << "\nIt seems like wrong number. Try again.\n";
            break;
    } // end switch ( button )
 
    std::cout << "\nSelected data has been erased.\n";
}
#endif // MY_FUNCTIONS_H

main.cpp

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
#include <iostream>
#include <vector>
#include "Person.h"
#include "my_functions.h"
 
int main()
{
    std::vector<Person> pdata;
 
    int key = 0;
    while ( key != EXIT )
    {
        key = promt_user_choose_menu_operation();
        switch ( key )
        {
            case ADD :
                std::cout << "\n\tAdding new student to database.\n";
                add_new_entries_to_array( pdata );
                copy_data_to_file( pdata, "Person.txt" );
                break;
 
            case SHOW :
                if ( !pdata.empty() )
                {
                    // show( pdata );
                    for ( const auto & elem : pdata )
                        elem.show();
                    std::cout << "\n\n";
                }
                else
                    std::cout << "\n\tNo entries were found!\n";
                break;
 
            case DELETE :
                if ( !pdata.empty() )
                {
                    delete_chosen_data_from_array( pdata );
                    copy_data_to_file( pdata, "Person.txt" );
                }
 
                else
                    std::cout << "\n\tNo entries were found!\n";
                break;
 
            case EXIT :
                key = EXIT;
                break;
 
            default :
                std::cout << "\nIt seems like wrong number. Try again.\n";
                break;
 
        } // end switch ( key )
 
    } // end while ( key != EXIT )
 
    return 0;
}
Миниатюры
Запись структуры в файл, чтение из файла и удаление (файловый ввод/вывод)   Запись структуры в файл, чтение из файла и удаление (файловый ввод/вывод)   Запись структуры в файл, чтение из файла и удаление (файловый ввод/вывод)  

Запись структуры в файл, чтение из файла и удаление (файловый ввод/вывод)   Запись структуры в файл, чтение из файла и удаление (файловый ввод/вывод)  
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
03.12.2016, 20:45
Цитата Сообщение от georgiisav988 Посмотреть сообщение
что и как мне засунуть в проект?
georgiisav988, ты в какой среде разработки работаешь?

Добавлено через 27 минут
Обычно так делают: создают консольный проект (консольное приложение). Там всего один файл c функцией main(). Потом выбираешь в меню "Добавить новый файл" (чтобы добавить новый заголовочный файл, например вот как у меня my_functions.h) или "Добавить новый класс". Вот как добавить новый класс в QtCreator, например.
1
0 / 0 / 1
Регистрация: 01.04.2016
Сообщений: 76
03.12.2016, 21:16  [ТС]
Visual 2015
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
03.12.2016, 22:49
Цитата Сообщение от georgiisav988 Посмотреть сообщение
Visual 2015
georgiisav988, сейчас сделаю мини-гайд. Погодь несколько минут.
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
03.12.2016, 22:50
georgiisav988, вот, сделал краткое руководство в картинках:
1
0 / 0 / 1
Регистрация: 01.04.2016
Сообщений: 76
03.12.2016, 23:17  [ТС]
Такой вопрос еще.
Если записи добавлены уже в файл, то удалить из файла запись нет возможности?
Просто завтра буду просматривать код.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
03.12.2016, 23:20
georgiisav988, в секции main смотри 38 и 39 строки кода:
C++
1
2
delete_chosen_data_from_array( pdata );
copy_data_to_file( pdata, "Person.txt" );
Это значит что? Это значит, что ты удаляешь информацию из массива с помощью функции delete_chosen_data_from_array, а потом этот изменённый массив пишешь в файл с помощью функции copy_data_to_file. Так что всё там нормально удаляется.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.12.2016, 23:20

Считать данные из текстового файла по условию и записать их в другой текстовый файл (файловый ввод/вывод)
Здравствуйте! Очень прошу о помощи! Суть задания - дан текстовый файл, нужно считать его и записать в другой файл слова состоящие только из...

Структуры.Файловый ввод вывод в С++
Никак не могу разобраться с заданием. Помогиииите!! Структурный тип данных: Текущий курс иностранной валюты (course) Элементы...

Структуры, Файловый ввод-вывод. С++
Привет, помогите пожалуйста. Задание: В программе собраны сведения об успеваемости студентов одной группы по некоторой дисциплине....

структуры. файловый ввод-вывод.
не могу понять, чего от меня хотят???? Сформировать двоичный файл из элементов, заданной структуры, распечатать его содержимое,...

Для каждой строки файла удалить среднее слово; результат записать в файл (файловый ввод/вывод)
для каждой строки файла удалить среднее слово. результат записать в файл


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru