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

Структура "ФИО": считать из файла, добавить запись

21.10.2014, 18:22. Показов 2904. Ответов 15
Метки нет (Все метки)

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
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <io.h>
#include <fcntl.h>
#include <dos.h>
#include <process.h>
#include <errno.h>
#include <iostream.h>
#include <fstream.h>
struct data
{char fio[20];
int nomer,inf,inmov,math,fiz;
};
data a;
int l;
 void readdb()
{
char *t="";
ifstream f;
f.open("3-011.txt");
int o=0;
while (!f.eof())
{
f.getline(a[o].fio,30,' ');
f.getline(t,4,' ');
a[o].nomer=atoi(t);
f.getline(t,3,' ');
a[o].inf=atoi(t);
f.getline(t,3,' ');
a[o].inmov=atoi(t);
f.getline(t,3,' ');
a[o].math=atoi(t);
f.getline(t,3);
a[o].fiz=atoi(t);
o++;
}
l=o;
}
 
void vivod()
{
for (int i=0;i<l;i++)
cout<<a[i].fio<<" "<<a[i].nomer<<" "<<a[i].inf<<" "<<a[i].inmov<<" "<<a[i].math<<" "<<a[i].fiz<<endl;
}
 
 
 
void main()
{int i;
while (i!=0)
{clrscr();
cout<<"1.Otkrit bazu"<<endl;
cout<<"2.Dobavit zapis"<<endl;
cin>>i;
switch (i)
{case 1:readdb();vivod();
default:cout<<"nety takoy cifri"<<endl;
}
}
 
 
}
в строках обращения к структуре в процедуре readdb ошибка везде illegal structure operation.
f.getline(a[o].fio,30,' '); в этой строке ошибка could not find a match 'istream::getline(undefined,int,char)';
как их убрать?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.10.2014, 18:22
Ответы с готовыми решениями:

Структура «Преподаватель» с полями "ФИО", "стаж", "категория", "нагрузка"
Функция - расчёт зарплаты по нагрузке и оплате часа для определенной категории. Категория Оплата...

Считать с файла информацию о команде "Название" "Город", количество побед, поражений, ничьих, забитых и пропущенных мячей
Здравствуйте. Необходимо написать программу С++ : &quot;Считать с файла информацию о команде...

Определить тип данных "Запись", имеющий поля "Фамилия", "Пол", "Зарплата"
определить тип данных запись имеющий поля фамилия пол зарплата. определить массив из 10 записей. в...

Функции и файлы. Чтение и запись данных в файл. Структура "Ноутбук"
Приветствую. Помогите, пожалуйста, с программой. Для хранения данных о ноутбуках описать...

15
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
21.10.2014, 18:26 2
Ты обращаешься к структуре как к массиву.
1
Модератор
Эксперт С++
12069 / 9753 / 5897
Регистрация: 18.12.2011
Сообщений: 26,180
21.10.2014, 18:42 3
1. a -массив
C++
1
data a[100];
2. В main() надо инициализировать i
C++
1
int i=1;
1
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 37
21.10.2014, 19:04  [ТС] 4
спс.Теперь она запускается, но после нажатия на 1 выдает ошибку и закрывается.Файл с данными создан.

Добавлено через 11 минут
всё, разобрался.Всем спс!
0
С чаем беда...
Эксперт CЭксперт С++
9976 / 5330 / 1459
Регистрация: 18.10.2014
Сообщений: 12,817
21.10.2014, 19:41 5
Пока, похоже, плохо разобрался.

Во-первых, заголовки стандартной библиотеки языка С++ не имеют расширения .h. Т.е. нет никакого <string.h> и <iostream.h>. Неужели это так трудно запомнить? За шестнадцадь-то лет стандартизованного С++.

Во-вторых, циклы вида 'while (!f.eof())' - это в 99% случаев - неправильный код.

В-третьих, 'int main', а не 'void main'
0
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 37
21.10.2014, 21:05  [ТС] 6
пишу в borland c++.Вся эта штука в нем работает нормально.
0
С чаем беда...
Эксперт CЭксперт С++
9976 / 5330 / 1459
Регистрация: 18.10.2014
Сообщений: 12,817
21.10.2014, 21:13 7
Цитата Сообщение от Terrorblade Посмотреть сообщение
пишу в borland c++.Вся эта штука в нем работает нормально.
То, что что-то где-то "работает нормально" - это не повод это что-то использовать, не говоря уже о том, что такое "работает нормально" - это не более чем иллюзия, вызванная недостаточным тестированием кода.

Последнее особенно относится к циклам с предусловием '!f.eof()'.
0
Модератор
Эксперт С++
12069 / 9753 / 5897
Регистрация: 18.12.2011
Сообщений: 26,180
21.10.2014, 22:07 8
TheCalligrapher, В старых версиях не было пространства имен std.
И не было заголовочных файлов без .h
0
С чаем беда...
Эксперт CЭксперт С++
9976 / 5330 / 1459
Регистрация: 18.10.2014
Сообщений: 12,817
21.10.2014, 22:21 9
Цитата Сообщение от zss Посмотреть сообщение
TheCalligrapher, В старых версиях не было пространства имен std.
И не было заголовочных файлов без .h
Я знаю. Но язык С++ был стандартизован в 1998 году. То, что старые версии компиляторов какое-то время тащили за собой до-стандартные реализации библиотеки - это совсем не повод пользоваться этим динозаврами. Ну еще в 1999 году можно было. Но уже ж 2014 на дворе.
0
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
21.10.2014, 22:33 10
Здесь нужна локальная структура и файл закрывать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void dobavit()
{l++;
 
data a;
 
cin>>a.fio;
cin>>a.nomer;
cin>>a.inf;
cin>>a.inmov;
cin>>a.math;
cin>>a.fiz;
ofstream f;
f.open("3011.txt",ios::app);
f<<endl;
f<<a.fio<<" "<<a.nomer<<" "<<a.inf<<" "<<a.inmov<<" "<<a.math<<" "<<a.fiz;
 
f.close();
 
cout<<"Zapis dbavlena!";
getch();
}
А для чего l я вообще не пойму.
0
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 37
22.10.2014, 23:20  [ТС] 11
 Комментарий модератора 
Зачем плодите новые темы?

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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <io.h>
#include <fcntl.h>
#include <dos.h>
#include <process.h>
#include <errno.h>
#include <iostream.h>
#include <fstream.h>
#include <iomanip.h>
struct data
{char fio[20];
int nomer;
int inf;
int inmov;
int math;
int fiz;
};
data a[100],temp[100];
int l;
char db[20];
 
 
 
 
 
void readdb(char db[20])
{
char t[20];
ifstream f;
f.open(db,ios::in);
int o=0;
while (!f.eof())
{
f.getline(a[o].fio,20,' ');
f.getline(t,4,' ');
a[o].nomer=atoi(t);
f.getline(t,3,' ');
a[o].inf=atoi(t);
f.getline(t,3,' ');
a[o].inmov=atoi(t);
f.getline(t,3,' ');
a[o].math=atoi(t);
f.getline(t,3);
a[o].fiz=atoi(t);
o++;}
l=o;
f.close();
}
 
void vivod()
{
cout<<setw(20)<<"ÔÈÎ"<<setw(10)<<"ÍÎÌÅÐ"<<setw(10)<<"ÈÍÔÎÐÌ."<<setw(10)<<"ÈÍ.ßÇ."<<setw(10)<<"ÌÀÒÅÌ"<<setw(10)<<"ÔÈÇ."<<endl;
for (int i=0;i<l;i++)
cout<<setw(20)<<a[i].fio<<setw(10)<<a[i].nomer<<setw(10)<<a[i].inf<<setw(10)<<a[i].inmov<<setw(10)<<a[i].math<<setw(10)<<a[i].fiz<<endl;
}
 
void add(char db[20])
{char a[20];
int nomer,inf,inmov,math,fiz;
cout<<"Ââåäèòå ôàìèëèþ"<<endl;
cin>>a;
cout<<"Ââåäèòå íîìåð"<<endl;
cin>>nomer;
cout<<"Ââåäèòå îöåíêó ïî èíôîðìàòèêå"<<endl;
cin>>inf;
cout<<"Ââåäèòå îöåíêó ïî Èí.ßç."<<endl;
cin>>inmov;
cout<<"Ââåäèòå îöåíêó ïî ìàòåìàòèêå"<<endl;
cin>>math;
cout<<"Ââåäèòå îöåíêó ïî ôèçèêå"<<endl;
cin>>fiz;
ofstream f;
f.open(db,ios::app);
 
f<<a<<" "<<nomer<<" "<<inf<<" "<<inmov<<" "<<math<<" "<<fiz;
f.close();
 
}
void create()
{char e[20];
int i;
cout<<"Ââåäèòå íàçâàíèå íîâîé áä"<<endl;
cin>>e;
ofstream f;
f.open(e);
cout<<"Èñïîëüçîâàòü å¸ ñåé÷àñ?"<<endl;
cout<<"1.ÄÀ"<<endl;
cout<<"2.ÍÅÒ"<<endl;
cin>>i;
if (i==1) strcpy(db,e);
 }
 
void sortirovka(char db[20])
{
readdb(db);
ofstream f;
f.open(db);
for (int i=0;i<l;++i)
for (int j=i+1;j<l;++j)
if (a[i].nomer>a[j].nomer)
{strcpy(temp[0].fio,a[i].fio);
temp[0].nomer=a[i].nomer;
temp[0].inf=a[i].inf;
temp[0].inmov=a[i].inmov;
temp[0].math=a[i].math;
temp[0].fiz=a[i].fiz;
 
strcpy(a[i].fio,a[j].fio);
a[i].nomer=a[j].nomer;
a[i].inf=a[j].inf;
a[i].inmov=a[j].inmov;
a[i].math=a[j].math;
a[i].fiz=a[j].fiz;
 
strcpy(a[j].fio,temp[0].fio);
a[j].nomer=temp[0].nomer;
a[j].inf=temp[0].inf;
a[j].inmov=temp[0].inmov;
a[j].math=temp[0].math;
a[j].fiz=temp[0].fiz;
}
 
for(int i=0;i<l-1;i++)
f<<a[i].fio<<" "<<a[i].nomer<<" "<<a[i].inf<<" "<<a[i].inmov<<" "<<a[i].math<<" "<<a[i].fiz<<endl;
f<<a[l-1].fio<<" "<<a[l-1].nomer<<" "<<a[l-1].inf<<" "<<a[l-1].inmov<<" "<<a[l-1].math<<" "<<a[l-1].fiz;
 
}
 
void deleting(char db[20])
{int nomer;
readdb(db);
ofstream f;
f.open(db);
cout<<"Êàêîé íîìåð óäàëèòü?"<<endl;
cin>>nomer;
for (int i=0;i<l-1;i++)
if (a[i].nomer!=nomer)
f<<a[i].fio<<" "<<a[i].nomer<<" "<<a[i].inf<<" "<<a[i].inmov<<" "<<a[i].math<<" "<<a[i].fiz<<endl;
f<<a[l-1].fio<<" "<<a[l-1].nomer<<" "<<a[l-1].inf<<" "<<a[l-1].inmov<<" "<<a[l-1].math<<" "<<a[l-1].fiz;
 f.close();
 
}
 
 
 
 
 
int main()
{int i=0;
cout<<"Ââåäèòå íàçâàíèå áä â ôîðìàòå ****.txt"<<endl;
cin>>db;
 
do
{
readdb(db);
sortirovka(db);
clrscr();
cout<<"1.Âûâåñòè áàçó"<<endl;
cout<<"2.Äîáàâèòü çàïèñü"<<endl;
cout<<"3.Ïåðåêë. íà äðóãóþ áä"<<endl;
cout<<"4.Ñîçäàòü ÁÄ"<<endl;
cout<<"5.Óäàëèòü çàïèñü"<<endl;
cin>>i;
switch(i)
{
case 1:clrscr();vivod();getch();break;
case 2:clrscr();add(db);break;
case 3:clrscr();cout<<"Ââåäèòå íàçâàíèå áä â ôîðìàòå ****.txt"<<endl;cin>>db;break;
case 4:clrscr();create();break;
case 5:clrscr();deleting(db);cout<<"Óäàëåíî!";break;
default:cout<<"Íåòó òàêîãî ìåíþ"<<endl;
}
} while (i!=0);
}
Доделал курсач и появилась непонятная проблема.Почему-то после вызова функции add() в вписывания фамилии в а, оно заносит в файл без 1 буквы.Н-р. ввожу Смирнов, а в файл заносится мирнов.
Хотя до добавления функции deleting() всё работало нормально.Помогите!!
0
5488 / 4883 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.10.2014, 02:05 12
Весь код не изучал, но:
Цитата Сообщение от Terrorblade Посмотреть сообщение
C++
1
f<<a<<" "<<nomer<<" "<<inf<<" "<<inmov<<" "<<math<<" "<<fiz;
Если так добавлять запись, то она будет без пробела присоединена к предыдущей записи, при чтении будет ошибка. Делайте каждую запись (структуру) в отдельной строке, и не нужно усложнять чтение (atoi(t) и пр.). Для чтения чисел есть методы форматируемого чтения (f >> a[o].nomer, и т.д.). Т.е., фамилию читать через f.getline(), остальное - через f >> (если фамилия из одного слова, то и её можно через f >> ). В конце итерации не забыть убрать, перед f.getline(), символ новой строки: f.get(). Само чтение фамилии поместить в параметр while(), чтобы не было лишнего чтения.
1
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 37
23.10.2014, 08:05  [ТС] 13
оно добавляет как надо,но именно фамилия заносится без 1 буквы!
0
Модератор
Эксперт С++
12069 / 9753 / 5897
Регистрация: 18.12.2011
Сообщений: 26,180
23.10.2014, 09:46 14
а не все ли заглавные буквы не пишутся?
Была в этом разделе подобная проблема, связанная с локализацией.
Попробуйте писать фамилию латинскими буквами.
1
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 37
23.10.2014, 15:39  [ТС] 15
решил проблему путём добавления endl перед а
C++
1
f<<endl<<a<<" "<<nomer<<" "<<inf<<" "<<inmov<<" "<<math<<" "<<fiz;
0
5488 / 4883 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.10.2014, 18:03 16
Цитата Сообщение от Terrorblade Посмотреть сообщение
решил проблему путём добавления endl перед а
А я о чём писал?
Цитата Сообщение от alsav22 Посмотреть сообщение
Делайте каждую запись (структуру) в отдельной строке
Только обычно так разделяют строки (не в начале строки ставят endl, а в конце):
C++
1
f<<a<<" "<<nomer<<" "<<inf<<" "<<inmov<<" "<<math<<" "<<fiz<<endl;
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.10.2014, 18:03
Помогаю со студенческими работами здесь

Структура "Авто", заполнение и запись в файл
Как мне теперь записать структуры в цикле и добавить их в файл? #include &quot;stdafx.h&quot; #include...

Добавить к возрасту человека указание "год", "года", "лет"
Дано натуральное число n (n&lt;=100), определяющее возраст человека (в годах). Дать для этого числа...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно"
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;,...

Чтения структуры из файла (описать структуру с именем "ORDER": "счет плательщика"; "счет получателя"; "сумма, переводится банковской операцией")
Описать структуру с именем &quot;ORDER&quot;, содержащий следующие поля: &quot;Счет плательщика&quot;; &quot;Счет...


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

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

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