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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
bLesk
41 / 41 / 1
Регистрация: 24.11.2009
Сообщений: 165
#1

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

25.11.2010, 19:23. Просмотров 1129. Ответов 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
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, либо как-то иначе осуществлять поиск элемента, хотя другим способом я даже предположить не могу
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.11.2010, 19:23     Структура, запись из файла в массив
Посмотрите здесь:

Запись и чтение из файла. Структура. Сортировка - C++
Здравствуйте. Мне нужно составить программу. Я написал, часть программы, мне нужно производить чтение и запись в файл (в самом файле должно...

Считывание файла в массив и запись нового файла - C++
Консоль VS C++. Текстовый файл открывается как бинарный, и считывается по 100 байт в массив - и сразу они переписываются в другой файл. В...

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

Запись из файла в массив - C++
как записать слова из файла в массив,чтобы потом с ними работать?

Запись файла в массив С++ - C++
Даны два файла в одном ответы пользователя после решения теста 2 файл правильные ответы как бы надо вывести на сколько процентов верно...

Запись из файла в массив - C++
Есть программа которая создает базу данных, состоящая из структур struct info { char phone; // Телефон char email; // Емайл }; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
25.11.2010, 21:57     Структура, запись из файла в массив #2
используй string и getline()
Crudelis
Шаровик затейник
672 / 414 / 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
41 / 41 / 1
Регистрация: 24.11.2009
Сообщений: 165
26.11.2010, 10:16  [ТС]     Структура, запись из файла в массив #4
Цитата Сообщение от accept Посмотреть сообщение
используй string и getline()
спасибо, я тоже думал об этом, прочитал материал по файлам в с/с++, но у меня все равно ничего не вышло можете каким-нибудь примером помочь?

функция strcmp если находит соответствие возвращает -1, у вас true, как только вы находите что то в программе то срабатывает break; т.е. выход из массива и дальше ничего не происходит
ок, функция выполняет свои функции как положено(проверял), вся проблема в том, что она не сможет найти то, что находится в файле, пока я не положу "это" в массив, либо перепишу саму функцию с другим подходом, мне не известным
accept
4821 / 3241 / 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
41 / 41 / 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
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
26.11.2010, 13:58     Структура, запись из файла в массив #7
это строка превращается в поток, чтобы к нему можно было применять операции ввода/вывода
bLesk
41 / 41 / 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
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
26.11.2010, 17:49     Структура, запись из файла в массив #9
Цитата Сообщение от bLesk
можно как то сделать так, чтобы программа не трогала это, или мне лучше просто убрать из файла эти надписи?
если оставить, то прога станет зависимой, если убрать, ничего не будет понятно
нужно сделать файл ввода без дополнительных записей, файл вывода тоже без дополнительных записей, а информацию для пользователя отдельно

тогда появляется бОльшая свобода в выводе для пользователя, потому что изменения представления не будут влиять на ход программы
bLesk
41 / 41 / 1
Регистрация: 24.11.2009
Сообщений: 165
26.11.2010, 17:51  [ТС]     Структура, запись из файла в массив #10
еще раз спасибо, все таки для начала что бы разобраться именно со строками, я убрал лишние из файла, теперь только информация, прочитайте пожалуйста конец моего предыдущего сообщения, почему программа выводит на экран данные именно таким образом?)
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
26.11.2010, 17:55     Структура, запись из файла в массив #11
неправильно открыл файл, ios::app означает открыть для записи в конец (может там не только запись в C++, но оно явно тут не нужно), можно даже ios::in не писать, так как ifstream уже означает поток ввода
bLesk
41 / 41 / 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
4821 / 3241 / 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++
Доброго времени суток. Подскажите пожалуйста, как на с ++ создать массив для побайтовой записи файла? И как после этого проводить XOR...

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

Чтение из файла и запись в массив на с++ - C++
Добрый день. Хотелось бы попросить помощи. Необходимо считать данные из файла(данные измерений в виде матрицы - числа типа double....

Чтение чисел из файла и запись в массив - C++
Дан файл с 20 строками типа: &quot;C=219-02,OU=comps,C=su,C=su,C=ru,20111129105801.0Z&quot; необходимо прочитать в каждой строке числа типа:...


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

Или воспользуйтесь поиском по форуму:
bLesk
41 / 41 / 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     Структура, запись из файла в массив
Ответ Создать тему
Опции темы

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