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

Поиск в файле по заданному значению элемента структуры

11.05.2018, 23:14. Показов 2087. Ответов 38
Метки нет (Все метки)

В консольном приложении мне нужно реализовать поиск по определенному параметру.
Допустим есть магазин и по вводу определенной цены пользователю должны выводится все товары с данной ценой
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.05.2018, 23:14
Ответы с готовыми решениями:

Предусмотреть вывод всех данных, поиск элемента двусвязного списка по заданному значению
Help me please!!! В динамической памяти создать двусвязный список из символов латинского алфавита....

Реализовать поиск элемента в массиве записей(структур) по заданному значению какого-либо свойства. Значение ввести с кла
Реализовать поиск элемента в массиве записей(структур) по заданному значению какого-либо свойства....

Не работает функция замены последнего отрицательного элемента в массиве на три элемента, равных заданному значению
//Функция поиска последнего отрицательного элемента в массиве и замена его на три элемента, равных...

В файле нужно сделать выбор по заданному значению
Помогите с файлом, нужно сделать выбор по автору. В чем может быть ошибка, подскажите, пожалуйста?...

38
473 / 425 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
11.05.2018, 23:58 2
Не нужно допустим, нужно четко условие задачи. Причем тут заголовок темы и содержание? Как они связаны?
0
3531 / 2190 / 401
Регистрация: 09.09.2017
Сообщений: 9,008
12.05.2018, 02:09 3
Считываете из файла в массив классов, потом каждый из них проверяете на свое условие и если удовлетворяет - выводите.
0
0 / 0 / 0
Регистрация: 11.03.2015
Сообщений: 12
12.05.2018, 11:47  [ТС] 4
Есть консольное приложение риелторской конторы.
Создан класс этой конторы в котором указаны: локация, цены, к-ство комнат квартир.
Вся инфа занесена в файл.
Как можно реализовать поиск по количеству комнат, то есть, чтоб пользователь вводил количество, и ему выводило все возможные варианты.
Можно ли это сделать через отдельный метод этого класса?(желательно с примером)
0
14 / 14 / 8
Регистрация: 10.12.2015
Сообщений: 157
12.05.2018, 12:33 5
Но если у вас уже есть класс со всей необходимой информацией, то зачем вам обращаться к файлу и вести в нем поиск?

обычный поиск вести нельзя?

C++ (Qt)
1
2
3
4
for(int i = 0; i < kvartira.count();++i)
{
    if(kvartira.kolichectvo_komnat() == n) /*выводвите сразу или добавляете в вектор а потом все комнаты выводите*/
}
ибо вам все равно надо будет считать весь файл заного, пройти все строки.
0
0 / 0 / 0
Регистрация: 11.03.2015
Сообщений: 12
12.05.2018, 16:13  [ТС] 6
а можно пример?

Добавлено через 4 часа 25 минут
а можно пример кода? как это выглядит
0
3531 / 2190 / 401
Регистрация: 09.09.2017
Сообщений: 9,008
12.05.2018, 17:45 7
Так не интересно. Покажите сначала как бы вы реализовали.
0
0 / 0 / 0
Регистрация: 11.03.2015
Сообщений: 12
12.05.2018, 19:18  [ТС] 8
я не знаю как это реализовать, потому эта тема и создана.
0
3531 / 2190 / 401
Регистрация: 09.09.2017
Сообщений: 9,008
12.05.2018, 20:01 9
У вас есть какая-то структура, в которой хранятся все данные одного объекта. Например
C
1
2
3
4
struct sSample{
  int id;
  int value;
};
Поскольку нужен поиск по полям структуры, эти самые структуры должны быть оформлены как массив (лучше, наверное, вектор, но для простоты пусть массивом остается)
C
1
struct sSample array[1023];
У вас есть файл, в котором хранятся все данные. Пусть для простоты будет текстовым:
Код
0 1
0 2
1 2
3 5
Пользуясь стандартными функциями работы с файлами, которые на данный момент вам уже известны, вы можете считать файл в массив структур.
Для начала реализуйте это.
0
0 / 0 / 0
Регистрация: 11.03.2015
Сообщений: 12
13.05.2018, 11:56  [ТС] 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
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
using namespace std;
 
class RealtorOffice
{
public:
    string Location;
    string LocOfDeclarant;
    int NumberOfRooms;
    int Price;
 
    int input();
    int output();
 
    void print()
    {
        cout << "Location is:"<<Location<<"\nLocation of Declarant is:"<<LocOfDeclarant<<"\nNumber of rooms is:"<<NumberOfRooms<<"\nPrice is:"<<Price<<"\n\n"<<endl;
    }
};
 
 
 
int RealtorOffice::input()
{
    ofstream file_obj;
    file_obj.open("Input.txt", ios::app);
    RealtorOffice obj;
 
    string loc1 = "New York";
    string lod1 = "LA";
    int nor1 = 1;
    int price1 = 150;
 
    obj.Location = loc1;
    obj.LocOfDeclarant = lod1;
    obj.NumberOfRooms = nor1;
    obj.Price = price1;
 
    file_obj.write((char*)&obj, sizeof(obj));
 
    string loc2 = "Chicago";
    string lod2 = "Chicago";
    int nor2 = 2;
    int price2 = 250;
 
    obj.Location = loc2;
    obj.LocOfDeclarant = lod2;
    obj.NumberOfRooms = nor2;
    obj.Price = price2;
 
    file_obj.write((char*)&obj, sizeof(RealtorOffice));
 
    return 0;
}
 
int RealtorOffice::output()
{
    ifstream file_obj;
    file_obj.open("Input.txt", ios::in);
    RealtorOffice obj;
 
    while (file_obj.read((char*)&obj, sizeof(RealtorOffice)))
    {
        obj.print();
    }
return 0;
}
 
int main()
{
    RealtorOffice object;
    object.input();
    object.output();
 
    return 0;
}
0
0 / 0 / 0
Регистрация: 11.03.2015
Сообщений: 12
13.05.2018, 12:04  [ТС] 11
wekfox, можете продемонстрировать как это должно было бы выглядеть? то что уже есть
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
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
using namespace std;
 
class RealtorOffice
{
public:
    string Location;
    string LocOfDeclarant;
    int NumberOfRooms;
    int Price;
 
    int input();
    int output();
// void search_by_NumberOfRooms() 
 
    void print()
    {
        cout << "Location is:"<<Location<<"\nLocation of Declarant is:"<<LocOfDeclarant<<"\nNumber of rooms is:"<<NumberOfRooms<<"\nPrice is:"<<Price<<"\n\n"<<endl;
    }
};
 
 
 
int RealtorOffice::input()
{
    ofstream file_obj;
    file_obj.open("Input.txt", ios::app);
    RealtorOffice obj;
 
    string loc1 = "New York";
    string lod1 = "LA";
    int nor1 = 1;
    int price1 = 150;
 
    obj.Location = loc1;
    obj.LocOfDeclarant = lod1;
    obj.NumberOfRooms = nor1;
    obj.Price = price1;
 
    file_obj.write((char*)&obj, sizeof(obj));
 
    string loc2 = "Chicago";
    string lod2 = "Chicago";
    int nor2 = 2;
    int price2 = 250;
 
    obj.Location = loc2;
    obj.LocOfDeclarant = lod2;
    obj.NumberOfRooms = nor2;
    obj.Price = price2;
 
    file_obj.write((char*)&obj, sizeof(RealtorOffice));
 
    return 0;
}
 
int RealtorOffice::output()
{
    ifstream file_obj;
    file_obj.open("Input.txt", ios::in);
    RealtorOffice obj;
 
    while (file_obj.read((char*)&obj, sizeof(RealtorOffice)))
    {
        obj.print();
    }
return 0;
}
 
int main()
{
    RealtorOffice object;
    object.input();
    object.output();
 
    return 0;
}
0
3531 / 2190 / 401
Регистрация: 09.09.2017
Сообщений: 9,008
13.05.2018, 15:18 12
Код
$ g++ main.cpp -Wall -Wextra
misha@debian:~$ ./a.out 
Location is:��C�
Location of Declarant is:Е
Number of rooms is:1
Price is:150


Location is:��C�
Location of Declarant is:ЕC�
Number of rooms is:2
Price is:250


free(): invalid pointer
Аварийный останов
Жаль что вы не проверяли программу прежде чем выложить сюда. Явно виден вывод непонятной фигни вместо символов и какая-то ошибка памяти. Предположительно, ошибка тут:
file_obj.write((char*)&obj, sizeof(obj));
Дело в том, что объект string содержит указатель на данные, а не сами данные. К тому же в общем случае сам obj может содержать служебную информацию - таблицу виртуальных функций. Да и вообще, какой смысл делать элемент списка объектом?
file_obj.open("Input.txt", ios::app);
Вот тут вы создаете файл Input.txt (опустим даже тот факт что вы его потом не закрываете). Он объявлен как текстовый, но пишете вы в него бинарные данные. Зачем тогда объявлять его текстовым? А точнее, зачем в него писать бинарные данные?
0
14 / 14 / 8
Регистрация: 10.12.2015
Сообщений: 157
13.05.2018, 19:28 13
вопрос такой. а зачем вы создаете экземпляр RealtorOffice object, чтобы потом в нем вызвать два метода, которые к нему не относятся?

Добавлено через 25 минут
Постарался минимально править код Ваша логика остается за вами.

C++ (Qt)
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
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <sstream>
using namespace std;
 
 
class RealtorOffice
{
public:
    string Location;
    string LocOfDeclarant;
    int NumberOfRooms;
    int Price;
};
 
void input();
void output();
 
 
void print(RealtorOffice &obj)
{
    cout << "Location is:"<<obj.Location<<"\nLocation of Declarant is:"<<obj.LocOfDeclarant<<"\nNumber of rooms is:"<<obj.NumberOfRooms<<"\nPrice is:"<<obj.Price<<"\n\n"<<endl;
}
 
void input()
{
    ofstream file_obj {"Input.txt", ios::app};
 
    RealtorOffice obj;
 
    obj.Location = "New_York";
    obj.LocOfDeclarant = "LA";
    obj.NumberOfRooms = 1;
    obj.Price = 150;
 
    file_obj << obj.Location << " ";
    file_obj << obj.LocOfDeclarant << " ";
    file_obj << obj.NumberOfRooms << " ";
    file_obj << obj.Price << endl;
 
    obj.Location = "Chicago";
    obj.LocOfDeclarant = "Chicago";
    obj.NumberOfRooms = 2;
    obj.Price = 250;
 
    file_obj << obj.Location << " ";
    file_obj << obj.LocOfDeclarant << " ";
    file_obj << obj.NumberOfRooms << " ";
    file_obj << obj.Price << endl;
}
 
void output()
{
    ifstream file_obj{"Input.txt"};
 
    RealtorOffice obj;
    for(string s; getline(file_obj,s);)
    {
        stringstream stream{s};
        stream >> obj.Location;
        stream >> obj.LocOfDeclarant;
        stream >> obj.NumberOfRooms;
        stream >> obj.Price;
        print(obj);
    }
 
}
 
int main()
{
    input();
    output();
 
    return 0;
}
Ваш метод записи файл неправильный. используйте этот метод как минимум(ручками ручками ).
0
0 / 0 / 0
Регистрация: 09.05.2018
Сообщений: 26
13.05.2018, 19:59 14
Cпасибо большое)
а с поиском все таки как? а то не совладать совсем, как видите
0
14 / 14 / 8
Регистрация: 10.12.2015
Сообщений: 157
13.05.2018, 20:18 15
Примерно так.

C++ (Qt)
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
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <sstream>
#include <vector>
using namespace std;
 
 
class RealtorOffice
{
public:
    string Location;
    string LocOfDeclarant;
    int NumberOfRooms;
    int Price;
};
 
void input();
void output();
 
 
void print(RealtorOffice &obj)
{
    cout << "Location is:"<<obj.Location<<"\nLocation of Declarant is:"<<obj.LocOfDeclarant<<"\nNumber of rooms is:"<<obj.NumberOfRooms<<"\nPrice is:"<<obj.Price<<"\n\n"<<endl;
}
 
void input()
{
    ofstream file_obj {"Input.txt", ios::app};
 
    RealtorOffice obj;
 
    obj.Location = "New_York";
    obj.LocOfDeclarant = "LA";
    obj.NumberOfRooms = 1;
    obj.Price = 150;
 
    file_obj << obj.Location << " ";
    file_obj << obj.LocOfDeclarant << " ";
    file_obj << obj.NumberOfRooms << " ";
    file_obj << obj.Price << endl;
 
    obj.Location = "Chicago";
    obj.LocOfDeclarant = "Chicago";
    obj.NumberOfRooms = 2;
    obj.Price = 250;
 
    file_obj << obj.Location << " ";
    file_obj << obj.LocOfDeclarant << " ";
    file_obj << obj.NumberOfRooms << " ";
    file_obj << obj.Price << endl;
}
 
void output(vector<RealtorOffice> &v)
{
    ifstream file_obj{"Input.txt"};
 
    RealtorOffice obj;
    for(string s; getline(file_obj,s);)
    {
        stringstream stream{s};
        stream >> obj.Location;
        stream >> obj.LocOfDeclarant;
        stream >> obj.NumberOfRooms;
        stream >> obj.Price;
        v.push_back(obj);
        print(obj);
    }
}
void search(vector<RealtorOffice> &v,vector<RealtorOffice> &result, int num_of_room)
{
    for(RealtorOffice &x : v)
    {
        if(x.NumberOfRooms == num_of_room)
        {
            result.push_back(x);
        }
    }
}
 
int main()
{
    input();
 
    vector<RealtorOffice> v;
    output(v);
    vector<RealtorOffice> res;
 
    int num;
    cout<< "Input count of rooms: ";
    cin >> num;
    search(v,res,num);
    cout << "Find " << res.size() << " Locations." << endl << endl;
    //чисто дегустационнася строчка - выводим результат
    for(auto&x : res)
    {
        print(x);
    }
 
    return 0;
}
0
0 / 0 / 0
Регистрация: 09.05.2018
Сообщений: 26
13.05.2018, 22:52 16
спасибо, но компилятор ругается
можете помочь и с этим?
Миниатюры
Поиск в файле по заданному значению элемента структуры  
0
14 / 14 / 8
Регистрация: 10.12.2015
Сообщений: 157
13.05.2018, 23:00 17
а так?
C++ (Qt)
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
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <sstream>
#include <vector>
using namespace std;
 
 
class RealtorOffice
{
public:
    string Location;
    string LocOfDeclarant;
    int NumberOfRooms;
    int Price;
};
 
void input();
void output();
 
 
void print(RealtorOffice &obj)
{
    cout << "Location is:"<<obj.Location<<"\nLocation of Declarant is:"<<obj.LocOfDeclarant<<"\nNumber of rooms is:"<<obj.NumberOfRooms<<"\nPrice is:"<<obj.Price<<"\n\n"<<endl;
}
 
void input()
{
    file_obj.open("Input.txt", ios::app);
 
    RealtorOffice obj;
 
    obj.Location = "New_York";
    obj.LocOfDeclarant = "LA";
    obj.NumberOfRooms = 1;
    obj.Price = 150;
 
    file_obj << obj.Location << " ";
    file_obj << obj.LocOfDeclarant << " ";
    file_obj << obj.NumberOfRooms << " ";
    file_obj << obj.Price << endl;
 
    obj.Location = "Chicago";
    obj.LocOfDeclarant = "Chicago";
    obj.NumberOfRooms = 2;
    obj.Price = 250;
 
    file_obj << obj.Location << " ";
    file_obj << obj.LocOfDeclarant << " ";
    file_obj << obj.NumberOfRooms << " ";
    file_obj << obj.Price << endl;
}
 
void output(vector<RealtorOffice> &v)
{
    ifstream file_obj;
    file_obj.open("Input.txt");
 
    RealtorOffice obj;
    for(string s; getline(file_obj,s);)
    {
        stringstream stream{s};
        stream >> obj.Location;
        stream >> obj.LocOfDeclarant;
        stream >> obj.NumberOfRooms;
        stream >> obj.Price;
        v.push_back(obj);
        print(obj);
    }
}
void search(vector<RealtorOffice> &v,vector<RealtorOffice> &result, int num_of_room)
{
    for(RealtorOffice &x : v)
    {
        if(x.NumberOfRooms == num_of_room)
        {
            result.push_back(x);
        }
    }
}
 
int main()
{
    input();
 
    vector<RealtorOffice> v;
    output(v);
    vector<RealtorOffice> res;
 
    int num;
    cout<< "Input count of rooms: ";
    cin >> num;
    search(v,res,num);
    cout << "Find " << res.size() << " Locations." << endl << endl;
 
    return 0;
}
0
0 / 0 / 0
Регистрация: 09.05.2018
Сообщений: 26
13.05.2018, 23:06 18
вот это
в 30 строчке всё вроде исправляется норм конструктором, но что сделать с остальным не знаю
C++
1
2
ofstream file_obj;
    file_obj.open("Input.txt", ios::app);
Миниатюры
Поиск в файле по заданному значению элемента структуры  
0
14 / 14 / 8
Регистрация: 10.12.2015
Сообщений: 157
13.05.2018, 23:08 19
ай, добавь перед этой строчкой

C++ (Qt)
1
ofstream file_obj;
а, ты это поправил
0
0 / 0 / 0
Регистрация: 09.05.2018
Сообщений: 26
13.05.2018, 23:11 20
все еще нет
Миниатюры
Поиск в файле по заданному значению элемента структуры  
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.05.2018, 23:11
Помогаю со студенческими работами здесь

Удаление элемента по заданному значению ключевого поля
Написать программу, реализующую хранение информации в массиве структур и выполняющую следующие...

Линейные динамические структуры: разделить упорядоченный список на два списка по заданному значению ключа
Разделить упорядоченный список на два списка по заданному значению ключа: второй список должен...

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

Структура данных. Поиск по заданному значению
Здравствуйте. Неверно работает поиск по заданному интервалу времени. Когда в интервале год один и...


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

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

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