Проблема с применением фильтра для текстового файла C++

100
03 января 2022, 17:00

Дали задание в университете:

Практически всё доделал, однако не пойму, как выполнить условие, при котором выводиться будут только семена, которые можно высаживать с марта по май. Решил сделать для этого отдельный пункт в меню (чтобы при его выборе выводились как раз именно эти семена), пытался написать для него отдельную функцию Seasonality(), но ничего не получилось. Вот мой код:

#include <iostream>
#include <fstream>
#include <string>
#include <Windows.h>
using namespace std;
bool WorkFile = true;
void InputFile(string* output_file)
{
    fstream file("C:\\Это папка\\4 задание.bin");
    string input;
    while (getline(file, input))
    {
        *output_file += input;
        if ('\n')
            * output_file += '\n';
    }
    file.close();
}

void View()
{
    string* str = new string();
    InputFile(str);
    cout << *str << endl;
}
void Adding()
{
    string* str = new string();
    string AddStr, EditStr, NewPar, NewFile;
    InputFile(str);
    AddStr = *str;
    AddStr += '\0';
    int lengthStr = AddStr.length();
    cout << "Введите новый пункт : " << endl << endl;
    for (int i = 0; i < lengthStr; i++)
    {
        if (AddStr[i] != '*')
            EditStr += AddStr[i];
        if (AddStr[i] == '*')
        {
            cout << EditStr << " ";
            getline(cin, NewPar);
            EditStr += " ";
            EditStr += NewPar;
            int len = NewPar.length();
            if (len <= 5)
            {
                EditStr += '\t';
                EditStr += '\t';
                EditStr += '\t';
            }
            else
            {
                EditStr += '\t';
                EditStr += '\t';
            }
            EditStr += '|';
            EditStr += '*';
            EditStr += '\0';
            int length_editStr = EditStr.length();
            for (int k = 0; k < length_editStr; k++)
            {
                NewFile += EditStr[k];
            }
            EditStr.clear();
        }
    }
    ofstream file1("C:\\Это папка\\4 задание.bin");
    file1 << NewFile;
    file1.close();
}
void Delete()
{
    string* str = new string();
    string Delete, EditStr, NewFile;
    int DeletePar, DeleteColumn = 0;
    InputFile(str);
    Delete = *str;
    Delete += '\0';
    int length_editStr = Delete.length();
    cout << "Введите номер пункта, который необходимо удалить : ";
    cin >> DeletePar;
    for (int i = 0; i < length_editStr; i++)
    {
        if (Delete[i] != '|')
            EditStr += Delete[i];
        if (Delete[i] == '|')
        {
            DeleteColumn++;
            if (DeleteColumn == DeletePar)
                EditStr = "";
            else
            {
                NewFile += EditStr;
                NewFile += '|';
                EditStr.clear();
            }
        }
        if (Delete[i] == '\n')
            DeleteColumn = 0;
        if (i == length_editStr - 1)
            NewFile += '*';
    }
    ofstream File("C:\\Это папка\\4 задание.bin");
    File << NewFile;
    File.close();
}
void Edit()
{
    string* str = new string();
    string Str, EditPunct, EdStr, NewFile;
    InputFile(str);
    Str = *str;
    Str += '\0';
    int LenStr = Str.length();
    int EdPunct, EdColumn = 1;
    cout << "Введите номер пункта, который необходимо изменить(Если словочетание, слова отделять знаком '.' ) : ";
    cin >> EdPunct;
    for (int i = 0; i < LenStr; i++)
    {
        if (Str[i] != '|')
        {
            if (Str[i] == '\n')
            {
                EdColumn = 1;
                NewFile += EdStr;
                NewFile += '*';
                EdStr.clear();
            }
            EdStr += Str[i];
        }
        if (Str[i] == '|')
        {
            EdColumn++;
            EdStr += '|';
            EdStr += " ";
            i++;
            if (EdColumn == EdPunct)
            {
                cout << EdStr << " ";
                cin >> EditPunct;
                EdStr += EditPunct;
                int len = EditPunct.length();
                if (len <= 8)
                {
                    EdStr += '\t';
                    EdStr += '\t';
                }
                else
                    EdStr += '\t';
                EdStr += '|';
                while (Str[i] != '|') i++;
            }
        }
    }
    ofstream File("C:\\Это папка\\4 задание.bin");
    File << NewFile;
    File.close();
}
void AddString()
{
    string* str = new string();
    string Str, EdStr;
    InputFile(str);
    Str = *str;
    int NumPunct = 0;
    for (int i = 0; Str[i] != '*'; i++)
    {
        if (Str[i] == '|')
            NumPunct++;
        else
            continue;
    }
    for (int k = 1; k <= NumPunct; k++)
    {
        cout << "Введите пункт " << k << " : ";
        cin >> EdStr;
        Str += EdStr;
        Str += '\t';
        Str += '|';
        if (k == NumPunct)
            Str += '*';
        Str += " ";
    }
    ofstream File("C:\\Это папка\\4 задание.bin");
    File << Str;
    File.close();
}
void DeleteString()
{
    string* str = new string();
    string Str, EdStr, NewFile;
    InputFile(str);
    Str = *str;
    Str += '\0';
    int len = Str.length();
    int DelPunct, NumPunct = 1;
    cout << "Введите номер строки, которую необходимо удалить: " << endl;
    cin >> DelPunct;
    for (int i = 0; i < len; i++)
    {
        EdStr += Str[i];
        if (Str[i] == '*')
        {
            if (NumPunct == DelPunct)
                DelPunct = 0;
            else if (NumPunct != DelPunct)
            {
                NewFile += EdStr;
            }
            EdStr.clear();
            NumPunct++;
        }
    }
    ofstream File("C:\\Это папка\\4 задание.bin");
    File << NewFile;
    File.close();
}
void Seasonality()
{
    ifstream file("C:\\Это папка\\4 задание.bin");
    string* str = new string();
    string Str, Mart, April, May, EditStr;
    Mart = "Март", April = "Апрель", May = "Май";
    int lMart, lApril, lMay;
    lMart = Mart.length();
    lApril = April.length();
    lMay = May.length();
    InputFile(str);
    Str = *str;
    Str += '\0';
    int len = Str.length();
    int Cout = 1, NumStr = 0;
    if (len = lMart)
    {
        InputFile(str);
        cout << *str << endl;
    }
    else if (len = lApril)
    {
        InputFile(str);
        cout << *str << endl;
    }
    else if (len = lMay)
    {
        InputFile(str);
        cout << *str << endl;
    }
}

void Menu()
{
    fstream Menu("C:\\Это папка\\Меню.txt");
    string output, OMenu, menu;
    while (getline(Menu, output))
    {
        OMenu += output;
        if ('\n')
            OMenu += '\n';
    }
    Menu.close();
    cout << OMenu << endl;
    cout << "Введите пункт меню : ";
    getline(cin, menu);
    cout << endl << endl;
    if (menu == "Выход")
        WorkFile = false;
    else if (menu == "Просмотр")
        View();
    else if (menu == "Добавление пункта")
        Adding();
    else if (menu == "Удаление пункта")
        Delete();
    else if (menu == "Добавление строки")
        AddString();
    else if (menu == "Удаление строки")
        DeleteString();
    else if (menu == "Корректировка данных")
        Edit();
    else if (menu == "Сезон Март-Май")
        Seasonality();
}
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    while (WorkFile)
    {
        Menu();
    }
}

Результат работы программы:

Answer 1

Вы не думали реорганизовать код? на данный момент у вас все действия ведутся на уровне работы с файлом. Но можно перейти к простейшей схеме данные-представление.
Т.е. вы считываете информацию из файла в массив/вектор структур (каждая структура содержит в себе название, месяц высадки, количество семян и т.п.). А в дальнейшем вы работаете уже не напрямую с файлом, а с этим вектором, а по окончании работы вы сохраняете свой вектор в файл, чтобы все сделанные изменения сохранились на жестком диске. Такой подход значительно упростит многие рутинные операции, типа добавления, удаления, поиска по полю и т.п.

Теперь по теме.
у вас ошибка в операции сравнения if (len = lMart) и далее в блоке условий, вместо сравнения вы делаете присваивание

void Seasonality()
{
    ...
    if (len == lMart)
    {
        InputFile(str);
        cout << *str << endl;
    }
    ...
}

Однако это не решит проблему вывода, т.к. (насколько я понимаю код) вы сравниваете длину месяца с длиной строки, которая считывается из файла, а надо искать нужные вам месяцы...

READ ALSO
Кэш input после перезагрузки страницы

Кэш input после перезагрузки страницы

Подскажите есть возможность после перезагрузки страницы повторно использовать значение поля input? те

93
Ключевое слово this в параметрах метода

Ключевое слово this в параметрах метода

В процессе изучения заметил конструкцию метода:

182
C# общая структура программы!

C# общая структура программы!

Я новичокПисал программу пару недель, сейчас обнаружил, что основной файл проекта это Program

177