0

Компилятор пропускает строку

    cin.getline(FileName, 100);

Вызванную внутри функции SelectFile()
Листинг:

#include <iostream>
#include <fstream>
#include <windows.h>
#include <cstdio>

using namespace std;

void Choice();
char SelectFile();


char SelectFile()
    {
        char FileName[100];
        cout << "Название файла";
        cin.getline(FileName, 100);

        cout << "\nВы ввели путь :\n";
        fstream io;
        io.open(FileName,ios::in|ios::out|ios::binary);
        if(!io)
        {
            cout << "\n\n\n\t\t\tНе удаётся открыть файл!\n\n\n";
            SelectFile();
        }
        cout << FileName;
        return 0;

    }

void Choice()
    {
        char key;
        cout << "\n\n\n\Выбери функцию, введя соответствующую цифру и затем Enter:\n\n\n";
        cout << "\t1. Выбор файла\n\t2. Подсчёт симолов в файле "<< " "<<"\n\t3. Подсчёт уникальных символов в файле и частот их появления\n\t4. Структурирование частоты появления символов средствами STL\n\t5. Сборка нового сжатого алфавита средствами STL и вывод таблицы кодируемых символов\n\t6. Кодировка данного текста в новый файл, сохранение файла\n\t7. Расшифровка файла с использованием новой таблицы символов\n";
        cin >> key;
        switch (key)
            {
                case '1':
                cout << "Давай выберем файл\n";
                SelectFile();
                break;
                case '2':
                cout << "Давай посчитаем символы в твоём файле\n";
                break;
                case '3':
                cout << "Давай посчитаем уникальные символы в твоём файле\n";
                break;
                case '4':
                cout << "Давай структурируем частоты появления символов твоего файла\n";
                break;
                case '5':
                cout << "Давай соберём новый сжатый алфавит для твоего файла";
                break;
                case '6':
                cout << "Давай зашифруем текст в новый файл\n";
                break;
                case '7':
                cout << "Давай расшифруем текст из зашифрованного файла";
                break;
                default: 
                cout << "\n\n\n\n\t\t\t\tОшибка ввода!\n\n\n\n\n";
                system("pause");
                Choice();

            }

    }



int main()
{
    setlocale(LC_ALL, "RUS");
    char l;
    cin >> l;
    cout << "Приветствие\n\n\n";
    system("pause");
    Choice();


    system("pause");
}
  • Не пропускает. Когда вы вводите цифру 1 и жмёте энтер, вы в cin >> key читаете только цифру 1, а энтер не читаете. Поэтому строка cin.getline(FileName, 100); читает этот ваш оставшийся энтер после цифры 1, и название файла получается пустым – andreymal Jan 02 '20 at 02:08
  • По той же причине можно сразу после запуска написать 01foo.txt и нажать энтер, и таким образом в переменной FileName автоматически окажется foo.txt. Нолик прочитается в строке cin >> l, единичка в строке cin >> key, а всё остальное до энтера отправится в getline – andreymal Jan 02 '20 at 02:09
  • @andreymal, спасибо за прояснения! Каким образом тогда корректно считать строку? – Surt Red Jan 02 '20 at 02:24
  • после чтения числа пропустите остальную строку: cin.ignore(1000, '\n'); – AR Hovsepyan Jan 02 '20 at 06:09
  • 2
    Особенно радует в вопросе безапелляционность - не "я не понимаю", на худой конец - "программа работает не так, как нужно" - нет, сразу злокозненный "компилятор пропускает строку"... мама, наверное, сразу поверит, что это кот Васька банку с вареньем с полки уронил и не будет наказывать... :) – Harry Jan 02 '20 at 06:16
  • @Harry, признаю, не понимаю полностью. Просто хотел ориентироваться на формулировку вопроса, как вопроса и не писать в заголовке "я не понимаю". В любом случае спасибо за фидбек! теперь всё работает! – Surt Red Jan 02 '20 at 11:29

0 Answers0