0

Пишу программу, которая сравнивает строку из текстового файла с строкой, введенной с клавиатуры. Но при первом проходе в цикле игнорируется строка ввода (пометил комментарием), после первой итерации ввод работает корректно. С чем это может быть связано?

P.S. Тестирую на английском, т.к. не знаю немецкого.

class Program
{
    public static string PathSetRus()
    {
        string a;
        Console.WriteLine("Введите путь для файла русских слов:");
        a = Console.ReadLine();
        return a;
    }
    public static string PathSetGer()
    {
        string a;
        Console.WriteLine("Введите путь для файла немецких слов:");
        a = Console.ReadLine();
        Console.WriteLine();
        return a;
    }
    public bool IsValid(char ch)
    {
        if (ch < '1' | ch > '2') return true;
        else return false;
    }
    public static bool TrCh()
    {
        bool flag=true;
        char ins;
        Program y = new Program();
        try
        {
            for(; ; )
            {
                do
                {
                    Console.WriteLine("Выберите режим перевода (1 или 2):\n1.Русский-Немецкий\n2.Немецкий-Русский");
                    do
                    {
                        ins = (char)Console.Read();
                    }
                    while (ins == '\n' | ins == '\r');
                }
                while (y.IsValid(ins));
                Console.WriteLine();
                switch (ins)
                {
                    case ('1'):
                        flag = true;
                        break;
                    case ('2'):
                        flag = false;
                        break;
                }
                break;
            }
    }
    catch (Exception e)
    {
        Console.WriteLine(&quot;{0} Exception caught.&quot;, e);
    }
    return flag;
}

static void Main() { string r = PathSetRus(); //Путь для рус.слов string g = PathSetGer(); //Путь для нем.слов

    bool f = TrCh(); //Выбранный режим перевода

    string line1 = &quot;&quot;, line2, ans = &quot;&quot;;

    if (f)
    {
        try
        {

            //Pass the file path and file name to the StreamReader constructor
            StreamReader rus = new StreamReader(r);
            StreamReader ger = new StreamReader(g);
            while (line1 != null)
            {
                //Read the line of text
                line1 = rus.ReadLine();
                line2 = ger.ReadLine();

                while ((line1 != null) &amp;&amp; (ans != line2))
                {
                    Console.WriteLine(&quot;Переведите на немецкий слово &quot; + line1);
                    ans = Console.ReadLine(); //Строка игнорируется при первой итерации
                    Console.WriteLine();
                    if (ans != line2)
                    {
                        Console.WriteLine(&quot;Ошибка,попробуйте еще&quot;);
                        Console.WriteLine();
                    }
                }

            }
            rus.Close();
            ger.Close();

        }
        catch (Exception e)
        {
            Console.WriteLine(&quot;Exception: &quot; + e.Message);
        }
        finally
        {
            Console.WriteLine(&quot;Вы отлично поработали!&quot;);
        }
    }

Консоль выглядит так: Консоль

1 Answers1

0

Проблема в методе TRch, он невычищает буфер клавы после себя и перенос строки попадает в следующий ридлайн.

Плюс он сложный и немного запутан, я переписал на попроще:

public static bool TrCh()
{
    Console.WriteLine("Выберите режим перевода (1 или 2):\n1.Русский-Немецкий\n2.Немецкий-Русский");
    char input = '\0';
    try
    {
        while (true)
        {
            input = Console.ReadKey(true).KeyChar;
            switch (input)
            {
                case '1':
                    return true;
                case '2':
                    return false;
            }
        }
    }
    finally
    {
        Console.WriteLine(input);
        while (Console.KeyAvailable) // чистка буфера клавы
            Console.ReadKey(true);
    }
}

Как более гибкую альтернативу, можете посмотреть безотказный ввод числа с менюшками здесь.

aepot
  • 49,560