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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 98, средняя оценка - 4.91
necto
5 / 4 / 1
Регистрация: 27.01.2009
Сообщений: 30
#1

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

07.02.2009, 08:25. Просмотров 12415. Ответов 9
Метки нет (Все метки)

Структура следующая:
C++
1
2
3
4
5
struct TRAIN{
        char punkt[20];
        int nomb;
        float time;
    };
Массив из структур нужно записать в файл. Проблема следующая: файл открывается/создается но в него ничего не записывается.

Эту часть постановки задачи я реализовал следующим образом:
C++
1
2
3
4
5
6
7
8
9
10
    char name[20];
    cout<<"vv-te ima faila dla sozdania  -> ";
    cin>>name;
    ifstream fin(name, ios::app|ios::beg);
    for(i=0;i<4;i++)
    {
        fin.get(tr[i].punkt,10);
        fin>>tr[i].nomb;
        fin>>tr[i].time;
    }
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
XuTPbIu_MuHTAu
Эксперт C++
2221 / 736 / 10
Регистрация: 27.05.2008
Сообщений: 1,508
07.02.2009, 11:55     Запись структуры в файл. #2
Цитата Сообщение от necto Посмотреть сообщение
Проблема следующая: файл открывается/создается но в него ничего не записывается. [/cpp]
Вы из него читаете.
necto
5 / 4 / 1
Регистрация: 27.01.2009
Сообщений: 30
07.02.2009, 16:56  [ТС]     Запись структуры в файл. #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Добавлено через 20 минут 27 секунд
Я нашел ошибку: вместо ifstream() нужен ofstream(). Плюс небольшие поправки в синтаксисе.

C++
1
2
3
4
5
6
7
8
    ofstream f(name, ios::app|ios::beg);
//..............
    for(i=0;i<4;i++)
    {
        f<<tr[i].punkt;
        f<<tr[i].nomb;
        f<<tr[i].time;
    }
Добавлено через 42 минуты 19 секунд
Полученая программа записывает структуру TRAIN(название пункта назначения, номер поезда, время) в массив из элементов типа TRAIN; упорядочивает записи по номерам поездов. Записывает значения в файл. Выводит на экран информацию о поезде по номеру. Программа с использованием подпрограмм.
Возможно кому-то поможет в решении своих задачь текст этой программы.
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
#include <conio.h>
#include <iostream.h>
#include <iomanip.h>
#include <fstream.h>
#include <string.h>
#include <ctype.h>
struct TRAIN{
        char punkt[20];
        int nomb;
        float time;
    };
int vvod(struct TRAIN pp[10]);
int vivod(struct TRAIN pp[10]);
int per(struct TRAIN pp[10]);
int nom(struct TRAIN pp[10]);
int main()
{   clrscr();
    int i,j,k;
    char name[20];
    cout<<"vv-te ima faila dla sozdania  -> ";
    cin>>name;
    fstream f(name, ios::app|ios::in|ios::beg);
    TRAIN tr[10];
    vvod(tr);
    per(tr);
    for(i=0;i<4;i++)
    {
        f<<tr[i].punkt;
        f<<'\n';
        f<<tr[i].nomb;
        f<<tr[i].time;
        f<<'\n';
    }
    cout<<"zapisanie struct-i "<<endl;
    nom(tr);
    for(i=0;i<4;i++)
    {
        while (!f.eof())
        {
            f.getline(tr[i].punkt,10);
        }
        cout<<tr[i].punkt<<"   "<<endl;
        f>>tr[i].nomb;
        cout<<tr[i].nomb<<"   "<<endl;
        f>>tr[i].time;
        cout<<tr[i].time<<"   "<<endl;
    }
 
    vivod(tr);
    getch();
    return (0);
}
 
    int vvod(struct TRAIN pp[10]){
        int i=0;
        for(i=0;i<4;i++)
    {
        cout<<"vv-te nazvanie puncta naznachenia  -> ";
        cin>>pp[i].punkt;
        cout<<"vv-te nomer poezda  ->  ";
        cin>>pp[i].nomb;
        cout<<"vvedite vrema otpravlenia    ->  ";
        cin>>pp[i].time;
    }
    getch();
    return(0);
    }
    int per(struct TRAIN pp[10]){
    int i=0,j=0;
    for(j=0;j<4;j++)
    {
        for(i=0;i<3;i++)
        if (pp[i].nomb>pp[i+1].nomb)
        {
               pp[8].nomb=pp[i].nomb;
               pp[7].nomb=pp[i+1].nomb;
               pp[i].nomb=pp[7].nomb;
               pp[i+1].nomb=pp[8].nomb;
               pp[8].time=pp[i].time;
               pp[7].time=pp[i+1].time;
               pp[i].time=pp[7].time;
               pp[i+1].time=pp[8].time;
               strcpy(pp[8].punkt,pp[i].punkt);
               strcpy(pp[7].punkt,pp[i+1].punkt);
               strset(pp[i].punkt,' ');
               strset(pp[i+1].punkt,' ');
               strcpy(pp[i].punkt,pp[7].punkt);
               strcpy(pp[i+1].punkt,pp[8].punkt);
        }
    }
    getch();
    return(0);
    }
 
    int vivod(struct TRAIN pp[10]){
    int i=0;
    for(i=0;i<4;i++)
        cout<<pp[i].punkt<<"    "<<pp[i].nomb<<"   "<<pp[i].time<<endl;
    getch();
    return(0);
    }
 
    int nom(struct TRAIN pp[10]){
    int k=0,i=0;
    cout<<"vv-te nomer poesda inf-u o kotorom vivesty   ->  ";
    cin>>pp[10].nomb;
    for(i=0;i<4;i++)
        if (pp[i].nomb==pp[10].nomb)
        {
            k=5;
            cout<<pp[i].punkt<<"    "<<pp[i].nomb<<"   "<<pp[i].time<<endl;
        }
    if (k==0)
    cout<<"takix poezdov net "<<endl;
    getch();
    return(0);
    }
necto
5 / 4 / 1
Регистрация: 27.01.2009
Сообщений: 30
09.02.2009, 23:05  [ТС]     Запись структуры в файл. #4
Есть еще одна вещь, так как программа дорабатывается и усложняется(не знаю что еще придется доделать), есть вопрос про внос в подпрограммы работу с файлами.
Я не могу найти причину, но занесение в файлы из подпрограмм сделано не до конца корректно. Некоторые операции (например приведенная ниже) информацию из файла судя по всему не считывают, и не записывают.
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
    int per(struct TRAIN pp[10],char ima[20]){
    int i=0,j=0;
    fstream f(ima, ios::app|ios::in|ios::beg);
    clrscr();
    for(i=0;i<4;i++)
    {
        while (!f.eof()){
        f.getline(pp[i].punkt,10);
        }
        f>>pp[i].nomb;
        f>>pp[i].time;
    }
 
    for(j=0;j<4;j++)
    {
        for(i=0;i<3;i++)
        if (pp[i].nomb>pp[i+1].nomb)
        {
               pp[8].nomb=pp[i].nomb;
               pp[7].nomb=pp[i+1].nomb;
               pp[i].nomb=pp[7].nomb;
               pp[i+1].nomb=pp[8].nomb;
               pp[8].time=pp[i].time;
               pp[7].time=pp[i+1].time;
               pp[i].time=pp[7].time;
               pp[i+1].time=pp[8].time;
               strcpy(pp[8].punkt,pp[i].punkt);
               strcpy(pp[7].punkt,pp[i+1].punkt);
               strset(pp[i].punkt,' ');
               strset(pp[i+1].punkt,' ');
               strcpy(pp[i].punkt,pp[7].punkt);
               strcpy(pp[i+1].punkt,pp[8].punkt);
                f<<pp[i].punkt;
                f<<'\n';
                f<<pp[i].nomb;
                f<<pp[i].time;
                f<<'\n';
        }
    }
    f.close();
    getch();
    return(0);
    }
Мне нужна подсказка в чем может быть ошибка, или совет как можно тестировать вывод из файла...
XuTPbIu_MuHTAu
Эксперт C++
2221 / 736 / 10
Регистрация: 27.05.2008
Сообщений: 1,508
09.02.2009, 23:21     Запись структуры в файл. #5
в коде разбираться совершенно не хочется,заметил только,что в 14-й строке ты объявляешь цикл по j от 0 до 4, при этом эту j нигде не используешь,т.е 4 раза делаешь одно и то же...

общая рекомендация - используй отладчик.
necto
5 / 4 / 1
Регистрация: 27.01.2009
Сообщений: 30
10.02.2009, 15:17  [ТС]     Запись структуры в файл. #6
Эту проблему я решил. Ошибка была в том, что структуры пишутся и читаются так:
Режим открытия бинарный(ios::binary).
C++
1
fstream f(ima, ios::app|ios::beg|ios::trunc|ios::binary);
Дли записи:
C++
1
f.write((char *)&pp[i],sizeof(TRAIN));
Для чтения:
C++
1
f.read((char *)&pp[i],sizeof(TRAIN));
necto
5 / 4 / 1
Регистрация: 27.01.2009
Сообщений: 30
12.02.2009, 16:30  [ТС]     Запись структуры в файл. #7
Итог(программа закончена). Добавилось графическое (слишком сильно сказано конечно)меню, 2 функции(дозапись структуры, замена любого поля выбранной структуры), особое спасибо XuTPbIu_MuHTAu, за отклик(кто знает что бы было и насколько бы дольше я писал эту программу)
В приведенном тексте только меню и 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
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
#include <conio.h>
#include <iostream.h>
#include <iomanip.h>
#include <fstream.h>
#include <string.h>
#include <ctype.h>
#include <io.h>
struct TRAIN{
        char punkt[20];
        int nomb;
        float time;
        };
int vvod(struct TRAIN pp[10],char ima[20]);
int vivod(struct TRAIN pp[10],char ima[20]);
int per(struct TRAIN pp[10],char ima[20]);
int nom(struct TRAIN pp[10],char ima[20]);
int doz(struct TRAIN pp[10],char ima[20]);
int zam(struct TRAIN pp[10],char ima[20]);
int main()
{   clrscr();
    int h,z,k,SS=0,vib;
    char name[20];
    TRAIN tr[10];
    cout<<"vv-te ima faila s -> ";
    cin>>name;
    h=1;
    vib=getch();
    z=1;
    while (2!=3){
        vib=21; h=1; z=1;
        while (vib!=13){
            clrscr();
            textbackground(0);
            clrscr();
            window(5,5,40,12);
            textbackground(6);
            textcolor(15);
            clrscr();
                  gotoxy(1,1);
                  cout<<"1-vvod       "<<endl;
                  gotoxy(1,2);
                  cout<<"2-vivod      "<<endl;
                  gotoxy(1,3);
                  cout<<"3-perest     "<<endl;
                  gotoxy(1,4);
                  cout<<"4-izbir vivd "<<endl;
                  gotoxy(1,5);
                  cout<<"5-dozapis    "<<endl;
                  gotoxy(1,6);
                  cout<<"6-zamena     "<<endl;
                  gotoxy(1,7);
                  cout<<"7-exit       "<<endl;
                      switch(z){
                        case 1:{ gotoxy(1,1); textcolor(4);  cprintf("  1-vvod       "); cout<<endl; break;}
                        case 2:{ gotoxy(1,2); textcolor(4);  cprintf("  2-vivod      "); cout<<endl; break;}
                        case 3:{ gotoxy(1,3); textcolor(4);  cprintf("  3-perest     "); cout<<endl; break;}
                        case 4:{ gotoxy(1,4); textcolor(4);  cprintf("  4-izbir vivd "); cout<<endl; break;}
                        case 5:{ gotoxy(1,5); textcolor(4);  cprintf("  5-dozapis    "); cout<<endl; break;}
                        case 6:{ gotoxy(1,6); textcolor(4);  cprintf("  6-zamena     "); cout<<endl; break;}
                        case 7:{ gotoxy(1,7); textcolor(4);  cprintf("  7-exit       "); cout<<endl; break;}
                       }
            vib=getch();
            if ((h<7)&(vib==80)){
                h=h+1; z=h;
            }
            else if ((h==7)&(vib==72)){
                h=1;   z=h;
            }
            else if ((h>1)&(vib==72)){
                h=h-1; z=h;
            }
            else if ((h==1)&(vib==80)){
                h=7;    z=h;
            }
        }
        switch(h){
            case 1:{ vvod(tr,name); break;}
            case 2:{ vivod(tr,name); break;}
            case 3:{ per(tr,name); break;}
            case 4:{ nom(tr,name); break;}
            case 5:{ doz(tr,name); break;}
            case 6:{ zam(tr,name); break;}
            case 7:{ return(0); }
         }
    }
    getch();
    return(0);
}
Добавление записи:
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
int doz(struct TRAIN pp[10],char ima[20]){
        fstream f(ima, ios::end|ios::app|ios::binary);
        int i=0,p=0,n=0;
        window(1,1,80,25);
        clrscr();
        textcolor(15);
        textbackground(0);
        clrscr();
        cout<<"dobav zapis? esli da nazmite 1 -> "<<endl;
        cin>>p;
        if(p==1)
        {
            long gg;
            f.seekp(0,ios::end);
            gg=f.tellp();
            n=gg/sizeof(TRAIN);
            for(i=n;i<(n+1);i++)
            {
                cout<<"vv-te nazvanie puncta naznachenia  -> ";
                cin>>pp[i].punkt;
                cout<<"vv-te nomer poezda  ->  ";
                cin>>pp[i].nomb;
                cout<<"vvedite vrema otpravlenia    ->  ";
                cin>>pp[i].time;
                f.write((char *)&pp[i],sizeof(TRAIN));
            }
    cout<<"zapis dobavlena "<<endl;
    }
    f.close();
    getch();
    return(0);
    }
И замена одного из полей записи.
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
int zam(struct TRAIN pp[10],char ima[20]){
    int k=0,i=0,n,l=0;
    fstream f(ima, ios::app|ios::in|ios::beg|ios::binary);
    clrscr();
    window(1,1,80,25);
    clrscr();
    textcolor(15);
    textbackground(0);
    clrscr();
    long int gg;
    f.seekg(0,ios::end);
    gg=f.tellg();
    n=gg/sizeof(TRAIN);
    cout<<"vv-te nomer poesda inf-u o kotorom zamenit   ->  ";
    cin>>pp[10].nomb;
    for(i=0;i<n;i++)
    {
        f.read((char *)&pp[i],sizeof(TRAIN));
    }
 
    for(i=0;i<n;i++)
        if (pp[i].nomb==pp[10].nomb)
        {
            k=5;
            cout<<pp[i].punkt<<"    "<<pp[i].nomb<<"   "<<pp[i].time<<endl;
            cout<<"vv-te chto zamn: 1 -punkt naz; 2 -nomer poezda; 3 -vrema otp. -> ";
            cin>>l;
            if (l==1){
                cout<<"vv-te nazvanie puncta naznachenia  -> ";
                cin>>pp[i].punkt;
            }
            else if (l==2){
                cout<<"vv-te nomer poezda  ->  ";
                cin>>pp[i].nomb;
            }
            else if (l==3){
                cout<<"vvedite vrema otpravlenia    ->  ";
                cin>>pp[i].time;
            }
                f.write((char *)&pp[i],sizeof(TRAIN));
        }
    if (k==0){
    cout<<"takix poezdov net "<<endl;}
    f.close();
    getch();
    return(0);
    }
M1H@L
2 / 2 / 0
Регистрация: 30.11.2010
Сообщений: 62
30.11.2010, 00:38     Запись структуры в файл. #8
пожалста помоги necto напиши как прильно сделать пойск у структурі єслі елемент string а на елий тип я уже сделал (пример любой програми)

Добавлено через 46 секунд
necto, пожалста помоги necto напиши как прильно сделать пойск у структурі єслі елемент string а на елий тип я уже сделал (пример любой програми)
stasy liv
0 / 0 / 0
Регистрация: 04.12.2010
Сообщений: 8
18.03.2011, 22:25     Запись структуры в файл. #9
ребята помогите пожалуйста сделать задание по экономической информатике...тут вроде блок схему нужно построить)
. Структура записей файла PEREVOZKA

п.п Наименование поля записи Идентификатор поля Тип Длина
1.Номер путевого листа NomPutList N 7
2.Пункт доставки PunktDost C 25
3.Дата выезда DataViezd C 10
4.Фамилия водителя FIO_Vodit C 25
5.Расход бензина на 1 км RashBenzin N 5.2
6.Расстояние до пункта доставки (в км) RasstPunkt N 6.2

Записи файла упорядочены по реквизитам 2 (2 и 3)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.03.2011, 23:51     Запись структуры в файл.
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
M1H@L
2 / 2 / 0
Регистрация: 30.11.2010
Сообщений: 62
31.03.2011, 23:51     Запись структуры в файл. #10
я уже разабралса.
Yandex
Объявления
31.03.2011, 23:51     Запись структуры в файл.
Ответ Создать тему
Опции темы

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