1 Востаннє редагувалося koala (16.05.2019 13:18:12)

Тема: Проблема з пошуком по файлу та редагуванням інформації

СрочноТерміново, допоможіть, будь ласка. Завтра здача курсової, а в мене проблема з кодом. Не працює пошук по файлу та редагування інформації в файлі. Працювало все до того моменту, поки не відредагувала введення даних. Після цього як не пробувала змінювати - результату ніякого, і я ніяк не можу зрозуміти у чому проблема. Буду дуже вдячна, якщо допоможете. Програма типу міні база-даних у файлі формату .txt .

#include <iostream>
#include <string>
#include <fstream>
#include <cstdio>
#include <locale>
#include <windows.h>

using namespace std;

void input();
void searchname();
void searcht();
void searchinfom();
void quit();
void displayall();
void search();
void deleteFile();
void editFile();

int main()
{

    system("title Database Program");
    system("cls");
    system("color 0F");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int choice;
    cout << "1.Введіть назву нового закладу " << endl;
    cout << "2.Пошук по базі даних закладів" << endl;
    cout << "3.Очистити журнал" << endl;
    cout << "4.Редагувати дані" << endl;
    cout << "5.Вийти з програми" << endl;
    cin >> choice;

    switch (choice) {
    case 1:
        input();
        break;
    case 2:
        search();
        break;
    case 3:
        deleteFile();
        break;
    case 4:
        editFile();
        break;
    case 5:
        quit();
        break;

        cin.get();


    }
}
void editFile()
{
    string name, input, newName, decision;
    string t;
    string inform;
    ifstream foodestablishment("БазаданихзакладівхарчуванняКременця.txt");
    if (!foodestablishment.eof()) {
        foodestablishment >> name >> t >> inform;
    }
    system("cls");

    cout << "Введіть назву закладу:";
    cin >> input;

    if (input == name)
    {

        cout << name << " | "  << t << " | " << inform << endl;
        cout << "Це правильно введена назва закладу[Т]ак[Н]і:";
        cin >> decision;
        if (decision == "Т") {
            cout << "Введіть нову назву:";
            cin >> newName;
            name = newName;
        }

        foodestablishment.close();
    }

    ofstream foodestablishment2("БазаданихзакладівхарчуванняКременця.txt", ios::app);
    foodestablishment2 << name << ' ' << t << ' ' << inform << endl;
    foodestablishment2.close();
    system("pause");
    main();
}

void input()
{
    string name, t, inform;
    ofstream newfoodestablishment("БазаданихзакладівхарчуванняКременця.txt", ios::app);
    system("cls");
    cout << "Додайте дані про новий заклад" << endl;
    cin >> name;
    cin.ignore();
    system("cls");
    cout << "Введіть тип закладу " << endl;
    getline(cin, t);
    cin.ignore();
    system("cls");
    cout << "Введіть коротку інформацію про заклад" << endl;
    getline(cin, inform);
    cin.ignore();
    system("cls");

    newfoodestablishment << name << " | " << t << " | " << inform << endl;
    newfoodestablishment.close();
    main();
}
void searchname()
{
    ifstream foodestablishment("БазаданихзакладівхарчуванняКременця.txt");
    string name;
    string str, line;
    string t;
    string offset; 
    string inform;
    string s;
    system("CLS");
    
    cout << "Введіть назву закладу:";
    cin >> str;
    
    while (foodestablishment >> name >> t >> inform)
    {
        if (str == name)
        {
            system("CLS");
            cout << "Заклад знайдено" << endl;
            cout << "Назва" << " | " << "Тип" << " | " << "Інформація про заклад" << endl;
            cout << "---------------------------------" << endl;
            //getline(foodestablishment, s);
            //cout << s << endl;
            cout << name << " | " << t << " | " << inform << endl;
        }
    }
    while (foodestablishment >> name)
        {
            if (str != name)
            {
                system("CLS");
                cout << "Не існує закладу з такою назвою " << endl;

            }
        }
    
    system("pause");
    main();


}
void searcht()
{
    ifstream foodestablishment("БазаданихзакладівхарчуванняКременця.txt");
    string name;
    string t;
    string ft;
    string inform;
    system("CLS");
    cout << "Введіть тип закладу: ";
    cin >> ft;
    while (foodestablishment >> name >> t >> inform) {
        if (ft == t) {
            system("CLS");
            cout << "Заклад знайдено " << endl;
            cout << "Назва" << ' ' << "Тип" << ' ' << "Інформація" << endl;
            cout << "---------------" << endl;
            cout << name << ' ' << t << ' ' << inform << endl;
        }
    }
    while (foodestablishment >> t) {
        if (ft != t) {
            system("CLS");
            cout << "Заклад не знайдено " << endl;


        }
    }
    system("pause");
    cin.get();
    main();
}
void searchinform()
{
    ifstream foodestablishment("БазаданихзакладівхарчуванняКременця.txt");
    string name;
    string t;
    string inform;
    string finform;
    system("CLS");
    cout << "Введіть інформацію про заклад:";
    cin >> finform;
    while (foodestablishment >> name >> t >> inform) {
        if (finform == inform) {
            system("cls");
            cout << "Заклад знайдено" << endl;
            cout << "Назва" << ' ' << "Тип" << ' ' << "Інформація" << endl;
            cout << "---------------" << endl;
            cout << name << ' ' << t << ' ' << inform << endl;;

        }
    }
    while (foodestablishment >> inform) {
        if (finform != inform) {
            system("CLS");
            cout << "Заклад не знайдено" << endl;
        }
    }
    system("pause");
    cin.get();
    main();
}
void quit()
{
    system("CLS");
    cout << "Дякую, що використали мою програму" << endl;
    system("pause");
    cin.get();
}
void displayall()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    ifstream foodestablishment("БазаданихзакладівхарчуванняКременця.txt");
    string t;
    string inform;
    string name;
    string str;
    system("CLS");
    cout << "Вся інформація про всі заклади" << endl;
    cout << "Назва" << " | " << "Тип" << " | " << "Інформація" << endl;
    cout << "---------------" << endl;
    while (!foodestablishment.eof()) {  
        str = " ";
        getline(foodestablishment, str);
        cout <<   str << endl;
    }
    system("pause");
    cin.get();
    main();

}
void search()
{
    string t;
    string name;
    string inform;
    int choice2;
    system("CLS");

    cout << "1.Шукати по назві" << endl;
    cout << "2.Шукати по типу" << endl;
    cout << "3.Шукати по інформації" << endl;
    cout << "4.Показати всю інформацію про всі заклади" << endl;
    cout << "5.Вернутися у попереднє меню" << endl;
    cout << "6.Закрити програму" << endl;
    cin >> choice2;

    switch (choice2) {
    case 1:
        searchname();
        break;
    case 2:
        searcht();
        break;
    case 3:
        searchinform();
        break;
    case 4:
        displayall();
        break;
    case 5:
        main();
        break;
    case 6:
        quit();
        break;
    }




}
void deleteFile()
{

    string decision;
    cout << "Ви впевнені?[Т]ак[Н]і" << endl;
    cin >> decision;
    if (decision == "Т") {
        ofstream foodestablishment("БазаданихзакладівхарчуванняКременця.txt", ios_base::trunc);
        system("cls");
        cout << "Успішно виконано!" << endl;
        system("pause");
        foodestablishment.close();
        main();
    }
    else {
        main();
    }
}

2

Re: Проблема з пошуком по файлу та редагуванням інформації

Вітаю на форумі.
1. Користуйтеся на тегом code.
2.

не відкривайте, якщо нервово сприймаєте критику

Код, якщо чесно - просто таки зібрання антипатернів (зазвичай про таке сильніше кажуть)

3. Якщо щось відбувається не так, як вам треба - не пишіть "не працює", пишіть конкретно - чого ви очікуєте і що бачите замість того.
4. Як я бачу, пишете ви у файл із роздільниками " | ", а читаєте вже без них. Гадаю, проблема саме тут.
5. Крім того, редагування, швидше за все, вимагає видалити старий запис і додати новий. А ви старий не видаляєте.

Структури ви вже вчили?

3

Re: Проблема з пошуком по файлу та редагуванням інформації

1. Не помітила, на далі буду користуватися.
2. Вірю, знаю, но на даний момент - це максимум того, що я могла самостійно написати. І навіть це мені далось не легко.
3. Добре, на далі буду більш конкретно описувати завдання, зараз просто надзвичайно хвилюся, так як дедлайн вже дуже близько, а в мене частина коду працює зовісім не так, як повинна.
4. Коли пробую читати з роздільниками, код впринципі не працює, показує проблему "відсутність оператору >>".
5. Спробую зробити, щоб видалявся.
Структури скоріше не вчила. Принаймні не можу пригадати.

4

Re: Проблема з пошуком по файлу та редагуванням інформації

Вам треба зробити ще одну річ: придумати формат для збереження даних. Стандартні оператори << та >> просто записують та читають стрічки до роздільника, а це може бути і пробіл. Тобто

file << "a" << " | " <<"b";
...
file >> a >> b;

прочитає в a "a", а в b - "|".
Найпростіше буде читати за допомогою getline із третім параметром - роздільником:

getline(file, name, '|');//читаємо до |
getline(file, t, '|');//читаємо до |
getline(file, inform);//а тут до кінця рядка

Ну і якби вже вчили структури чи посилання, можна було б зробити дві функції для запису та читання, тоді точно було б менше помилок.

Подякували: leofun01, olesiasledz, Arete3