Тема: Пошук структури в файлі

Всім привіт!
Є завдання, можете допомогти?
Потрібно записати структури в файл і знаходити структуру по одному з полів та виводити її.
Справився лише з записом в файл, на пошуку застряг.
Ось мій код :
Файл product.h

#pragma once

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
class product
{
private:
    struct Product
    {
        int Product_ID = 0;
        string Product_Name;
        string Producer;
        string Producing_Country;
        string Material;
        string Color;
        int Number_of_Strings = 0;
        int Number_of_Frets = 0;
        int Product_Number = 0;
        double Price = 0;
    };
    int entries=0;
public:
    

    void Add_Product()
    {
            cout << "How many records do you want to add" << endl;
            int n;
            cin >> n;
            Product* str = new Product[n];
            for (int i = 0; i < n; i++)
            {
                cout << "Product ID: ";
                cin >> str[i].Product_ID;
                cin.get();
                cout << "Name: ";
                getline(cin, str[i].Product_Name);
                cout << "Producer: ";
                getline(cin, str[i].Producer);
                cout << "Country: ";
                getline(cin, str[i].Producing_Country);
                cout << "Material: ";
                getline(cin, str[i].Material);
                cout << "Color: ";
                getline(cin, str[i].Color);
                cout << "Number of strings: ";
                cin >> str[i].Number_of_Strings;
                cin.get();
                cout << "Number of frets: ";
                cin >> str[i].Number_of_Frets;
                cin.get();
                cout << "Quantity in stock: ";
                cin >> str[i].Product_Number;
                cin.get();
                cout << "Price: ";
                cin >> str[i].Price;
                cin.get();
                entries++;
            }
            ofstream fout;
            fout.open("Product.txt", ios::app);
            if (!fout.is_open())
            {
                cout << "Error opening file" << endl;
            }
            else
            {
                for (int i = 0; i < n; i++)
                {
                    fout << "Product ID: " << str[i].Product_ID << "\n" << "Name: " << str[i].Product_Name << "\n" << "Producer: " << str[i].Producer << "\n" << "Country: " << str[i].Producing_Country << "\n" << "Material: " << str[i].Material << "\n" << "Color: " << str[i].Color << "\n" << "Number of strings: " << str[i].Number_of_Strings << "\n" << "Number of frets: " << str[i].Number_of_Frets << "\n" << "Quantity in stock: " << str[i].Product_Number << "\n" << "Price: " << str[i].Price << "\n"<<"\n";
                }
            }
            fout.close();
    }
    void Search()
    {
        
    }

};

Файл Source.cpp

#include<iostream>
#include "product.h"

using namespace std;

int main()
{
    product prod;
    
    prod.Add_Product();
}

Потрібно написати метод Search.
Допоможіть будь ласка.

2

Re: Пошук структури в файлі

Вводите, що там треба шукати, відкриваєте файл на читання, читаєте структури в циклі по одній, якщо підходить - виводите. З чим саме виникає проблема?

3 Востаннє редагувалося koala (06.06.2020 23:35:38)

Re: Пошук структури в файлі

Ну і не зовсім вдалий вибір назв і розміщення класів. product - це колекція Product? Причому клас Product - це вкладений клас product, тобто правильна його назва - product::Product? Вкрай неочевидно. Винесіть Product з  product, а product перейменуйте на, скажімо, ProductList. Чи Catalog.

4

Re: Пошук структури в файлі

koala написав:

Вводите, що там треба шукати, відкриваєте файл на читання, читаєте структури в циклі по одній, якщо підходить - виводите. З чим саме виникає проблема?

Проблема в тому, що не знаю як реалізувати читання структури по одній з файлу і прирівнювати, скажімо поле Product_ID до змінної , яку буде вводити користувач в консоль.

5

Re: Пошук структури в файлі

koala написав:

Ну і не зовсім вдалий вибір назв і розміщення класів. product - це колекція Product? Причому клас Product - це вкладений клас product, тобто правильна його назва - product::Product? Вкрай неочевидно. Винесіть Product з  product, а product перейменуйте на, скажімо, ProductList. Чи Catalog.

Дякую за зауваження, звісно

6

Re: Пошук структури в файлі

Oleg Kulynych написав:

Проблема в тому, що не знаю як реалізувати читання структури по одній з файлу

Для початку продумайте формат файлу. Ви зараз пишете текстовий файл. Вам там точно потрібні назви полів? Може, без них писатимете? Тоді читання вийде майже точно як із консолі. Якщо вони там потрібні - то читайте з ними, а потім беріть лише кінець рядка.

Oleg Kulynych написав:

і прирівнювати, скажімо поле Product_ID до змінної , яку буде вводити користувач в консоль.

if(a==b)...
Подякували: Oleg Kulynych1

7

Re: Пошук структури в файлі

Дякую за відповіді, завдяки своєму другові, зміг вирішити цю проблему)

Прикріплю код, якщо комусь в майбутньому допоможе при вирішенні даної проблеми)
Код файлу work_with_product.h

#pragma once

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>

using namespace std;


class work_with_product
{
private:
    struct ProductList
    {
        int Product_ID = 0;
        string Product_Name;
        string Producer;
        string Producing_Country;
        string Material;
        string Color;
        int Number_of_Strings = 0;
        int Number_of_Frets = 0;
        int Product_Number = 0;
        double Price = 0;
    };

    ProductList str;
    string data_string;// зберігає дані структури у вигляді строки

    int entries = 0;
public:

    void Data_In_String()// записує всі дані структури в одну строку і передає дані в строку data_string
    {
        stringstream ss;
        ss << str.Product_ID << "|" << str.Product_Name << "|" << str.Producer << "|" << str.Producing_Country << "|" << str.Material << "|" << str.Color << "|" << str.Number_of_Strings << "|" << str.Number_of_Frets << "|" << str.Product_Number << "|" << str.Price << "|" << endl;
        data_string = ss.str();
    }

    void Add_Product()
    {
        cout << "How many records do you want to add" << endl;
        int n;


        ofstream fout;
        fout.open("Product.txt", ios::app);
        if (!fout.is_open())
        {
            cout << "Error opening file" << endl;
        }
        else
        {
            cin >> n;
            for (int i = 0; i < n; i++)
            {
                cout << "Product ID: ";
                cin >> str.Product_ID;
                cin.get();
                cout << "Name: ";
                getline(cin, str.Product_Name);
                cout << "Producer: ";
                getline(cin, str.Producer);
                cout << "Country: ";
                getline(cin, str.Producing_Country);
                cout << "Material: ";
                getline(cin, str.Material);
                cout << "Color: ";
                getline(cin, str.Color);
                cout << "Number of strings: ";
                cin >> str.Number_of_Strings;
                cin.get();
                cout << "Number of frets: ";
                cin >> str.Number_of_Frets;
                cin.get();
                cout << "Quantity in stock: ";
                cin >> str.Product_Number;
                cin.get();
                cout << "Price: ";
                cin >> str.Price;
                cin.get();
                entries++;

                Data_In_String();

                fout << data_string;
            }
        }
        fout.close();
    }


    void read()
    {
        string line;
        ifstream reader;
        vector<string> read_line;
        reader.open("Product.txt");

        if (reader.is_open())
        {
            while (getline(reader, line))
            {
                read_line = Devide(line, '|');

                str.Product_ID = stoi(read_line[0]);
                str.Product_Name = read_line[1];
                str.Producer = read_line[2];
                str.Producing_Country = read_line[3];
                str.Material = read_line[4];
                str.Color = read_line[5];
                str.Number_of_Strings = stoi(read_line[6]);
                str.Number_of_Frets = stoi(read_line[7]);
                str.Product_Number = stoi(read_line[8]);
                str.Price = stoi(read_line[9]);

                Print_Info();
                cout << endl;
            }
        }
        else
        {
            cout << "Не вдалося відкрити Product.txt" << endl;
        }
    }

    vector<string> Devide(string strToDevide, char delimeter)
    {
        stringstream ss(strToDevide);
        string item;
        vector<string> splitted_strings;
        while (getline(ss, item, delimeter))
        {
            splitted_strings.push_back(item);
        }
        return splitted_strings;
    }
    void Print_Info()
    {
        cout << "Product ID: " << str.Product_ID << endl;
        cout << "Name: " << str.Product_Name << endl;
        cout << "Producer: " << str.Producer << endl;
        cout << "Country: " << str.Producing_Country << endl;
        cout << "Material: " << str.Material << endl;
        cout << "Color: " << str.Color << endl;
        cout << "Number of strings: " << str.Number_of_Strings << endl;
        cout << "Number of frets: " << str.Number_of_Frets << endl;
        cout << "Quantity in stock: " << str.Product_Number << endl;
        cout << "Price: " << str.Price << endl;

        cout << endl;
    }

    string Searched()
    {
        ifstream search;
        vector<string> read_line;
        bool b1 = false;
        string searched_string;

        search.open("Product.txt", ios_base::in);
        if (!search.is_open())
        {
            cout << "Error" << endl;
        }
        else
        {
            cout << " Enter ID: ";
            int str1;
            cin >> str1;

            while (getline(search, data_string))
            {
                read_line = Devide(data_string, '|');

                str.Product_ID = stoi(read_line[0]);
                str.Product_Name = read_line[1];
                str.Producer = read_line[2];
                str.Producing_Country = read_line[3];
                str.Material = read_line[4];
                str.Color = read_line[5];
                str.Number_of_Strings = stoi(read_line[6]);
                str.Number_of_Frets = stoi(read_line[7]);
                str.Product_Number = stoi(read_line[8]);
                str.Price = stoi(read_line[9]);

                if (str1 == str.Product_ID)
                {
                    searched_string = data_string;
                    b1 = true;
                    break;
                }
                else
                {
                    b1 = false;
                }
            }

            if (b1)
            {
                cout << "Ok." << endl;
                data_string = searched_string;
                Print_Info();
                return searched_string;
            }
            else
            {
                cout << "Nothing." << endl;
                return "";
            }
        }
    }
};

Код файлу Source.cpp

#include<iostream>
#include "work_with_product.h"

using namespace std;

int main()
{
    work_with_product prod;

    prod.Searched();
}

P.S. Знаю, що код не до кінця написаний, тобто не вистачає багатьох рядків і , що в main використовується всього один метод класу, але проблема з пошуком вирішена, решту написати простіше простого)))

Подякували: koala1

8

Re: Пошук структури в файлі

struct ProductList

завдяки своєму другові, зміг вирішити цю проблему

більш нікому це не показуй. бо це як напхати до рота ковбаси і декламувати шекспіра