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

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

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

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

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

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

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

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

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

Запись в файл структуры - C++
Есть структура Помогите реализовать запись в файл? Мой вариант не работает.... #include&quot;stdafx.h&quot; #include&quot;iostream&quot; ...

Запись структуры в файл. - C++
3. Написать процедуры (или функции) записи в файл и считывания из файла массива структур. 4. Использовать файлы трех типов – текстовый...

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4820 / 3240 / 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
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
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
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
4820 / 3240 / 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
4820 / 3240 / 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
4820 / 3240 / 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
4820 / 3240 / 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++
Структура следующая: struct TRAIN{ char punkt; int nomb; float time; }; Массив из структур нужно записать в файл. ...

Запись структуры в файл - C++
Дано файл библиотека. Он содержит информацию про книги: автор, название, год издания. Упорядочить файл по году издания, а в пределах...

запись структуры в файл - C++
#include &lt;cstdio&gt; #include &lt;fstream&gt; #include &lt;iostream&gt; using namespace std; struct MyStruct { char name; char...

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

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


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

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

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