Проскакивает команда get line
Написал код для работы с файлами с использованием массива. Для корректной работы getline использовал команду cin.ignore(numeric_limits::max(), '\n'), однако она не работает.
Вот код, не работает, который находится в последней части кода, когда происходит сохранение в файл. Часть кода после этой ошибки тоже не работает.
Буду рад любой помощи.
int delete_in_file()
{
setlocale(0, ""); // указание размера массива
int flag = 0;
int massive_length;
string k;
cout << "Введите размер массива: ";
cin >> massive_length;
cout << " --------------------" << endl;
string arr[massive_length]; // создание массива и его заполнение
cout << "Заполните ваш массив: " << endl;
for (int i = 0; i < massive_length; i++)
{
flag++;
cout << "[" << i + 1 << "]" << ": ";
if (flag == 1)
{
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
getline(cin, arr[i]);
}
cout << "\nВаш массив: " << endl; // чтение массива
for (int i = 0; i < massive_length; i++)
{
cout << "[" << i + 1 << "]" << ": " << arr[i] << endl;
}
cout << " --------------------" << endl;
string str; // выбор строки для работы
cout << "Введите номер строки(из массива), с которой вы хотите работать: ";
flag++;
if (flag == 1)
{
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
getline(cin, arr[massive_length]);
cout << " --------------------" << endl;
string str2; // работа со строкой
for (int i = 0; i < massive_length; i++)
{
str2 = arr[i];
}
int a, b;
cout << "Введите начальный символ(с которого начнется удаление): ";
cin >> a;
cout << "Введите количество символов, которое будет удалено: ";
cin >> b;
string c = str2.erase(a, b);
cout << "Ваша строка после удаления: " << c << endl;
cout << " --------------------" << endl;
string input_data; // открытие файла для сохранения
cout << "Введите название вашего файла(с разрешением): ";
flag++;
if (flag == 1)
{
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
getline(cin, input_data);
fstream file(input_data); // сохранение в файл
if (!file)
{
cout << "Ошибка при открытии файла." << endl;
return 1;
}
for (int i = 0; i < massive_length; i++)
{
file << arr[i] << endl;
}
file.close();
cout << " --------------------" << endl;
return 0;
}
Ответы (1 шт):
Уберите переменную flag
и используйте cin.ignore
сразу после cin
, чтобы очистить буфер после ввода целого числа, как только ввод завершен. Это позволяет избежать проблем с остатками ввода при дальнейшем использовании getline:
cin.ignore(numeric_limits<streamsize>::max(), '\n');
Надо использовать индекс, выбранный пользователем, чтобы правильно обращаться к массиву. Индексация в массиве начинается с 0, поэтому вычитаем 1 из введенного номера строки:
getline(cin, arr[massive_length]);
Нужно добавить проверку, чтобы удостовериться, что номер строки, введенный пользователем, находится в допустимом диапазоне (от 1 до massive_length
):
if (line_index < 1 || line_index > massive_length) {
Здесь также нужно добавить проверку, чтобы удостовериться, что начальный индекс и длина удаляемой подстроки корректны, что помогает избежать выхода за границы строки:
if (a < 0 || a >= str2.length() || (a + b) > str2.length()) {
Можно использовать ofstream вместо fstream, как оптимизацию, чтобы создать файл на запись, так как в данном случае нам нужно только записывать данные в файл, а не одновременно читать из него, но это уже дополнение:
ofstream file(input_data);