0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 10
1

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

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

Помогите пожалуйста записать структуры в файл...

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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.01.2010, 16:10
Ответы с готовыми решениями:

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

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

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

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

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

C++
1
f.write((const char *) (DataBase+i), sizeof(DBase));
возможно придётся сделать
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11719 / 7224 / 1712
Регистрация: 25.07.2009
Сообщений: 13,227
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 и значения в месяцах например записывать, ну да ладно...
};
...
1
159 / 156 / 47
Регистрация: 29.04.2009
Сообщений: 636
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);
}
1
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
0
4865 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
26.01.2010, 04:13 6
Цитата Сообщение от 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  [ТС] 7
Помогите переделать эту программу , разбить всё на функции...
0
4865 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
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 с выбором этих функций вынести в его функцию
1
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 цикл чтобы оно нормально работало. На этом все
0
4865 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
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) {
        дальше там
этот вариант прекращает цикл в конце файла и в случае ошибки чтения, первый при ошибке чтения повиснет
0
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);
}
0
4865 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
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
0
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) );
       }
   }
0
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 10
06.02.2010, 18:25  [ТС] 14
Нужна помощь в сортировки методом выбора на С++ не как не могу разобраться с ней(((
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.02.2010, 18:25
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru