24 / 24 / 7
Регистрация: 23.03.2013
Сообщений: 140
1

Прочитать все из входного потока

12.10.2014, 12:37. Показов 5085. Ответов 23
Метки нет (Все метки)

Начал учиться программировать на c#, решая задачки на сайте олимпиадного программирования. Сразу же столкнулся с проблемой: как получить весь входной поток?

Сама задача:

Исходные данные
Входной поток содержит набор целых чисел Ai (0 ≤ Ai ≤ 1018), отделённых друг от друга произвольным количеством пробелов и переводов строк. Размер входного потока не превышает 256 КБ.
Результат
Для каждого числа Ai, начиная с последнего и заканчивая первым, в отдельной строке вывести его квадратный корень не менее чем с четырьмя знаками после десятичной точки.

Пример
исходные данные
Код
 1427  0   

   876652098643267843 
5276538
результат
Код
2297.0716
936297014.1164
0.0000
37.7757
Решать задачу за меня не надо Просто, пожалуйста, подскажите, как прочитать входной поток
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.10.2014, 12:37
Ответы с готовыми решениями:

Очистка входного потока
Здравствуйте уважаемые! Пишу игрушку на C#, возникла проблема: в одном месте (в меню выбора...

Нужно прочитать со входного потока число и строку, как проигнорировать лишние символы?
Всем привет! Со входного потока нужно прочитать число, а затем в новой строке string... Гугл мне...

Из входного потока прочитать литеру за литерой, пока не встретится не цифра или конец файла
char * find-const ( ) , 1)помещает в буфер строки digit литеру буфера buf_lit, 2)из входного...

Вывести все слова входного потока в порядке увеличения их длины
Здравствуйте . Задание: Вывести все слова входного потока в порядке увеличения их длины . Надеюсь...

23
136 / 138 / 18
Регистрация: 26.07.2010
Сообщений: 911
12.10.2014, 12:43 2
Для начала следует ознакомиться с этим.
Далее, предполагая, что вы получаете данные из файла просмотреть это.

И в конце концов это решит все проблемы.
1
24 / 24 / 7
Регистрация: 23.03.2013
Сообщений: 140
12.10.2014, 12:49  [ТС] 3
n1l,
в том то и сложность, что ввод осуществляется с клавиатуры.
0
865 / 388 / 158
Регистрация: 08.02.2013
Сообщений: 674
12.10.2014, 12:55 4
Лучший ответ Сообщение было отмечено Kotlerman как решение

Решение

Kotlerman,
C#
1
string s = Console.In.ReadToEnd();
1
136 / 138 / 18
Регистрация: 26.07.2010
Сообщений: 911
12.10.2014, 12:58 5
Так гораздо легче, на в самом деле.
Console.ReadKey до определенного условия конца входных данных. Например заканчиваем читать если символ равен букве, или определенное букве или последовательности end. И так далее.
0
865 / 388 / 158
Регистрация: 08.02.2013
Сообщений: 674
12.10.2014, 13:02 6
n1l, это немного не то, что я написал. Console.ReadKey обрабатывает нажатие кнопки именно. Но входной поток можно перенаправить с клавиатуры в файл, например явно присвоив Console.SetIn(...) или запустив программу так:
MyProgram.exe < InputFile.txt
В этом случае Console.ReadKey вылетит с исключением
0
136 / 138 / 18
Регистрация: 26.07.2010
Сообщений: 911
12.10.2014, 13:20 7
C#
1
2
3
4
            while (Console.ReadKey(true).KeyChar != 0)
            {
                Console.WriteLine("no");
            }
никакого исключения.

А как остановить чтение из TextWriter.ReadToEnd()?

Добавлено через 6 минут
Не так ввел команду, да есть исключение.
0
865 / 388 / 158
Регистрация: 08.02.2013
Сообщений: 674
12.10.2014, 13:21 8
n1l, зачем его останавливать? Нужно завершить входной поток. Если вы пытаетесь проделать это с клавиатурой нажмите Ctrl+Z затем Enter
1
24 / 24 / 7
Регистрация: 23.03.2013
Сообщений: 140
12.10.2014, 13:21  [ТС] 9
rRczZZ, n1l,
я полагаю, что на система автоматических проверок на том сайте как раз делает так:
Код
MyProgram.exe < InputFile.txt
Сейчас буду пробовать)
0
136 / 138 / 18
Регистрация: 26.07.2010
Сообщений: 911
12.10.2014, 13:34 10
Признаю, недопонимал как можно работать с входным потоком.
Но сейчас, разобравшись, скажу, что Console readtoend тут не подходит. Потому что вернет вам весь тот мусор от которого потом вам же придется избавляться. Контрольные символы для него ничего не значат. Считаю, что Вам нужен объект именно stream. Благо в задаче указано число байтов для чтения.

вот
0
865 / 388 / 158
Регистрация: 08.02.2013
Сообщений: 674
12.10.2014, 13:51 11
Цитата Сообщение от n1l Посмотреть сообщение
тот мусор от которого потом вам же придется избавляться
Это какой?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[SecuritySafeCritical, HostProtection(SecurityAction.LinkDemand, UI=true)]
public static TextReader Console.get_In()
{
    if (_in == null)
    {
        lock (InternalSyncObject)
        {
            if (_in == null)
            {
                TextReader @null;
                Stream stream = OpenStandardInput(0x100); // Опа!
                if (stream == Stream.Null)
                {
                    @null = StreamReader.Null;
                }
                else
                {
                    Encoding inputEncoding = InputEncoding;
                    @null = TextReader.Synchronized(new StreamReader(stream, inputEncoding, false, 0x100, true));
                }
                Thread.MemoryBarrier();
                _in = @null;
            }
        }
    }
    return _in;
}
0
136 / 138 / 18
Регистрация: 26.07.2010
Сообщений: 911
12.10.2014, 14:00 12
Ну как какой, непроизвольное кол-во пробелов и переносов строк.
0
865 / 388 / 158
Регистрация: 08.02.2013
Сообщений: 674
12.10.2014, 14:06 13
n1l, ну так даже если с клавиатуры читать они будут присутствовать, от \r\n обычно избавляются внутри Console.ReadLine (но и в TextReader тоже есть ReadLine, собственно это одно и тоже). В любом случае String.Split справится с ними со всеми если передать null в качестве первого аргумента. А вот "всяких управляющих символов типа конца потока, \0" ни там ни там не будет если это не предусмотрено.
0
136 / 138 / 18
Регистрация: 26.07.2010
Сообщений: 911
12.10.2014, 14:09 14
Они везде будут присутствовать, просто в олимпиадной задаче, цель которой наименьшее время, лучше их удалять\пропускать при чтении. Конечно можно потом вызывать split у получившейся строки, но это двойной проход по данным, что не есть хорошо.
0
865 / 388 / 158
Регистрация: 08.02.2013
Сообщений: 674
12.10.2014, 14:20 15
n1l, тогда можно использовать Console.In.Read(). В любом случае с диска будет идти блочное чтение, а алгоритмы обычно оценивают по сложности O(3*n) = O(n), 3*n потому, что еще нужно будет пройти каждый выделенный кусочек после Split.

Добавлено через 3 минуты
да, кстати, на spoj.com есть серия задач где баллы дают за 1/длину кода
0
136 / 138 / 18
Регистрация: 26.07.2010
Сообщений: 911
12.10.2014, 14:20 16
И лишиться преимущества оставленного процессорного времени. Так как всю эту работу можно на потоки разделить и в итоге за 1 проход полностью решить задачу.
0
865 / 388 / 158
Регистрация: 08.02.2013
Сообщений: 674
12.10.2014, 14:22 17
n1l, как вы разделите на потоки процесс чтения с диска? Или ввода с клавиатуры
0
136 / 138 / 18
Регистрация: 26.07.2010
Сообщений: 911
12.10.2014, 14:24 18
Открываем стрим, считываем кусочек в буффер, отправляем на обработку.
0
865 / 388 / 158
Регистрация: 08.02.2013
Сообщений: 674
12.10.2014, 14:31 19
n1l, потоки в этой задаче лишние, основная потеря скорости состоит в чтении с диска, которое распараллелить в большинстве случаев нельзя механически. Но, действительно, если важно время тут описан один из самых самых быстрых способов чтения/записи, а вот рейтинговая таблица показывает, что писать нужно именно на c++ в этом случае ^_^
0
870 / 720 / 304
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
12.10.2014, 14:31 20
Kotlerman,
Я так понимаю это задача с тимуса, у них есть FAQ. Там все описано
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.10.2014, 14:31
Помогаю со студенческими работами здесь

Вывести все слова входного потока, заканчивающиеся заданной последовательностью символов
Пожалуйста помогите!

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

Все слова из входного потока поместить в выходной поток с новой строки
Здравствуйте уважаемые программисты помогите пожалуйста текст задачи: все слова из входного...

VC++6.0, как из порожденного потока прочитать переменную главного потока?
Visual C++ 6.0 SP5 Простое диалоговое окно, (MFC) созданное мастером среды VC По нажатию на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru