Проблема с оператором 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 шт):
Да все просто, смотрите - допустим, есть какой-то 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.
На будущее - не надо задавать сразу несколько "разномастных" вопросов в одном.