Поток из консоли и с чем его едят

116
23 ноября 2021, 23:50

Мне стало интересно, что именно происходит в данном коде:

using System;
using System.IO;
class VideoSharp {
    static void Main () {
        int count = 0;
        Stream str = Console.OpenStandardInput ();
        while (true) {
            int x = str.ReadByte ();
            if (x == -1)
                break;
            count++;
        }
        Console.WriteLine (count);
    }
}

найти всю нужную информацию не смог.
В str мы помещаем поток ввода консоли, а дальше идёт в цикле while str.ReadByte ().

Но что именно делает этот метод?

Почему он останавливает программу (тот же вопрос и к Console.Read ()), ожидая ввода, но только один раз (После нажатия Enter он не будет останавливать программу на 2, 3 и т.д. символах)?

Почему он не возвращает -1 в моём коде, когда прошёлся по всем байтам?

Answer 1

Но что именно делает этот код?

Данный код проходит по всем символам, введённым в консоли за один раз, и считает количество введённых байтов. Стоит так же учитывать, что данная программа рассматривает нажатие клавиши Enter как ввод символов CR и LF (по данной теме советую почитать Wikipedia - NewLine).

Почему он останавливает программу, но только один раз?

Данная программа приостанавливается, ожидая ввода, бесконечное число раз благодаря циклу while (true) { }. Программа ожидает ввод символов в поток, отправка которых в программу в данном случае осуществляется посредством нажатия клавиши Enter. Следовательно, после каждого нажатия клавиши ввода программа будет останавливаться, считать количество байтов (в случае с ASCII символами: количество символов = количество байтов). Из-за того что поток не закрывается, переменная x никогда не принимает значение -1, из-за чего и происходит возврат к вводу символов в консоль.

Почему он не возвращает -1 в моём коде, когда прошёлся по всем байтам?

Каким образом вы предполагаете данный код должен возвращать значение? Данный код находится в методе с типом возвращаемого значения void, он по определению не может возвращать какое-либо значение. Если вы имели в виду строку Console.WriteLine (count);, то из-за бесконечного цикла while данный код не выполняется никогда.

Если вы напишите в комментарий чего именно вы хотели достичь, я попытаюсь помочь вам с кодом.

EDIT 0: Стоит упомянуть, что символ окончания потока (а точнее символ EOF Wikipedia - End-of-file) вводится в консоль ОС Windows по нажатию комбинации клавиш Ctrl+Z. При передаче данного символа в поток нажатием клавиши Enter получается выйти из цикла и достичь вывода переменной count в консоль.

READ ALSO
Обновление базы данных на сервере данными полученными по почте

Обновление базы данных на сервере данными полученными по почте

Необходимо создать личный кабинет клиента бухгалтерской фирмыВ личном кабинете для пользователя будет доступна информация о сдаче налоговой...

116
Не передается let-переменная js в переменную php методом POST в форме

Не передается let-переменная js в переменную php методом POST в форме

Есть форма, которой нужно передать в php значения переменных var и letПеременные var передаются без проблем, а let не хотят

104
Ошибка "[22-Nov-2019 13:28:47 America/New_York] PHP Notice: Undefined offset: 0 in /home/thedbfky/beta_html/actions/test.php on line 4"

Ошибка "[22-Nov-2019 13:28:47 America/New_York] PHP Notice: Undefined offset: 0 in /home/thedbfky/beta_html/actions/test.php on line 4"

После каждого запуска скрипта вылетает ошибка: [Время + Дата] PHP Notice: Undefined offset: 0 in Путь on line 4

188