Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
andrei103
0 / 0 / 0
Регистрация: 24.04.2015
Сообщений: 8
#1

Как сделать поиск из файла в классе? - C++

24.04.2015, 09:59. Просмотров 572. Ответов 17
Метки нет (Все метки)

Добрый день!!!Помогите ломаю голову уже 5 дней!!!
У меня есть класс в котором область-char[40],район-char[40],число жителей-int,число городов в районе-int,
сделал 3 функции- 1-ввод даных, 2-запись в файл, 3-считка из файла всех данных, а поиск по заданому (например по области и чтоб выводило обл,город,район,числ жителей )-мозгов не хватает??????
вот мой код на с++

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
// lab №6.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
 
class oblast
{
    char obl[40];//областной центр
    char name[40];//область
    int ploshad; //площадь
    int naselenie; // количество населения
    int gorodov;  // количество городов
 
public:
 
    void vvod()
    {
        setlocale(LC_ALL, "Russian");
        ofstream fout;
 
        cout << "Введите область" << endl;
        cin >> name;
        cout << "Введите обласной центр" << endl;
        cin >> obl;
        cout << "Введите площадь" << endl;
        cin >> ploshad;
        cout << "Введите сколько городов в обласном центе???" << endl;
        cin >> gorodov;
 
        fout.open("document.txt", ios::app);
        fout << "Область" << "............." << name << endl;
        fout << "Областной центр" << "......" << obl << endl;
        fout << "Площадь" << "............" << ploshad << "кв.км" << endl;
        fout << "Количество городов" << ".." << gorodov << endl;
 
        fout.close();
        
    }
 
    
 
    void vivod_is_faila()
    {
        string str;
        ifstream fin;
        fin.open("document.txt");
        if (!fin)
        {
            cout << "Такого файла нет!!!!!!!" << endl;
        }
        else {
            while (!fin.eof())
            {
                getline(fin, str);
                cout << str << endl;
                cout << "___________________________" << endl;
            }
        }
        fin.close();
 
 
 
    }
 
    
 
    void poisk_pp()       // не могу эту функцию сделать !!!!!!!!!!!!!
    {
        char sname[20];
        ifstream fin;
        cout << "введите область" << endl;
        cin >> sname;
        fin.open("document.txt");
        if (!fin)
        {
            cout << "File can't open" << endl;
        }
        else
        {
            while (!fin.eof())
            {
                if (fin.peek() == EOF)
                    break;
                fin >> obl >> ploshad;
                fin.ignore();
                if (strcmp(obl, sname) == 0)
                    cout<<obl<<"  "  << " - " <<ploshad<<"   " << endl;
 
            }
        }
        fin.clear();
        fin.close();
    }
};
    
 
 
 
 
 
 
    int _tmain(int argc, _TCHAR* argv[])
    {
        setlocale(LC_ALL, "Russian");
        
        int menu;
        for (;;)
        {
            cout << " " << endl;
            cout << "\t\tПРОГРАММА  ***Область и районы*** \t\n\n";
            cout << "\t\t 1____Выберите для ввода данных" << endl;
            cout << "\t\t 2____Выберите для просмотра" << endl;
            cout << "\t\t 3____Выберите для выхода" << endl;
            cout << "\t\t 4____Выберите для поиска" << endl;
            cin >> menu;
            switch (menu)
            {
            case 1:
                oblast object;
                object.vvod(); break;
            case 2:
                object.vivod_is_faila(); break;
            case 3:
                exit(0);
            case 4:
                object.poisk_pp(); break;
            
 
 
            }
 
        }
        _getch();
 
        return 0;
    }
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.04.2015, 09:59
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как сделать поиск из файла в классе? (C++):

Как сделать проверку на ввод в классе?
В методе класса не получается сделать ошибку при вводе числа меньшего нуля. ...

Как сделать алгоритм поиска в вложенном классе?
Помогите сделать метод поиска квартир в вложенном классе по полю vulica:...

О классе, методе пузырька и выводе в файл, как сделать?
Можно в очень понятной форме мне кое, что объяснить: 1) например нам надо...

пытаюсь сделать реализацию через считывание из файла кол-ва чисел, i,но незнаю как сделать реализацию из файла в массив и сортировки.
В файле input.txt находится неизвестное количество вещественных чисел в...

Как сделать компоненты базового класса доступными в производном классе, но недоступными вне классов?
Как сделать компоненты базового класса доступными в производном классе, но...

Запомнить данные в классе в виде массива слов. Помогите - не код, а совет как сделать.
Здравстуйте! Задание стоит так: Программа должна открыть файл Go.txt и...

17
lss
926 / 855 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
24.04.2015, 11:24 #2
Цитата Сообщение от andrei103 Посмотреть сообщение
C++
1
2
3
4
5
fout.open("document.txt", ios::app);
   fout << "Область" << "............." << name << endl;
   fout << "Областной центр" << "......" << obl << endl;
   fout << "Площадь" << "............" << ploshad << "кв.км" << endl;
   fout << "Количество городов" << ".." << gorodov << endl;
Не нужно в файл лишнее писать. Всё это ("Область......" и пр.) добавляется при выводе из файла. Записывать в файл нужно только данные, тогда и поиск не проблема сделать.
1
andrei103
0 / 0 / 0
Регистрация: 24.04.2015
Сообщений: 8
24.04.2015, 12:40  [ТС] #3
в смысле нужо записывать только fout<<name;
fout<<obl;
так ??
и как тогда построить запрос???
помогите пожалуйста,я уже все что можно об fstream прочитал,и ни как не догоню а учусь на заочном преподы далеко)))
0
lss
926 / 855 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
24.04.2015, 12:44 #4
Цитата Сообщение от andrei103 Посмотреть сообщение
так ??
Да, только через разделитель.
1
andrei103
0 / 0 / 0
Регистрация: 24.04.2015
Сообщений: 8
24.04.2015, 12:46  [ТС] #5
и как тогда построить запрос???
помогите пожалуйста,я уже все что можно об fstream прочитал,и ни как не догоню а учусь на заочном преподы далеко)))
0
lss
926 / 855 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
24.04.2015, 12:48 #6
При поиске, создашь временный объект класса и будешь, в цикле (каждая итерация - четние полей одного объекта), читать в этот объект поля из файла. Прочитал один объект, проверил нужное поле на совпадение, если совпало, вывел все поля считанного объекта, если нет - чтение полей следующего объекта и т.д.
1
andrei103
0 / 0 / 0
Регистрация: 24.04.2015
Сообщений: 8
24.04.2015, 12:51  [ТС] #7
спасибо ну хоть какой пример можете написать ???я токо все это начал изучать,плиз
0
lss
926 / 855 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
24.04.2015, 12:53 #8
Могу, но часов черз пять.
1
andrei103
0 / 0 / 0
Регистрация: 24.04.2015
Сообщений: 8
24.04.2015, 12:54  [ТС] #9
Спасибище огромное!!!!!!!!!!!!!!!буду ждать
0
_Scorpius_
54 / 54 / 35
Регистрация: 01.04.2015
Сообщений: 109
24.04.2015, 14:23 #10
Лучший ответ Сообщение было отмечено andrei103 как решение

Решение

Приблизительно как-то так:
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
#include <iostream>
#include <fstream>
 
using namespace std;
 
class oblast
{
        char obl[40];//областной центр
        char name[40];//область
        int ploshad; //площадь
        int naselenie; // количество населения
        int gorodov;  // количество городов
 
        void RdFile(ifstream &fin)
        {
            fin >> name >> obl >> ploshad >> gorodov;
        }
 
        void ViewInfo()
        {
            cout << "Область" << "............." << name << endl;
            cout << "Областной центр" << "......" << obl << endl;
            cout << "Площадь" << "............" << ploshad << "кв.км" << endl;
            cout << "Количество городов" << ".." << gorodov << endl;
            cout << "___________________________" << endl;
        }
 
    public:
        void vvod()
        {
            ofstream fout;
     
            cout << "Введите область" << endl;
            cin >> name;
            cout << "Введите обласной центр" << endl;
            cin >> obl;
            cout << "Введите площадь" << endl;
            cin >> ploshad;
            cout << "Введите сколько городов в обласном центе???" << endl;
            cin >> gorodov;
     
            fout.open("document.txt", ios::app);
            fout << endl;
            fout << name << ' ';
            fout << obl << ' ';
            fout << ploshad << ' ';
            fout << gorodov;
            fout.close();
        }
 
        void vivod_is_faila()
        {
            ifstream fin;
            fin.open("document.txt");
            if (!fin)
            {
                cout << "Такого файла нет!!!!!!!" << endl;
            }
            else {
                while (!fin.eof())
                {
                    RdFile(fin);
                    ViewInfo();
                }
            }
            fin.close();
        }
 
        void poisk_pp()
        {
            char sname[20];
            ifstream fin;
            cout << "введите область" << endl;
            cin >> sname;
            fin.open("document.txt");
            if (!fin)
            {
                cout << "File can't open" << endl;
            }
            else
            {
                while (!fin.eof())
                {
                    RdFile(fin);
                    if (strcmp(obl, sname) == 0)
                        ViewInfo();
     
                }
            }
            fin.close();
        }
};
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
    
    int menu;
    oblast object;
    for (;;)
    {
        cout << " " << endl;
        cout << "\t\tПРОГРАММА  ***Область и районы*** \t\n\n";
        cout << "\t\t 1____Выберите для ввода данных" << endl;
        cout << "\t\t 2____Выберите для просмотра" << endl;
        cout << "\t\t 3____Выберите для выхода" << endl;
        cout << "\t\t 4____Выберите для поиска" << endl;
        cin >> menu;
        switch (menu)
        {
        case 1:
            object.vvod(); break;
        case 2:
            object.vivod_is_faila(); break;
        case 3:
            exit(0);
        case 4:
            object.poisk_pp(); break;
        }
    }
    system("pause");
    return 0;
}
2
lss
926 / 855 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
24.04.2015, 14:32 #11
Только проверку на конец файла по-другому сделать, а то лишний вывод будет. Или после RdFile() проверять, или сделать возврат потока из RdFile(), а вызов RdFile() поместить в параметры while().
1
_Scorpius_
54 / 54 / 35
Регистрация: 01.04.2015
Сообщений: 109
24.04.2015, 14:44 #12
Лишних выводов не будет, так-как разделитель добавляю перед записью данных структуры (немного изменил заполнение файла).
1
lss
926 / 855 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
24.04.2015, 14:50 #13
Цитата Сообщение от _Scorpius_ Посмотреть сообщение
Лишних выводов не будет, так-как разделитель добавляю перед записью данных структуры (немного изменил заполнение файла).
Разделитель тут не поможет.
C++
1
2
3
4
5
while (!fin.eof())
{
      RdFile(fin); // последнее чтение, считан EOF, в поля ничего не попало
      ViewInfo(); // всё равно вывод. Что выведется? То, что и перед этим.
}
1
_Scorpius_
54 / 54 / 35
Регистрация: 01.04.2015
Сообщений: 109
24.04.2015, 15:16 #14
C++
1
2
3
4
5
while (!fin.eof())
{
      RdFile(fin); // последнее чтение, считываются данные (EOF - признак конца считывания последнего параметра), поля все заполненные новой информацией
      ViewInfo(); // Вывод
}
1
lss
926 / 855 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
24.04.2015, 15:42 #15
Для твоего кода правильно будет работать, из-за того, что в конце файла нет '\n'. Вот, чтобы от этого не зависеть, я и рекомендую так не делать, тогда при любом окончании файла будет правильно работать.
1
andrei103
0 / 0 / 0
Регистрация: 24.04.2015
Сообщений: 8
24.04.2015, 17:59  [ТС] #16
Спасибище огромное еще раз!!!!!!!!!сейчас буду проверять и у Вас учиться!!!

Добавлено через 1 час 54 минуты
void RdFile(ifstream &fin) а как эту функцию понять мы указываем адрес fin ифстриму???
0
lss
926 / 855 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
24.04.2015, 19:14 #17
Цитата Сообщение от andrei103 Посмотреть сообщение
мы указываем адрес fin ифстриму???
Это не адрес, это ссылка на ifstream (передача параметра по ссылке).
1
andrei103
0 / 0 / 0
Регистрация: 24.04.2015
Сообщений: 8
24.04.2015, 19:17  [ТС] #18
понял спасибо!!у Вас все так просто получилось,просто удивляюсь,может и сам когда нибудь к этому дойду)))))
0
24.04.2015, 19:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.04.2015, 19:17
Привет! Вот еще темы с решениями:

Как обьявить переменную в одном классе и что бы ее было видно в дочернем классе
У меня есть основной класс с названием Root один из его членов наследует...

Как сделать, чтобы из файла считать из файла число?
есть файл допустим test.txt 32/56 (32,56) 33/56 (33,56) 34/56 (34,56) 35/56...

У меня класс B в классе A, а в классе B рекурсивная функция переопределения оператора "()", как её вызвать, не создавая явно объект класса B?
#include &lt;windows.h&gt; #include &lt;iostream&gt; using namespace std; //Вот...

Поиск объекта в классе по строке типа char
Есть такая задача : Описать класс с именем PRICE, содержащий следующие поля: ...


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

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

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