Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.80
Lucchese
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 10
#1

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

24.01.2010, 16:10. Просмотров 2030. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.01.2010, 16:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Запись структуры в файл... (C++):

запись структуры в файл - C++
ПОМОГИТЕ пожалуйста......... не могу сделать так чтобы в файл по завершению работы программы записывалось действие которое...

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

Запись структуры в файл - C++
Задание заключается в том что бы не используя ofstream и ifstream создать файл и записать в него, данные с клавиатуры. #include...

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

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

запись структуры в файл - C++
Здравствуйте. Мне очень нужна Ваша помощь. Надо написать программу обработки файла, состоящего из структур. Предусмотреть вывод на экран...

13
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
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
easybudda
Модератор
Эксперт CЭксперт С++
9698 / 5648 / 964
Регистрация: 25.07.2009
Сообщений: 10,863
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
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);
}
1
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
0
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
26.01.2010, 04:13 #6
Цитата Сообщение от Lucchese
И еще как сделать что бы можно было ФИО вводить через пробел а то у меня только одним словом можно вести (
C++
1
cin.getline(t.PIB, sizeof t.PIB);
можно PIB разделить на три ещё и через cin >>
1
Lucchese
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 10
26.01.2010, 15:25  [ТС] #7
Помогите переделать эту программу , разбить всё на функции...
0
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
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
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 цикл чтобы оно нормально работало. На этом все
0
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
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
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);
}
0
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
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
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) );
       }
   }
0
Lucchese
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 10
06.02.2010, 18:25  [ТС] #14
Нужна помощь в сортировки методом выбора на С++ не как не могу разобраться с ней(((
0
06.02.2010, 18:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.02.2010, 18:25
Привет! Вот еще темы с ответами:

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

Запись структуры в файл - C++
Написать программу выдающую на печать следующую информацию: фамилию сборщика и общее количество деталей, собранное им за неделю; фамилию...

Запись структуры в файл - C++
Хочу записать структуру в файл. Но записывается только одна структура , последняя. #include &quot;stdafx.h&quot; #include &lt;fstream&gt; #include...

Запись структуры в файл - C++
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &quot;stdafx.h&quot; int main() { struct TDataTime { int Day; int...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.