Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/26: Рейтинг темы: голосов - 26, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 10

Запись структуры в файл...

24.01.2010, 16:10. Показов 5442. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите пожалуйста записать структуры в файл...

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
#include <iostream.h>
#include <stdio.h>
#include <memory.h>
#include <fstream.h>
 
 
//Объявления структуры
struct DBase
{
    char PIB[100]; //ФИО работника
    float salary[8]; //зарплата 
    float experience[6]; //стаж работы
};
    const int N=1000;
    int main()
    {
    int i,menu;
    DBase DataBase[N];
    cout << "1: Dobavit pracivnika\n" 
         << "2: nayti pracivnica iz zadanoi zarplatoy\n"
         << "3: Uparyadkuvat za zrostanyam staju\n"
         << "4: Pidvisiti zarplatu pracivnikam 10 year 10%\n"
         << "5: Exit\n";
    cin >> menu;
    if(menu==1)
    {
    cout << "Vedite kol-vo sotrudinikov: ";
    int kol_sot;
    cin >> kol_sot;
    fstream f("DataBase.dat",ios::out);
    for(i=0;i<=kol_sot;i++)
    {
    cout << "Vedite PIB: ";
    cin >> DataBase[i].PIB;
    cout << "Vedite Zarplatu:";
    cin >> DataBase[i].salary;
    cout << "Vedite Staz Raboti:";
    cin >> DataBase[i].experience;
    f.seekp(0,ios::end);
    f.write((unsigned char*)&DataBase[i].PIB,sizeof DataBase[i].PIB);
    f.write((unsigned char*)&DataBase[i].salary,sizeof DataBase[i].salary);
    f.write((unsigned char*)&DataBase[i].experience,sizeof DataBase[i].experience);
    cout << "\n";
    }
    }
return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.01.2010, 16:10
Ответы с готовыми решениями:

Запись структуры в файл
как записать структуру в файл с++?

Запись структуры в файл
Доброго времени суток! Программа: создается файл с данными художников ФИО автора , Наименование картин , год написание картин все...

Запись структуры в файл.
Структура следующая: struct TRAIN{ char punkt; int nomb; float time; }; Массив из структур нужно записать в файл. ...

13
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
25.01.2010, 01:54
C++ Скопировано
1
f.write(DataBase+i, sizeof(DBase));
запишет сразу всю

C++ Скопировано
1
f.write((const char *) (DataBase+i), sizeof(DBase));
возможно придётся сделать
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12841 / 7582 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
25.01.2010, 09:49
Цитата Сообщение от Lucchese Посмотреть сообщение
C++ Скопировано
1
2
float salary[8]; //зарплата 
float experience[6]; //стаж работы
Это что же за зарплата, которую аж в массив из 8 значений типа float записывать приходится? Да и со стажем не понятно - то-ли у него 6 жизней, то-ли на 6 работах сразу работает...
C++ Скопировано
1
2
3
4
5
6
7
8
...
struct DBase
{
        char PIB[100]; //ФИО работника
        double salary; //зарплата 
        double experience; //стаж работы, хотя хватило бы и int и значения в месяцах например записывать, ну да ладно...
};
...
1
 Аватар для Sekt
159 / 156 / 47
Регистрация: 29.04.2009
Сообщений: 636
25.01.2010, 13:43
Помогите пожалуйста записать структуры в файл...
C Скопировано
1
2
3
4
5
6
7
8
cout<<"Vvedite kol-vo zapisei";
cin>>k;
Dbase b[10];
for(i=0;i<k;i++)
{
cin>>b[i].salary>>b[i].PBI....
fwrite(b[i],sizeof(Dbase),1,F);
}
1
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 10
26.01.2010, 00:07  [ТС]
Нужна еше помощь вот код программы что я уже сделал( огромное спасибо Carpe за предоставленный на форуме пример)
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
#define _CRT_SECURE_NO_DEPRECATE
 
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <fstream.h>
 
//Объявления структуры------------------------------------
struct DBase
{
    char PIB[20]; //ФИО работника
    unsigned int salary; //зарплата 
    unsigned int experience; //стаж работы
};
 
void menu(void) {
        printf( 
                "\n"
                "1. Dobavit.\n"
                "2. Prosmotr.\n"
                "3. Uparyadkuvat.\n"
                "4. Nayti.\n"
                "5. Podnyat.\n"
                "9. Exit.\n\n"
              );
}
    //Начало програмы------------------------------------
    int main()
    {
        // открытие файла на запись------------------------------------
        FILE *f;
        f = fopen( "database.txt", "ab+" );
        if( f == NULL ) 
        {
         return -1;
                 }
        menu();
        char c;
   while(true) {
                cout << "\rViberite rijim roboti: ";
                DBase t;
                c = getch();
    switch (c) {
                case '1': // Добавление ----------------------------------
                cout << "\n\n Popolneniya 'file.dat'.\n"
                "Dlya vihoda v menu vvedite 0 Vmesto FIO rabotnika ili Zarplati.\n\n";
                fseek( f, 0, SEEK_END );
                // работа с файлом------------------------------------
                while( true )  
                {
                cout << "FIO Rabotnika: ";
                cin >> t.PIB;
                if( t.PIB[0]=='0' ) break;
                
                cout << "Zarplata: ";
                cin >> t.salary;
                if( t.salary=='0' ) break;
                
                cout << "Staz Roboti: ";
                cin >> t.experience;
                fwrite( &t, sizeof(t), 1, f );
                cout << "Informacia dobavlena.\n\n";
                }
                menu();
                break;
                case '2': // Просмотр ------------------------------------
                cout << "\n\nSoderzimoe bazi 'database.txt'\n\n";
                                
                fseek( f, 0, SEEK_SET );                               
                setlocale( LC_ALL, "Rus" );                          
                while( true )                       
                {
                    if( fread( &t, sizeof(DBase), 1, f ) !=1 ) break;
                    cout << "\tFIO:" << t.PIB 
                         << "\tZarplata:" << t.salary 
                         << "\tStaz:" << t.experience 
                         << "\n";
                }                                    
                menu();                             
                break;
                
                case '4': // ПОИСК ------------------------------------
                int s_salary;
                cout << "\nVvedite Zrplatu dlya poiska: ";
                cin >> s_salary; //Зарплата для поиска.
                fseek( f, 0, SEEK_SET );
                while( true )
                {
                if (feof(f)) break;
                fread( &t, sizeof(DBase), 1, f );
                while ( t.salary == s_salary )
                {
                 if ( t.salary != s_salary ) break;
                 if ( t.salary == s_salary ) 
                {           
                 cout << "\tFIO:" << t.PIB << "\tZarplata:" << t.salary << "\tStaz:" << t.experience << "\n";
                }
                }                                      
                }
                menu();
                break;      
 
                case '5': //Поднятие зарплаты
                int otvet;
                cout << "\nVi uverini chto hotite podnyat zarplatu?\n";
                cout << "Da = 1 \ Net = 0 ";
                cin >> otvet;
                if( otvet=='0' ) break;     
                int u_zarplata;
                fseek( f, 0, SEEK_SET );
                while( true )
                {
                if (feof(f)) break;
                fread( &t, sizeof(DBase), 1, f );
                if (t.experience>=10)
                {
                  while(true)
                  {
                  u_zarplata = (t.salary * 10)/100;
                  fwrite( &t.salary, sizeof(u_zarplata), 1, f );
                }
                }
                }
                menu();
                break;  
                case '9': // Выход------------------------------------
                return 0;
 
}
}
}
Нужно подправить вот это, а то выводит по несколько раз одного и того же человека...
C++ Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
                case '4': // ПОИСК ------------------------------------
                int s_salary;
                cout << "\nVvedite Zrplatu dlya poiska: ";
                cin >> s_salary; //Зарплата для поиска.
                fseek( f, 0, SEEK_SET );
                while( true )
                {
                if (feof(f)) break;
                fread( &t, sizeof(DBase), 1, f );
                while ( t.salary == s_salary )
                {
                 if ( t.salary != s_salary ) break;
                 if ( t.salary == s_salary ) 
                {           
                 cout << "\tFIO:" << t.PIB << "\tZarplata:" << t.salary << "\tStaz:" << t.experience << "\n";
                }
                }                                      
                }
                menu();
                break;

Вот еще не могу понять, мне нужно поднять зарплату на 10% всем работникам у кого стаж работы больше или равен 10 годам, как заменить те данные что в файле, на те что увеличены
C++ Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
                case '5': //Поднятие зарплаты
                int otvet;
                cout << "\nVi uverini chto hotite podnyat zarplatu?\n";
                cout << "Da = 1 \ Net = 0 ";
                cin >> otvet;
                if( otvet=='0' ) break;     
                int u_zarplata;
                fseek( f, 0, SEEK_SET );
                while( true )
                {
                if (feof(f)) break;
                fread( &t, sizeof(DBase), 1, f );
                if (t.experience>=10)
                {
                  while(true)
                  {
                  u_zarplata = (t.salary * 10)/100;
                  fwrite( &t.salary, sizeof(u_zarplata), 1, f );
                }
                }
                }
И последний вопрос как сделать сортирование по увеличению зарплаты?
Заранее огромнейшее спасибо всем кто поможет!

Добавлено через 1 час 6 минут
И еще как сделать что бы можно было ФИО вводить через пробел а то у меня только одним словом можно вести (

Добавлено через 3 часа 35 минут
Помогите пожалуйста завтра показать нужно.....

Добавлено через 3 часа 23 минуты
up

Добавлено через 1 час 16 минут
up
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
26.01.2010, 04:13
Цитата Сообщение от Lucchese
И еще как сделать что бы можно было ФИО вводить через пробел а то у меня только одним словом можно вести (
C++ Скопировано
1
cin.getline(t.PIB, sizeof t.PIB);
можно PIB разделить на три ещё и через cin >>
1
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 10
26.01.2010, 15:25  [ТС]
Помогите переделать эту программу , разбить всё на функции...
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
27.01.2010, 04:06
надо каждый case вынести в его функцию, потом уже назвать её соотвественно тому, что она делает

это как подсказка
Code Скопировано
1
2
3
4
5
6
    "1. Dobavit.\n"
    "2. Prosmotr.\n"
    "3. Uparyadkuvat.\n"
    "4. Nayti.\n"
    "5. Podnyat.\n"
    "9. Exit.\n\n"
Добавлено через 52 секунды
когда сделаешь case'ы, можно будет switch с выбором этих функций вынести в его функцию
1
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 10
27.01.2010, 14:37  [ТС]
Может кто то написать пример как реализовать в виде функции например просмотр БД
C++ Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
              cout << "\n\nSoderzimoe bazi 'database.txt'\n\n";
                                                
                                fseek( f, 0, SEEK_SET );                               
                                setlocale( LC_ALL, "Rus" );                          
                                while( true )                                           
                                {
                                        if( fread( &t, sizeof(DBase), 1, f ) !=1 ) break;
                                        cout << "\tFIO:" << t.PIB 
                                             << "\tZarplata:" << t.salary 
                                                 << "\tStaz:" << t.experience 
                                                 << "\n";
                                }
а то я пытаюсь но у меня вылетают ошибки при компиляции
Code Скопировано
1
2
[C++ Error] programa.cpp(39): E2451 Undefined symbol 'f'
[C++ Error] programa.cpp(42): E2451 Undefined symbol 't'
Добавлено через 32 минуты
вроде вроде понял как Спасибо accept !
Метод тыка хорошая штука))

Добавлено через 2 часа 18 минут
С функциями разобрался )
Теперь не могу понять 2 вещи
1) как сделать Сортирование методом выбора?
вот так я пробую
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
template <class T>
void selectSort(DBase, long size) 
{
long i, j, k;
T x;
                int s_salary;
                DBase t;
                FILE *f;
                f = fopen( "database.txt", "ab+" );
                if( f == NULL ) 
                {
                }
                fseek( f, 0, SEEK_SET );
for( i=0; i < size; i++) { // i - номер текущего шага
k=i; x=t.experience[i];
for( j=i+1; j < size; j++) // цикл выбора наименьшего элемента
if ( t.experience[j] < x ) 
{
k=j; 
x=t.experience[j]; // k - индекс наименьшего элемента
}
t.experience[k] = t.experience[i]; 
t.experience[i] = x; // меняем местами наименьший с a[i]
}
}
Но проверить работает или нет не могу, не знаю как вывести полученный массив на экран(((
и 2-е.
С поиском проблемы вот код
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
void SearchBD()
{
                int s_salary;
                DBase t;
                FILE *f;
                f = fopen( "database.txt", "ab+" );
                if( f == NULL ) 
                {
                }
                cout << "\nVvedite Zrobitnu platu dlya powuku: ";
                cin >> s_salary; //Зарплата для поиска.
                
                fseek( f, 0, SEEK_SET );
                while( true )
                {
                if (feof(f)) break;
                fread( &t, sizeof(DBase), 1, f );
                while ( true )
                {
                 if ( t.salary != s_salary ) break;
                 if ( t.salary == s_salary ) 
                {           
                 cout << "\tFIO:" << t.PIB << "\tZarplata:" << t.salary << "\tStaz:" << t.experience << "\n";
                }
                }                                      
                }       
                fclose(f);
                
}
Оно у меня бесконечно выводит одного и того же сотрудника, я не могу понять что нада написать в while цикл чтобы оно нормально работало. На этом все
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
28.01.2010, 01:46
в поиске внутренний цикл не нужен

C++ Скопировано
1
2
3
4
5
6
7
8
9
10
    цикл продолжается
    if (t.salary == s_salary)
        cout << "\tFIO:"
             << t.PIB
             << "\tZarplata:"
             << t.salary
             << "\tStaz:"
             << t.experience
             << "\n";
    // мы даже break не делаем, потому что сотрудников может быть несколько
Добавлено через 3 минуты
C++ Скопировано
1
2
3
    while (true) {
        if (feof(f)) break;
        fread( &t, sizeof(DBase), 1, f );
C++ Скопировано
1
2
    while (fread(&t, sizeof(DBase), 1, f) == 1) {
        дальше там
этот вариант прекращает цикл в конце файла и в случае ошибки чтения, первый при ошибке чтения повиснет
0
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 10
28.01.2010, 19:18  [ТС]
Спасибо огромнейшее !

Добавлено через 19 минут
Помогите поправить код. Нужно чтобы у всех работников у которых стаж больше 10 лет , зарплату увеличить на 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
void UpZarplata(void)
{
              int r;
              int otvet;
              DBase t;
              FILE *f,*fd;
              fd=fopen("database.tmp","wb");
              f=fopen("database.txt","rb");
              int i;
              i=1;
              while (fread(&t,sizeof(DBase),1,f) == 1)
              {
              fwrite(&t, sizeof(DBase),1,fd);
              }
              cout << "Vi uvereni chto hotite podnyat zarplatu ?\n";
              cout << "Da = 1 / Net = 0";
              cin >> otvet;
              if (otvet == 1)
              {
               while (fread(&t, sizeof(DBase), 1, f) == 1) 
               {
               if (t.experience > 10)
               {
               r = (t.salary * 10)/100;
               t.salary = t.salary + r;
               }
               fwrite(&t, sizeof(DBase),1,fd);
              while (fread(&t,sizeof(DBase),1,f))
              {
              fwrite(&t, sizeof(DBase),1,fd);
              }
              fclose(fd);
              fclose(f);
              f=fopen("database.txt","wb");
              fd=fopen("database.tmp","rb");
              while (fread(&t,sizeof(DBase),1,fd))
              {
              fwrite(&t, sizeof(DBase),1,f);
              }
              }
              }
              fclose(fd);
              fclose(f);
}
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
29.01.2010, 02:27
C++ Скопировано
1
2
        r = (t.salary * 10)/100;
        t.salary = t.salary + r;
C++ Скопировано
1
        t.salary += t.salary / 10;
C++ Скопировано
1
        t.salary += t.salary / 100 * 10;
это развёрнуто

типа 220 / 100 * 10 == 220 / 10
0
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 10
29.01.2010, 16:33  [ТС]
C++ Скопировано
1
2
3
4
5
6
7
   while( file.read(static_cast<char*>(static_cast<void*>(&buf)), sizeof(buf)) ) {
       if (buf.experience > 10) {
          buf.salary += buf.salary/10;
          file.seekp( file.tellg() - sizeof(buf), std::fstream::beg);
          file.write( static_cast<char*>(static_cast<void*>(&buf)), sizeof(buf) );
       }
   }
0
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 10
06.02.2010, 18:25  [ТС]
Нужна помощь в сортировки методом выбора на С++ не как не могу разобраться с ней(((
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.02.2010, 18:25
Помогаю со студенческими работами здесь

Запись структуры в файл
Работаю в Borland C(чистый С) Нужно: Создать файл, который содержит ведомости об картотеке в регистратуре поликлинники. Данные должны...

Запись структуры в файл.
Всем продуктивной ночи! Подскажите, хочу записать структуру в файл, нужно использовать fputs. Ну и не получается, поскольку ф-ция просит...

Запись структуры в файл
Дано код....описание : Запись множество обиектов в файл когда размеры порождаюших классов разные Но я ни как не могу найти свзяь между...

Запись структуры в файл
Помогите найти ошибку в коде. Задание. Разработать программу на языке С + +, реализующей запись в файл информации о студенте (10...

Запись структуры в файл
имеется одномерный массив типа структуры base struct base { String name; String work; String year; } каким образом...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Списки и кортежи в Python: различия, особенности, применение
py-thonny 13.04.2025
Python славится своей гибкостью при работе с данными. В арсенале языка есть две основные последовательные структуры данных, которые программисты используют ежедневно — списки и кортежи. Эти структуры. . .
Middleware в ASP.NET Core
UnmanagedCoder 13.04.2025
В ASP. NET Core термин "middleware" занимает особое место. Что же это такое? Middleware представляет собой программные компоненты, которые формируют конвейер обработки HTTP-запросов в приложении. . . .
Таблицы лута в Unity с MinMaxCurve и AnimationCurve
GameUnited 12.04.2025
Создание сбалансированного лута в играх — задача не из простых. Разработчики постоянно ищут способы настройки систем выпадения предметов, которые будут одновременно справедливыми для игроков и. . .
std::expected в C++: Управление ошибками
bytestream 12.04.2025
Обработка ошибок всегда была важной и одновременно сложной задачей в программировании на C++. На протяжении долгого времени разработчики использовали различные подходы: возвращаемые коды ошибок,. . .
Nullable типы и операторы объединения null в C#
UnmanagedCoder 12.04.2025
Многие шутят, что null — это миллиардная ошибка в программировании. И в этой шутке только доля шутки. Тони Хоар, создатель null-ссылки, сам назвал её своей "ошибкой на миллиард долларов". Почему?. . .
Аутентификация и авторизация JWT в микросервисах с API Gateway
stackOverflow 12.04.2025
В традиционных монолитных приложениях безопасность часто реализуется как единый защитный периметр - пользователь проходит аутентификацию один раз, после чего получает доступ ко всем функциям системы. . . .
TypeScript: Интерфейсы vs Типы
run.dev 11.04.2025
Современная разработка на JavaScript сталкивается с множеством проблем при масштабировании проектов. Типизация кода стала хорошим инструментом, помогающим избежать ошибок во время выполнения,. . .
Управление топиками и разделами Kafka
Javaican 11.04.2025
Apache Kafka — распределенная платформа потоковой передачи данных, которая стала стандартом для построения высоконагруженных систем обмена сообщениями. В современной архитектуре микросервисов,. . .
Миграция монолита в Event-Driven микросервисную архитектуру на C#
stackOverflow 11.04.2025
Монолитная архитектура – классический подход к разработке программного обеспечения. Это приложение, построенное как единое целое, где все компоненты тесно связаны между собой. Большинство проектов. . .
Go в Kubernetes: Управление ресурсами
golander 11.04.2025
Разработчики Go-приложений в Kubernetes часто сталкиваются с неожиданными проблемами производительности и даже внезапными отказами контейнеров. Причина этого кроется в особенностях взаимодействия. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер