Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Kolya_sp
0 / 0 / 0
Регистрация: 23.11.2016
Сообщений: 20
1

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

18.05.2017, 18:57. Просмотров 862. Ответов 13
Метки с++ (Все метки)

Доброго всем времени суток.
Обращаюсь к вам с таким вопросом :
Взяв за основу Задача 2 Лабораторной работы изменить код программы таким образом, чтобы:
- входные данные (поля структуры) вводятся с клавиатуры и после введения записывались в файл (отдельная функция);
- программа имеет возможность дописывать данные в файл (отдельная функция);
- данные из файла выводятся на экран (отдельная функция);
- результаты выполнения второго подпункта выводятся и на экран, и в файл.
Само задание лабораторной
Описать структуру с именем TRAIN, содержащую поля: NAZV - название пункта назначения; NUMR - номер поезда; DATE, TIME - дата и время отправления. Написать программу, отдельными функциями выполняет действия
- ввод с клавиатуры данных в массив RASP, состоящий из N переменных типа 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
#include <iostream>
#include <math.h>
#include <clocale>
#include <cstdlib>
#include <time.h>
#include <cstring>
#include <conio.h>
#include <fstream>
using namespace std;
 
struct TRAIN 
    {char NAZV[30];
    int NUMR;
    int DATA;
    string TIME;
    };
    void vivod(TRAIN *rasp,int e)
{cout<<"Введите дату и время отправления"<<endl;
int date;string chas;
cin>>date>>chas;
ifstream cv("vokzal.bat",ios_base::out);
 
 
for(int i=0;i<e;i++)
    {if((rasp[i].DATA==date)&&(rasp[i].TIME==chas))
    {   cout << "Пункт назначения   "<<rasp[i].NAZV<< "   Номер поезда:  "<<rasp[i].NUMR<< "   День отправления   "<<rasp[i].DATA<<"   Время отправления   "<<rasp[i].TIME <<endl;
    }
    }cv.close();
}
    void vvod(TRAIN *rasp,int e)
{ofstream vv("vokzal.bat");
for(int i=0;i<e;i++)
{//system("cls");
cout << "Пункт назначения:"<<endl;
cin>>rasp[i].NAZV;
vv<<rasp[i].NAZV<<endl;
cout << "Номер поезда:"<<endl;
cin>>rasp[i].NUMR;
vv<<rasp[i].NUMR<<endl;
cout << "День отправления(1-31) :"<<endl;
cin>>rasp[i].DATA;
vv<<rasp[i].DATA<<endl;
cout << "Время отправления:" <<endl;
cin>>rasp[i].TIME;
vv<<rasp[i].TIME<<endl;
}
vv.close();
 
}
void dod(TRAIN *rasp,int e)
{int i;
ofstream vv("vokzal.bat",ios_base::app);
 
for(i=0;i<e;i++)
{
cout << "Пункт назначения:"<<endl;
cin>>rasp[i].NAZV;
vv<<rasp[i].NAZV<<endl;
cout << "Номер поезда:"<<endl;
cin>>rasp[i].NUMR;
vv<<rasp[i].NUMR<<endl;
cout << "День отправления (1-31):"<<endl;
cin>>rasp[i].DATA;
vv<<rasp[i].DATA<<endl;
cout << "Время отправления:" <<endl;
cin>>rasp[i].TIME;
vv<<rasp[i].TIME<<endl;
 
}
vv.close();
 
}
 
int main()
{setlocale(LC_CTYPE, "rus");
 
int n,b,c,v;
setlocale(LC_CTYPE, "rus");
 
cout<<"количество записей"<<endl;
cin>>n;
TRAIN rasp[n];
vvod(rasp,n);
pov:
cout<<"Хотите добавить данные или осуществить поиск? "<<"1: Данные 2: Поиск 3: Нет (закончить программу) "<<endl;cin>>b;
if(b==1)
    {
    cout<<"Сколько записей добавить  "<<endl;
    cin>>v;
    с=n+v;
    dod(rasp,c);
    n=n+v;
    
    goto pov;
    }
if(b==2)vivod(rasp,n);
    else exit;
system("pause");
    return 0;}
Так , а теперь суть интересует меня вот этот вопрос программа имеет возможность дописывать данные в файл (отдельная функция);
Вы можете увидеть что у меня при запуске программы запрашивает количество вводимых записей (n),потом идет вызов процедуры в которой
я начинаю записывать свои данные , за ней вопрос поиск или добавить данные, если выбрать добавить данные то вводим кол-во записей в,
при этом переменной с будет присвоено кол-во записей которое мы ввели раньше + сейчас.
Мы переходим в процедуру , в ней начинаем цикл , с 0(i=0) и до n,
но вот незадачка мы будем записывать не количество записей которое ввели в основном теле программы а (v+n);Логические действия мы меняем i на значение n.
Теперь по идеи нам должно в файл дописать данные начиная с последнего, но программа прерывает свою роботу как только доходит до конца цикла.
А если начать до запись с i=0. то нам перезапишет то что мы ввели в начале программы и при поиске
выдаст только последние введение данные , хоть в файле они у нас останутся.

Думаю суть проблемы я изложил .Буду очень благодарен за советы.
А теперь 3 святых ППП.
PS"Подскажите Поправьте Помогите"
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2017, 18:57
Ответы с готовыми решениями:

Запись структур в файл
Здравствуйте! Имеется структура struct user { char login; char password;...

Запись структур в файл
У меня есть файл и масив структур. Надо реализовать запись и чтения файла....

Запись структур в файл
можно ли сделать так что бы структуру base, которую нужно записать несколько...

Запись классов, структур в файл
Подскажите как правильно, записывать и читать данные с файла, особенно если...

Запись в файл структур(с указателем)
Добрый день, подскажите, как корректно записать и прочитать в файл структуру,...

13
nmcf
6406 / 5667 / 2581
Регистрация: 14.04.2014
Сообщений: 23,978
18.05.2017, 19:15 2
Ну так передавай туда два параметра - текущий размер и сколько добавлять.
0
Kolya_sp
0 / 0 / 0
Регистрация: 23.11.2016
Сообщений: 20
18.05.2017, 23:40  [ТС] 3
Или я плохо написал или вы что то не дочитали:
Когда i<>0 то процедура не работает ,
а когда i=0 то оно перезаписывает введенные раньше данные,хотя с файла они не удаляются.

так вопрос как сделать чтоб оно именно додавало в файл и можно было прочитать и вывести на экран?.
0
nmcf
6406 / 5667 / 2581
Регистрация: 14.04.2014
Сообщений: 23,978
19.05.2017, 09:51 4
Ты плохо читал. Два параметра, и цикл начинать не с нуля, а с n, если там было n элементов, до n + v.
0
MrGluck
19.05.2017, 09:59
  #5
 Комментарий модератора 
Kolya_sp, мы тут не слепые. Не нужно увеличивать размер или менять цвет. Для выделения можете использовать жирный, курсивный и подчёркнутый текст. Но не по всему абзацу.
0
Kolya_sp
0 / 0 / 0
Регистрация: 23.11.2016
Сообщений: 20
19.05.2017, 11:34  [ТС] 6
Цитата Сообщение от nmcf Посмотреть сообщение
Ты плохо читал. Два параметра, и цикл начинать не с нуля, а с n, если там было n элементов, до n + v.
Ви пробивали запустить программу подставив эти данные?Я пробывал и в итоге в процедуру она входит,начинается запись,а потом на последнем елементе запись программа посто останавливается
0
nmcf
6406 / 5667 / 2581
Регистрация: 14.04.2014
Сообщений: 23,978
19.05.2017, 12:37 7
Программу показывай.
0
Kolya_sp
0 / 0 / 0
Регистрация: 23.11.2016
Сообщений: 20
19.05.2017, 14:24  [ТС] 8
а в шапке разве не программа?)
0
nmcf
6406 / 5667 / 2581
Регистрация: 14.04.2014
Сообщений: 23,978
19.05.2017, 18:19 9
Вариант с исправлениями.
0
Kolya_sp
0 / 0 / 0
Регистрация: 23.11.2016
Сообщений: 20
19.05.2017, 22:37  [ТС] 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
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
#include <iostream>
#include <math.h>
#include <clocale>
#include <cstdlib>
#include <time.h>
#include <cstring>
#include <conio.h>
#include <fstream>
using namespace std;
 
struct TRAIN 
    {char NAZV[30];
    int NUMR;
    int DATA;
    string TIME;
    };
    void vivod(TRAIN *rasp,int e)
{cout<<"Введите дату и время отправления"<<endl;
int date;string chas;
cin>>date>>chas;
ifstream cv("vokzal.bat",ios_base::out);
 
 
for(int i=0;i<e;i++)
    {if((rasp[i].DATA==date)&&(rasp[i].TIME==chas))
    {   cout << "Пункт назначения   "<<rasp[i].NAZV<< "   Номер поезда:  "<<rasp[i].NUMR<< "   День отправления   "<<rasp[i].DATA<<"   Время отправления   "<<rasp[i].TIME <<endl;
    }
    }cv.close();
}
    void vvod(TRAIN *rasp,int e)
{ofstream vv("vokzal.bat");
for(int i=0;i<e;i++)
{//system("cls");
cout << "Пункт назначения:"<<endl;
cin>>rasp[i].NAZV;
vv<<rasp[i].NAZV<<endl;
cout << "Номер поезда:"<<endl;
cin>>rasp[i].NUMR;
vv<<rasp[i].NUMR<<endl;
cout << "День отправления(1-31) :"<<endl;
cin>>rasp[i].DATA;
vv<<rasp[i].DATA<<endl;
cout << "Время отправления:" <<endl;
cin>>rasp[i].TIME;
vv<<rasp[i].TIME<<endl;
}
vv.close();
 
}
void dod(TRAIN *rasp,int e,int m)
{int i;
ofstream vv("vokzal.bat",ios_base::app);
 
for(i=m;i<e;i++)
{
cout << "Пункт назначения:"<<endl;
cin>>rasp[i].NAZV;
vv<<rasp[i].NAZV<<endl;
cout << "Номер поезда:"<<endl;
cin>>rasp[i].NUMR;
vv<<rasp[i].NUMR<<endl;
cout << "День отправления (1-31):"<<endl;
cin>>rasp[i].DATA;
vv<<rasp[i].DATA<<endl;
cout << "Время отправления:" <<endl;
cin>>rasp[i].TIME;
vv<<rasp[i].TIME<<endl;
 
}
vv.close();
 
}
 
int main()
{setlocale(LC_CTYPE, "rus");
 
int n,b,c,v;
setlocale(LC_CTYPE, "rus");
 
cout<<"количество записей"<<endl;
cin>>n;
TRAIN rasp[n];
vvod(rasp,n);
pov:
cout<<"Хотите добавить данные или осуществить поиск? "<<"1: Данные 2: Поиск 3: Нет (закончить программу) "<<endl;cin>>b;
if(b==1)
    {
    cout<<"Сколько записей добавить  "<<endl;
    cin>>v;
    с=n+v;
    dod(rasp,c,n);
    n=n+v;
    
    goto pov;
    }
if(b==2)vivod(rasp,n);
    else exit;
system("pause");
    return 0;}
0
nmcf
6406 / 5667 / 2581
Регистрация: 14.04.2014
Сообщений: 23,978
19.05.2017, 23:04 11
У тебя ещё и места в массиве нет. Делай с new и последующим перевыделением.
0
Kolya_sp
0 / 0 / 0
Регистрация: 23.11.2016
Сообщений: 20
19.05.2017, 23:08  [ТС] 12
Вы могли бы поправить программу ,написать как именно это должно виглядеть?
0
nmcf
6406 / 5667 / 2581
Регистрация: 14.04.2014
Сообщений: 23,978
20.05.2017, 08:31 13
Лучший ответ Сообщение было отмечено Kolya_sp как решение

Решение

C++
1
2
3
cout<<"количество записей"<<endl;
cin>>n;
TRAIN *rasp = new TRAIN[n];
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 dod(TRAIN *& rasp,int e,int m)
{int i;
 
TRAIN rasp1 = new TRAIN[e];
std::copy(rasp, rasp + m, rasp1);
delete[] rasp;
rasp = rasp1;
 
ofstream vv("vokzal.bat",ios_base::app);
 
for(i=m;i<e;i++)
{
cout << "Пункт назначения:"<<endl;
cin>>rasp[i].NAZV;
vv<<rasp[i].NAZV<<endl;
cout << "Номер поезда:"<<endl;
cin>>rasp[i].NUMR;
vv<<rasp[i].NUMR<<endl;
cout << "День отправления (1-31):"<<endl;
cin>>rasp[i].DATA;
vv<<rasp[i].DATA<<endl;
cout << "Время отправления:" <<endl;
cin>>rasp[i].TIME;
vv<<rasp[i].TIME<<endl;
 
}
vv.close();
 
}
В конце программы - удалить.
1
Kolya_sp
0 / 0 / 0
Регистрация: 23.11.2016
Сообщений: 20
20.05.2017, 15:02  [ТС] 14
Большое спасибо,очень помог)
0
20.05.2017, 15:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2017, 15:02

Запись массива структур в файл
Запись массива структур в файл так, что бы потом можно было считывать, удалять...

Запись массива структур в бинарный файл
Одно из полей структуры типа String, нужно записать массив структур в бинарный...

Запись в файл некоторого количества структур
Надо записать в файл некоторое количество записей, не используя массивов. Знаю...


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

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

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