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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.80
Lucchese
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 10
24.01.2010, 16:10     Запись структуры в файл... #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
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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.01.2010, 16:10     Запись структуры в файл...
Посмотрите здесь:

C++ запись структуры в файл
Запись структуры в файл C++
C++ запись структуры в файл
Запись структуры в файл. C++
Запись структуры в файл C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
25.01.2010, 01:54     Запись структуры в файл... #2
C++
1
f.write(DataBase+i, sizeof(DBase));
запишет сразу всю

C++
1
f.write((const char *) (DataBase+i), sizeof(DBase));
возможно придётся сделать
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
25.01.2010, 09:49     Запись структуры в файл... #3
Цитата Сообщение от 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 и значения в месяцах например записывать, ну да ладно...
};
...
Sekt
 Аватар для Sekt
156 / 155 / 10
Регистрация: 29.04.2009
Сообщений: 637
25.01.2010, 13:43     Запись структуры в файл... #4
Помогите пожалуйста записать структуры в файл...
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);
}
Lucchese
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 10
26.01.2010, 00:07  [ТС]     Запись структуры в файл... #5
Нужна еше помощь вот код программы что я уже сделал( огромное спасибо 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
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
26.01.2010, 04:13     Запись структуры в файл... #6
Цитата Сообщение от Lucchese
И еще как сделать что бы можно было ФИО вводить через пробел а то у меня только одним словом можно вести (
C++
1
cin.getline(t.PIB, sizeof t.PIB);
можно PIB разделить на три ещё и через cin >>
Lucchese
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 10
26.01.2010, 15:25  [ТС]     Запись структуры в файл... #7
Помогите переделать эту программу , разбить всё на функции...
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
27.01.2010, 04:06     Запись структуры в файл... #8
надо каждый case вынести в его функцию, потом уже назвать её соотвественно тому, что она делает

это как подсказка
Код
    "1. Dobavit.\n"
    "2. Prosmotr.\n"
    "3. Uparyadkuvat.\n"
    "4. Nayti.\n"
    "5. Podnyat.\n"
    "9. Exit.\n\n"
Добавлено через 52 секунды
когда сделаешь case'ы, можно будет switch с выбором этих функций вынести в его функцию
Lucchese
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 10
27.01.2010, 14:37  [ТС]     Запись структуры в файл... #9
Может кто то написать пример как реализовать в виде функции например просмотр БД
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";
                                }
а то я пытаюсь но у меня вылетают ошибки при компиляции
Код
[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 цикл чтобы оно нормально работало. На этом все
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
28.01.2010, 01:46     Запись структуры в файл... #10
в поиске внутренний цикл не нужен

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) {
        дальше там
этот вариант прекращает цикл в конце файла и в случае ошибки чтения, первый при ошибке чтения повиснет
Lucchese
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 10
28.01.2010, 19:18  [ТС]     Запись структуры в файл... #11
Спасибо огромнейшее !

Добавлено через 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);
}
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
29.01.2010, 02:27     Запись структуры в файл... #12
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
Lucchese
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 10
29.01.2010, 16:33  [ТС]     Запись структуры в файл... #13
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) );
       }
   }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.02.2010, 18:25     Запись структуры в файл...
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Lucchese
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 10
06.02.2010, 18:25  [ТС]     Запись структуры в файл... #14
Нужна помощь в сортировки методом выбора на С++ не как не могу разобраться с ней(((
Yandex
Объявления
06.02.2010, 18:25     Запись структуры в файл...
Ответ Создать тему
Опции темы

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