Проскакивает команда 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 шт):

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

Уберите переменную 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);
→ Ссылка