Проблема с оператором switch, после ввода case 2: выдает ошибки...И вопрос с удалением файла

            << "         МЕНЮ:\n"
            << ".........................\n"
            << "1.Записать/дополнить файл\n"
            << "   2.Просмотреть файл\n"
            << "     3.Удадить файл\n"
            << "       4.Выйти\n" 
            << "-------------------------" << endl;

        cout << ">>> ";
        cin >> variant;
        do {
            switch (variant) {
            case 1:
                struct Disk {
                    char DiskCode[20];
                    char Singer[20];
                    int NumberOfSongs;


                };
                cout << "Введите количество CD дисков: " << endl;
                cin >> quantity;
                cin.ignore();
                Disk* arr = new Disk[quantity];

                for (int i = 0; i < quantity; i++) {
                    cout << "Введите код " << i + 1 << "-ого диска: " << endl;
                    cin.getline(arr[i].DiskCode, 20);
                    cout << "Введите исполнителя " << i + 1 << "-ого диска: " << endl;
                    cin.getline(arr[i].Singer, 20);
                    cout << "Введите количество треков " << i + 1 << "-ого диска: " << endl;
                    cin >> arr[i].NumberOfSongs;
                    cin.ignore();

                }

                string MyFileName = "MyFile.txt";
                ofstream fileOut;
                fileOut.open(MyFileName, ofstream::app);
                if (!fileOut.is_open()) {
                    cout << "Ошибка открытия файла" << endl;
                }
                else {

                    for (int i = 0; i < quantity; i++) {
                        fileOut << "Диск №" << i + 1 << "." << endl;
                        fileOut << "Код: " << arr[i].DiskCode << " " << endl;
                        fileOut << "Исполнитель: " << arr[i].Singer << " " << endl;
                        fileOut << "Количество треков: " << arr[i].NumberOfSongs << " " << endl;
                        fileOut << " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl;
                    }
                }
                fileOut.close();
                break;
            case 2:

                ifstream read;
                read.open(MyFileName, ifstream::in);
                if (!read.is_open()) {
                    cout << "Ошибка открытия файла" << endl;
                }
                else { char ch;
                    while (read.get(ch)) {
                        cout << ch << endl;
                    }
                }
                read.close();
                break;
            case 3:
                cout << "Удаление файла..." << endl;
                //remove();
                break;


            }

        } while (variant != 4); {
            cout << "Выход из программы..." << endl;
        }


        cout << "Решение индивидуального задания:\n "
            << "..............................." << endl;
            char nameSinger[20];
            cout << "Введите название исполнителя";
            cin >> nameSinger;
            int Sum = 0;
            for ( int i = 0; i < quantity; i++) {
                  if (strcmp(arr[i].Singer, nameSinger) == 0) {
                  Sum++;
              }
            }
            cout << "Количество дисков данного исполнителя: " << Sum << endl;


        return 0;
    }








    **> Обновленный код (работа с индивидуальным заданием через чтение файла):**

        #include <iostream>
    #include <fstream>
    #include <string>


    using namespace std;
    int main()
    {
        setlocale(LC_ALL, "Russian");
        int variant;
        int quantity;

        struct Disk {
            char DiskCode[20];
            char Singer[20];
            int NumberOfSongs;


        };

        do {
            cout << "-------------------------\n"
                << "         МЕНЮ:\n"
                << ".........................\n"
                << "1.Записать/дополнить файл\n"
                << "   2.Просмотреть файл\n"
                << "     3.Удадить файл\n"
                << " 4.Индивидуальное задание\n"
                << "       5.Выйти\n"
                << "-------------------------" << endl;

            cout << ">>> ";
            cin >> variant;

            switch (variant) {
            case 1: {
                cout << "Введите количество CD дисков: " << endl;
                cin >> quantity;
                cin.ignore();
                Disk* arr = new Disk[quantity];

                for (int i = 0; i < quantity; i++) {
                    cout << "Введите код " << i + 1 << "-ого диска: " << endl;
                    cin.getline(arr[i].DiskCode, 20);
                    cout << "Введите исполнителя " << i + 1 << "-ого диска: " << endl;
                    cin.getline(arr[i].Singer, 20);
                    cout << "Введите количество треков " << i + 1 << "-ого диска: " << endl;
                    cin >> arr[i].NumberOfSongs;
                    cin.ignore();

                }

                string MyFileName = "MyFile.txt";
                ofstream fileOut;
                fileOut.open(MyFileName,ofstream::app);
                if (!fileOut.is_open()) {
                    cout << "Ошибка открытия файла" << endl;
                }
                else {

                    for (int i = 0; i < quantity; i++) {
                        fileOut << "Диск №" << i + 1 << "." << endl;
                        fileOut << "Код: " << arr[i].DiskCode << " " << endl;
                        fileOut << "Исполнитель: " << arr[i].Singer << " " << endl;
                        fileOut << "Количество треков: " << arr[i].NumberOfSongs << " " << endl;
                        fileOut << " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl;
                    }
                }
                fileOut.close();

                break;
            }
            case 2: {
                string MyFileName = "MyFile.txt";
                ifstream read;
                read.open(MyFileName, ifstream::in);
                if (!read.is_open()) {
                    cout << "Ошибка открытия файла" << endl;
                }
                else {
                    char ch;
                    while (read.get(ch)) {
                        cout << ch;
                    }

                }
                read.close();
                break;
            }
            case 3: {
                string MyFileName = "MyFile.txt";
                cout << "Удаление файла..." << endl;
                remove(MyFileName.c_str());
                break;


            }




            case 4: { cout << "Решение индивидуального задания:\n  "   //Operācija: aprēķināt disku skaitu norādītajam izpildītajam.
                << "..............................." << endl;

                int Sum = 0;
                string nameSinger;
                cout << "Введите название исполнителя: ";
                //getline(cin, nameSinger);  НЕ ПОЛУЧАЕТСЯ ЧЕРЕЗ ГЕТЛАЙН
                cin >> nameSinger;
                cin.ignore();



                string MyFileName = "MyFile.txt";
                ifstream read;
                read.open(MyFileName, ifstream::in);
                if (!read.is_open()) {
                    cout << "Ошибка открытия файла" << endl;
                }
                else {

                    string str;

                    while (!read.eof()) {
                        str = "";                                                      // затираем старое значение переменной str
                        //read >> str;
                        getline(read, str);
                        cout << "str: "<< str;
                    }


                    int i = 0;
                    for (i = str.find(nameSinger,i++); i < str.size(); i = str.find(nameSinger, i + 1)) {
                        //if (strcmp(str, nameSinger) == 0) {
                        cout << i << endl;
                            Sum++;


                    }
                    //cout << Sum << endl;
                }
                read.close();




                cout << "Количество дисков данного исполнителя: " << Sum << endl;

                break;
            }
            }
        } while (variant != 5); 

            cout << "Выход из меню..." << endl;



        return 0;
    }






> **Вынесла массив за пределы кейсов. Выполнение индивидуального через массив**

    #include <iostream>
#include <fstream>
#include <string>


using namespace std;
int main()
{
    setlocale(LC_ALL, "Russian");
    int variant;
    int quantity;

    struct Disk {
        char DiskCode[20];
        char Singer[20];
        int NumberOfSongs;


    };
    Disk* arr;
    do {
        cout << "-------------------------\n"
            << "         МЕНЮ:\n"
            << ".........................\n"
            << "1.Записать/дополнить файл\n"
            << "   2.Просмотреть файл\n"
            << "     3.Удадить файл\n"
            << " 4.Индивидуальное задание\n"
            << "       4.Выйти\n"
            << "-------------------------" << endl;

        cout << ">>> ";
        cin >> variant;

        switch (variant) {
        case 1: {
            cout << "Введите количество CD дисков: " << endl;
            cin >> quantity;
            cin.ignore();
            arr = new Disk[quantity];

            for (int i = 0; i < quantity; i++) {
                cout << "Введите код " << i + 1 << "-ого диска: " << endl;
                cin.getline(arr[i].DiskCode, 20);
                cout << "Введите исполнителя " << i + 1 << "-ого диска: " << endl;
                cin.getline(arr[i].Singer, 20);
                cout << "Введите количество треков " << i + 1 << "-ого диска: " << endl;
                cin >> arr[i].NumberOfSongs;
                cin.ignore();

            }

            string MyFileName = "MyFile.txt";
            ofstream fileOut;
            fileOut.open(MyFileName, ofstream::app);
            if (!fileOut.is_open()) {
                cout << "Ошибка открытия файла" << endl;
            }
            else {

                for (int i = 0; i < quantity; i++) {
                    fileOut << "Диск №" << i + 1 << "." << endl;
                    fileOut << "Код: " << arr[i].DiskCode << " " << endl;
                    fileOut << "Исполнитель: " << arr[i].Singer << " " << endl;
                    fileOut << "Количество треков: " << arr[i].NumberOfSongs << " " << endl;
                    fileOut << " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" << endl;
                }
            }
            fileOut.close();

            break;
        }
        case 2:
        {   string MyFileName = "MyFile.txt";
        ifstream read;
        read.open(MyFileName, ifstream::in);
        if (!read.is_open()) {
            cout << "Ошибка открытия файла" << endl;
        }
        else {
            char ch;
            while (read.get(ch)) {
                cout << ch;
            }

        }
        read.close();
        break;
        }
        case 3: {
            string MyFileName = "MyFile.txt";
            cout << "Удаление файла..." << endl;
            remove(MyFileName.c_str());
            break;


        }




        case 4: { cout << "Решение индивидуального задания:\n  "   //Operācija: aprēķināt disku skaitu norādītajam izpildītajam.
            << "..............................." << endl;

            char nameSinger[20];
            cout << "Введите название исполнителя: ";
            cin >> nameSinger;
            int Sum = 0;
            for (int i = 0; i < quantity; i++) {
                if (strcmp(arr[i].Singer, nameSinger) == 0) {

                    Sum++;
                }
            }

            cout << "Количество дисков данного исполнителя: " << Sum << endl;


        }
        }
    }
              while (variant != 5); {
                  cout << "Выход из меню..." << endl;
              }

          return 0;
    }



введите сюда код

Ответы (1 шт):

Автор решения: Harry

Да все просто, смотрите - допустим, есть какой-то MyClass с конструктором, и код

case 1:  
    MyClass m;
    ....
    break;
case 2:
    m.func();

Что делать компилятору, какой код - если у вас вдруг приходит 2? Работать с неинициализированным m? Вот поэтому такие фокусы - с разделением времени жизни между case - запрещены.

Для компиляции вам нужно взять тела своих case в фигурные скобки, чтоб область видимости ограничить.

case 1:
{
    ... ваш код ...

     break;
}
case 2:
{

При этом в case 2 станет не видна

string MyFileName = "MyFile.txt";

ее надо будет вынести за пределы switch (или дублировать во втором case).

Код скомпилируется; будет ли он верно работать или нет - вопрос второй, я не смотрел.

А, да. Удаление (закрытого) файла...

#include <cstdio>

remove(MyFileName.c_str());

Еще можно воспользоваться remove из filesystem.

На будущее - не надо задавать сразу несколько "разномастных" вопросов в одном.

→ Ссылка