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

Структура, запись из файла в массив - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
bLesk
 Аватар для bLesk
40 / 40 / 1
Регистрация: 24.11.2009
Сообщений: 165
25.11.2010, 19:23     Структура, запись из файла в массив #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
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
#include<stdio.h>
#include<conio.h>
#include<iostream.h>
#include <cstring.h>
#include <cstdlib.h>
#include <fstream>
 
const int n=10;
 
struct record
{
    char name[20];
    char capitol[20];
    double population;
} country[n] ;
 
 
 
//--------------------------------
void enter();
void show();
void search();
void del();
void input (int i);
//--------------------------------
void main()
{
 int l;
 do
  {
     cout <<"\n ";
     cout <<"\n 1)Enter \n 2)Show \n 3)Search \n 4)Delete \n 5)Exit \n ";
     cin >> l;
     switch(l)
      {
          case 1:
             enter();
             break;
          case 2:
             show();
             break;
          case 3:
             search();
             break;
          case 4:
             del();
             break;
          default:
             cout<<"\n You must use only : 1, 2, 3, 4 or 5 keys";
             cout<<"\n Try again :)";
             break;
      }
  }
  while(l!=5);
  getch();
}
 
//------------------------------------------------------
void enter ()
{
        int i;
        for(i = 0; i < n; i++)
                if(!*country[i].name) break;
        if(i == n)
        {
                cout << "List is full\n";
                return;
        }
 
        input(i);
}
//----------------------------------------------------------------
void input (int i)
{
 
        ofstream out;
        out.open("C:/результат.txt", ios::app);
 
        out << "\n -------------------------------------";
        cout << "Enter name of the country: ";
        cin >> country[i].name;
        out << "\n Name of the country:  "<< country[i].name;
 
        cout << "Enter capitol of the country: ";
        cin >> country[i].capitol;
        out << "\n Capitol of the country:  "<< country[i].capitol;
 
        cout << "Enter population of the country: ";
        cin >> country[i].population;
        out << "\n Population of the country:  "<< country[i].population;
        out << "\n -------------------------------------";
 
 
}
//---------------------------------------------------------------------
void show ()
{
        FILE *fp;
        char str[128];
        if ((fp = fopen("C:/результат.txt", "r"))==NULL)
                {
                 perror("C:/результат.txt");
                }
        while(!feof(fp)) {
        if(fgets(str, 126, fp)) printf("%s", str);
  }
 
  fclose(fp);
 
    /*  int t;
 
        for(t = 0; t < n; t++)
        {
                if(*country[t].name)
                {
                        cout << "\n -------------------------------------";
                        cout << "\n Name of the country: " << country[t].name;
                        cout << "\n Name of the capitol is: " << country[t].capitol;
                        cout << "\n Population: " << country[t].population;
                        cout << "\n -------------------------------------";
                }
        }          */
}
//-----------------------------------------------------------------
void search ()
{
        int i;
        char name [20];
 
        cout << "Enter name of the country: ";
        cin >> name;
 
        for(i = 0; i < n; i++)
 
                if(!strcmp (name, country[i].name))
                   break;
                        if(i == n)
                           {
                            cout << "\n Failed \n";
                            return;
                           }
                       {
                          cout << "\n Name of the country: " << country[i].name;
                          cout << "\n Name of the capitol is: " << country[i].capitol;
                          cout << "\n Population: " << country[i].population;
                       }
}
//------------------------------------------------------------------------
void del ()
{
        int i;
        record *temp;
        char name [20];
 
        cout << "Enter name of the country: ";
        cin >> name;
 
        for(i = 0; i < n; i++)
 
                if(!strcmp (name, country[i].name))     break;
 
                        if(i == n)
                           {
                            cout << "\n Failed \n";
                            return;
                           }
                         {
                     *country[i].name = '\0';
                     *country[i].capitol = '\0';
                     country[i].population ='\0';
                     cout<<"\n Elemet was deleted ^^";
                        }
}
и кое что мне не понятно, в общем функция search проверяет элемент на его принадлежность структуре, и когда я с клавиатуры ввожу данные в массив она отлично справляется (т.е. когда все данные в памяти), но вот когда закрываю программу и запускаю снова, данные которые находятся в файле на принадлежность проверить не получится, тк ф-я ищет по массиву! в общем помогите либо как то заставить считывать прогу из файла так, чтобы не исправлять ф-ю search, либо как-то иначе осуществлять поиск элемента, хотя другим способом я даже предположить не могу
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
25.11.2010, 21:57     Структура, запись из файла в массив #2
используй string и getline()
Crudelis
Шаровик затейник
 Аватар для Crudelis
667 / 409 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
25.11.2010, 22:18     Структура, запись из файла в массив #3
C++
1
if(!strcmp (name, country[i].name))
функция strcmp если находит соответствие возвращает -1, у вас true, как только вы находите что то в программе то срабатывает break; т.е. выход из массива и дальше ничего не происходит
bLesk
 Аватар для bLesk
40 / 40 / 1
Регистрация: 24.11.2009
Сообщений: 165
26.11.2010, 10:16  [ТС]     Структура, запись из файла в массив #4
Цитата Сообщение от accept Посмотреть сообщение
используй string и getline()
спасибо, я тоже думал об этом, прочитал материал по файлам в с/с++, но у меня все равно ничего не вышло можете каким-нибудь примером помочь?

функция strcmp если находит соответствие возвращает -1, у вас true, как только вы находите что то в программе то срабатывает break; т.е. выход из массива и дальше ничего не происходит
ок, функция выполняет свои функции как положено(проверял), вся проблема в том, что она не сможет найти то, что находится в файле, пока я не положу "это" в массив, либо перепишу саму функцию с другим подходом, мне не известным
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
26.11.2010, 10:47     Структура, запись из файла в массив #5
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>
#include <fstream>
#include <string>
#include <sstream>
 
using namespace std;
 
struct Some {
    string a, b, c;
};
 
int main(void)
{
    ifstream in;
    string s;
    Some data;
    
    in.open("file.txt");
    
    if (!in.is_open())
        return 1;
    
    cout << "start..." << endl;
    
    while (getline(in, s)) {
        
#if 0
        cout << "string: " << s << endl;
#endif
 
        stringstream str(s);
        str >> data.a >> data.b >> data.c;
        
        cout << "data: "
             << data.a
             << ", "
             << data.b
             << ", "
             << data.c
             << endl;
    
    }
    
    in.close(); // эту штуку вроде может вызвать деструктор
    
    return 0;
}
Код
[guest@localhost tests]$ ./t
start...
data: a, b, c
data: d, e, f
data: g, h, i
[guest@localhost tests]$
file.txt
Код
a b c
d e f
g h i
bLesk
 Аватар для bLesk
40 / 40 / 1
Регистрация: 24.11.2009
Сообщений: 165
26.11.2010, 11:21  [ТС]     Структура, запись из файла в массив #6
спасибо большое, объясните пожалуйста как работает эта часть программы


Цитата Сообщение от accept Посмотреть сообщение
C++
1
2
stringstream str(s);
 str >> data.a >> data.b >> data.c;
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
26.11.2010, 13:58     Структура, запись из файла в массив #7
это строка превращается в поток, чтобы к нему можно было применять операции ввода/вывода
bLesk
 Аватар для bLesk
40 / 40 / 1
Регистрация: 24.11.2009
Сообщений: 165
26.11.2010, 15:16  [ТС]     Структура, запись из файла в массив #8
после выполнения работы моей проги, файл будет примерно такого типа

-------------------------------------
Name of the country: dsad
Capitol of the country: asdasd
Population of the country: 213213
-------------------------------------
-------------------------------------
Name of the country: dasdas
Capitol of the country: sadasd
Population of the country: 231321
-------------------------------------
-------------------------------------
Name of the country: sadasd
Capitol of the country: asda
Population of the country: 23123
-------------------------------------
-------------------------------------
Name of the country: ‚длўдлў
Capitol of the country: dsadsa
Population of the country: 231231
-------------------------------------
-------------------------------------
Name of the country: asdsad
Capitol of the country: sadasd
Population of the country: 231312
-------------------------------------
она поместит данные именно по ячейкам в моей структуре, т.е. country.name,country.capitol,country.population

вот это же прога тоже будет ложить в массив
Name of the country:
Capitol of the country:
Population of the country:
можно как то сделать так, чтобы программа не трогала это, или мне лучше просто убрать из файла эти надписи?

Добавлено через 1 час 6 минут
попробывал поделать методом тыка, если использую такую часть кода

C++
1
2
3
4
5
6
7
8
9
10
11
 ifstream in;
         in.open("C:/результат.txt", ios::app);
         string s;
         for (int k; k<n; k++)
         {
         while (getline(in, s))
               {
                    stringstream str(s);
                    str >> country[k].name >> country[k].capitol >> country[k].population;
               }
         }
то прога из файла с содержимым
russia
moscow
1
usa
wash
4
выводит
----------------
Name : 4
capitol :
population: 0
---------------
если делаю так
C++
1
2
3
4
5
6
7
8
9
 ifstream in;
         in.open("C:/результат.txt", ios::app);
         string s;
         while (getline(in, s))
               {
                    stringstream str(s);
                    str >> country.name >> country.capitol >> country.population;
               
         }
то компилятор ругается:
E2294 Structure required on left side of . or .*
помогите пожалуйста, голову сломал уже
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
26.11.2010, 17:49     Структура, запись из файла в массив #9
Цитата Сообщение от bLesk
можно как то сделать так, чтобы программа не трогала это, или мне лучше просто убрать из файла эти надписи?
если оставить, то прога станет зависимой, если убрать, ничего не будет понятно
нужно сделать файл ввода без дополнительных записей, файл вывода тоже без дополнительных записей, а информацию для пользователя отдельно

тогда появляется бОльшая свобода в выводе для пользователя, потому что изменения представления не будут влиять на ход программы
bLesk
 Аватар для bLesk
40 / 40 / 1
Регистрация: 24.11.2009
Сообщений: 165
26.11.2010, 17:51  [ТС]     Структура, запись из файла в массив #10
еще раз спасибо, все таки для начала что бы разобраться именно со строками, я убрал лишние из файла, теперь только информация, прочитайте пожалуйста конец моего предыдущего сообщения, почему программа выводит на экран данные именно таким образом?)
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
26.11.2010, 17:55     Структура, запись из файла в массив #11
неправильно открыл файл, ios::app означает открыть для записи в конец (может там не только запись в C++, но оно явно тут не нужно), можно даже ios::in не писать, так как ifstream уже означает поток ввода
bLesk
 Аватар для bLesk
40 / 40 / 1
Регистрация: 24.11.2009
Сообщений: 165
26.11.2010, 18:46  [ТС]     Структура, запись из файла в массив #12
спасибо, но ошибка малость в другом, я организовал считывание таким образом
C++
1
2
3
4
5
6
7
 int k=0;
           while (getline(in, s))
                   {
                        stringstream str(s);
                        str >>country[k].name >> country[k].capitol >> country[k].population;
                        k++;
                    }
и программа закидывает все данные из файла, в country.name. а capitol и population так и остаются пустыми

зама структура у меня такой вид имеет

C++
1
2
3
4
5
6
7
8
const int n=10;
 
struct record
{
        char name[20];
        char capitol[20];
        double population;
} country[n] ;
Добавлено через 31 минуту
ребят хелпаните кто-нибудь, уже замучался с этой прогой ;/
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
26.11.2010, 19:59     Структура, запись из файла в массив #13
к потоку можно применять getline(), она может принимать разделитель третьим параметром
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.11.2010, 22:39     Структура, запись из файла в массив
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
bLesk
 Аватар для bLesk
40 / 40 / 1
Регистрация: 24.11.2009
Сообщений: 165
26.11.2010, 22:39  [ТС]     Структура, запись из файла в массив #14
всем спасибо закончил программу,
если ком нужно будет вот рабочий код
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
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
#include<stdio.h>
#include<conio.h>
#include<iostream.h>
#include <cstring.h>
#include <cstdlib.h>
#include <fstream>
#include <string>
#include <sstream>
 
const int n=10;
 
struct record
{
        char name[20];
        char capitol[20];
        double population;
} country[n] ;
 
 
 
//--------------------------------
void enter();
void show();
void search();
void del();
void input (int i);
void enter2();
void input2(int i);
//--------------------------------
 
void main()
{
 int l;
 do
  {
         ifstream in;
         in.open("C:/f.txt");
         string s;
         int k=0;
         while (getline(in, s))
               {
                stringstream str(s);
                str >> country[k].name >> country[k].capitol >> country[k].population;
                k++;
                }
         cout <<"\n ";
         cout <<"\n 1)Enter(append file) \n 2)Enter(rewrite file) \n 3)Show \n 4)Search \n 5)Delete \n 6)Exit \n ";
         cin >> l;
         switch(l)
          {
                  case 1:
                         enter();
                         break;
                  case 2:
                         enter2();
                         break;
                  case 3:
                         show();
                         break;
                  case 4:
                         search();
                         break;
                  case 5:
                         del();
                         break;
                  default:
                         cout<<"\n You must use only : 1, 2, 3, 4 or 5 keys";
                         cout<<"\n Try again :)";
                         break;
          }
  }
  while(l!=6);
  getch();
}
 
//------------------------------------------------------
void enter ()
{
                int i=0;
                if(i == n)
                {
                                cout << "List is full\n";
                                return;
                }
 
        input(i);  i++;
}
//----------------------------------------------------------------
void input (int i)
{
 
                ofstream out, fout;
                out.open("C:/f.txt", ios::app);
                fout.open("C:/результат.txt", ios::app);
                out <<"\n ";
 
                fout << "\n -------------------------------------";
                cout << "Enter name of the country: ";
                cin >> country[i].name;
                out << " " <<country[i].name;
                fout << "\n Name of the country:  "<< country[i].name;
 
                cout << "Enter capitol of the country: ";
                cin >> country[i].capitol;
                out << " " <<country[i].capitol;
                fout << "\n Capitol of the country:  "<< country[i].capitol;
 
                cout << "Enter population of the country: ";
                cin >> country[i].population;
                out <<" " <<country[i].population;
                fout << "\n Population of the country:  "<< country[i].population;
                fout << "\n -------------------------------------";
}
//---------------------------------------------------------------------
 
void enter2()
{
            int i=0;
                if(i == n)
                {
                                cout << "List is full\n";
                                return;
                }
 
        input2(i);  i++;
}
//----------------------------------------------------------------------
 
void input2(int i)
{
                ofstream out, fout;
                out.open("C:/f.txt", ios::out);
                fout.open("C:/результат.txt", ios::out);
                out <<"\n ";
 
                fout << "\n -------------------------------------";
                cout << "Enter name of the country: ";
                cin >> country[i].name;
                out << " " <<country[i].name;
                fout << "\n Name of the country:  "<< country[i].name;
 
                cout << "Enter capitol of the country: ";
                cin >> country[i].capitol;
                out << " " <<country[i].capitol;
                fout << "\n Capitol of the country:  "<< country[i].capitol;
 
                cout << "Enter population of the country: ";
                cin >> country[i].population;
                out <<" " <<country[i].population;
                fout << "\n Population of the country:  "<< country[i].population;
                fout << "\n -------------------------------------";
 
}
 
//--------------------------------------------------
void show ()
{
       FILE *fp;
                char str[128];
                if ((fp = fopen("C:/результат.txt", "r"))==NULL)
                                {
                                 perror("C:/результат.txt");
                                }
        while(!feof(fp)) {
                if(fgets(str, 126, fp)) printf("%s", str);
  }
 
  fclose(fp);
}
//-----------------------------------------------------------------
void search ()
{
                int i;
                char name [20];
 
                cout << "Enter name of the country: ";
                cin >> name;
 
                for(i = 0; i < n; i++)
 
                                if(!strcmp (name, country[i].name))
                                   break;
                                                if(i == n)
                                                   {
                                                        cout << "\n Failed \n";
                                                        return;
                                                   }
                                           {
                                                  cout << "\n Name of the country: " << country[i].name;
                                                  cout << "\n Name of the capitol is: " << country[i].capitol;
                                                  cout << "\n Population: " << country[i].population;
                                           }
}
//------------------------------------------------------------------------
void del ()
{
 
                char name [20];
                cout << "Enter name of the country: ";
                cin >> name;
                ofstream out, fout;
                out.open("C:/f.txt", ios::out);
                fout.open("C:/результат.txt", ios::out);
                for (int i=1; i < n; i++)
                  if(*country[i].name)
                    {
                        if(strcmp (name, country[i].name))
 
 
                                {
                                     out <<"\n";
                                     out <<" " <<country[i].name;
                                     out <<" " <<country[i].capitol;
                                     out <<" " <<country[i].population;
                                     fout <<"\n ---------------------------------------------";
                                     fout << "\n Name of the country:  "<< country[i].name;
                                     fout << "\n Capitol of the country:  "<< country[i].capitol;
                                     fout << "\n Population of the country:  "<< country[i].population;
                                     fout <<"\n ---------------------------------------------";
 
                                }
                                      else
                                       {
                                             cout<<"\n Elemet was deleted ^^";    continue;
                                       }
                        }
                                 /* if(i == n)
                                                   {
                                                        cout << "\n Failed \n";
                                                        return;
                                                   }        */
}
Yandex
Объявления
26.11.2010, 22:39     Структура, запись из файла в массив
Ответ Создать тему
Опции темы

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