Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 06.08.2023
Сообщений: 4

Как вывести в консоль текст построчно?

06.08.2023, 18:20. Показов 3046. Ответов 44
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
добрый день.
подскажите пожалуйста, как вывести в консоль текст построчно. задача, при нажатие "ввод", чтобы выводились строки последовательно.
спасибо

Добавлено через 1 час 44 минуты
пишу функцию.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        static         string Conclusion()
        {
            string conclusion, a = "";
            if (File.Exists(Path) == true)
            {
                using (StreamReader path = new StreamReader(Path))
                    while ((conclusion = path.ReadLine()) != null)
                    {
                        a = conclusion;
                        Console.ReadLine();
                        return a;
                    }
            }
            else
            {
                return "нет файла!";
            }
если вместо return, пишу Console.WriteLine, всё работает. с return пишет ошибку: "не все пути к коду возвращают значение".
подскажите, что правильно надо написать? что бы при нажатие enter выводилась очередная строка?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.08.2023, 18:20
Ответы с готовыми решениями:

Вывод текст в консоль (не получается вывести текст в консоль; попытка была в разделе menu, но вывелся ужас)
d_d1 segment ;начало сегмента данных m1 db 23, '=========MENU=========', 23, '$' m2 db 23, '| 1- slodjenie |', 23, '$' m3 db...

Как построчно вывести текст файла
Как построчно вывести текст файла

Как построчно вывести текст из документа?
Не просто построчно, а так, чтобы при каждом вызове функции, она возвращала следующую строку. Я знаю про while(getline()) - но это...

44
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18418 / 14349 / 5371
Регистрация: 17.03.2014
Сообщений: 29,033
Записей в блоге: 1
08.08.2023, 15:05
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от wizard41 Посмотреть сообщение
Потому что ТС вроде хотел "вытащить" из файла одну конкретную строку, а не пачку их.
Он вроде хочет вывести содержимое файла в консоль, построчно, по нажатию "Ввод" и с минимальными затратами памяти. Вариант предложенный January29 с использованием File.ReadLines именно это и делает. Какая польза от ваших предложений (в рамках данной задачи, и для начинающего) мне непонятно. Вы ссылались на идею Usaga с использованием буфера фиксированного размера. Такая реализация должна быть более эффективной, да, её реализация врядли по плечу начинающему. Ему достаточно File.ReadLines или StreamReader с циклом.

Цитата Сообщение от wizard41 Посмотреть сообщение
Вот какая разница в свете вопроса ТСа - итерироваться по File.ReadLines или по всем уже считанным строкам File.ReadAllLines? Т.е. что это концептуально меняет при работе с обычными файлами не понятно...
Я получаю другие результаты. Вариант с File.ReadAllLines постоянно занимает больше памяти. Это станет заметно если добавить вызов GetMemory сразу после чтения файла.
C#
1
2
3
4
5
6
GetMemory();
string[] filelines = File.ReadAllLines(file);
GetMemory();
foreach (string s in filelines)
    Console.WriteLine(s);
GetMemory();
И если вы хотите понять в чем разница, то возьмите файл гораздо большего размера.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
08.08.2023, 15:35
OwenGlendower, да, ReadAllLines всегда больше, но сравнительно не на много. Мне не ясна сама идея этого всего. Предположим, считанные строки мы никуда не сохраняем (записываем), а просто выводим на консоль. Тогда да, File.ReadLines полностью подходит. Но если начать все считанное куда-нибудь сохранять, например в список, то преимущества ReadLines нивелируются. Кстати, если вот копнуть глубже, куда-нибудь в сторону занимаемой памяти вывода самой консоли...
Цитата Сообщение от OwenGlendower Посмотреть сообщение
возьмите файл гораздо большего размера.
На 100К записях результаты такие:
метод January29 88 MB
метод с ReadAllLines 104 MB

Может быть я все-таки чего-то не уловил, но как я понял: например, считали строку №3, вывели в консоль. Далее - нужно считать только строку №4 без всего остального. Т.е. не накапливая их в памяти процесса...

Добавлено через 17 минут
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Ему достаточно File.ReadLines или StreamReader с циклом.
Без StreamReader'а менее затратно тогда:
C#
1
2
foreach (string s in File.ReadLines(file))
    Console.WriteLine(s + " " + GetMemory());
По началу поднимается до 14Mb, но после 30К строк стабильно 12 Mb.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18418 / 14349 / 5371
Регистрация: 17.03.2014
Сообщений: 29,033
Записей в блоге: 1
08.08.2023, 15:36
Цитата Сообщение от wizard41 Посмотреть сообщение
Предположим, считанные строки мы никуда не сохраняем (записываем), а просто выводим на консоль. Тогда да, File.ReadLines полностью подходит.
Именно в этом и состоит задание ТСа.

Цитата Сообщение от wizard41 Посмотреть сообщение
Но если начать все считанное куда-нибудь сохранять, например в список, то преимущества ReadLines нивелируются.
ТСу это не требуется.

Цитата Сообщение от wizard41 Посмотреть сообщение
На 100К записях результаты такие:
метод January29 88 MB
метод с ReadAllLines 104 MB
Попробуйте 6 миллионов чтобы файл был в районе 100 Мб как у ТСа.

Цитата Сообщение от wizard41 Посмотреть сообщение
Может быть я все-таки чего-то не уловил, но как я понял: например, считали строку №3, вывели в консоль. Далее - нужно считать только строку №4 без всего остального. Т.е. не накапливая их в памяти процесса...
Я понял - вы напрасно усложняете задачу.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
08.08.2023, 15:41
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Попробуйте 6 миллионов
ну понятно что расход будет кратно расти, причем не обязательно по линейной хар-ке. А вывод будет долгий...
Вопрос на самом деле интересный, я тоже когда-то им задавался. В целях, так сказать исследования проблемы подключился. Ни в коем случае не навязываю никому своих мыслей..
1
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
08.08.2023, 18:33
wizard41, я както пропустил, разве ТС говорил что ему нужно чтение выборочной строки? Вроде как вопрос просто чтобы весь файл ее грузитт в память
0
3271 / 3378 / 559
Регистрация: 17.02.2019
Сообщений: 5,295
08.08.2023, 18:53
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Пропустить не получится, но следующие он читать не будет, если его не просить
а если так, или тоже будет
C#
1
2
int linesFile = 2; // допустим строку 2
Console.WriteLine(File .ReadLines(Path).ElementAtOrDefault(linesFile));
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18418 / 14349 / 5371
Регистрация: 17.03.2014
Сообщений: 29,033
Записей в блоге: 1
08.08.2023, 19:36
Цитата Сообщение от January29 Посмотреть сообщение
а если так, или тоже будет
C#
1
2
int linesFile = 2; // допустим строку 2
Console.WriteLine(File .ReadLines(Path).ElementAtOrDefault(linesFile));
Если посмотреть реализацию ElementAtOrDefault, то будет видно что перебор делается до index включительно и дальше не идет. Что логично.
1
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
08.08.2023, 22:37
Цитата Сообщение от Wolfdp Посмотреть сообщение
разве ТС говорил что ему нужно чтение выборочной строки?
если перефразировать условие ТС, то должно быть примерно так: нажал кнопку -> прочитал следующую строку из файла. Т.е. мы как бы забываем про уже считанные, и не читаем следующие. Ну по типу бинарного чтения - считали N байт с таким-то смещением...

Добавлено через 3 минуты
Цитата Сообщение от January29 Посмотреть сообщение
а если так, или тоже будет
Цитата Сообщение от January29 Посмотреть сообщение
// допустим строку 2
то это будет строка 3. Про индексацию с 0 не забываем...

Добавлено через 2 минуты
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Если посмотреть реализацию ElementAtOrDefault
OwenGlendower, ну что-то не очень похоже, на самом деле. время чтения указанной строки слишком мало, против чтения ее же в цикле. На реализацию не смотрел.
1
3271 / 3378 / 559
Регистрация: 17.02.2019
Сообщений: 5,295
08.08.2023, 23:00
Цитата Сообщение от wizard41 Посмотреть сообщение
то это будет строка 3. Про индексацию с 0 не забываем...
Ну да третья, про нулевую не забываю.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18418 / 14349 / 5371
Регистрация: 17.03.2014
Сообщений: 29,033
Записей в блоге: 1
08.08.2023, 23:13
Цитата Сообщение от wizard41 Посмотреть сообщение
если перефразировать условие ТС, то должно быть примерно так: нажал кнопку -> прочитал следующую строку из файла.
Из этого не следует что нужно каждый раз начинать с начала. Повторюсь - вы напрасно усложняете задачу.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
08.08.2023, 23:19
Цитата Сообщение от wizard41 Посмотреть сообщение
если перефразировать условие ТС, то должно быть примерно так: нажал кнопку -> прочитал следующую строку из файла. Т.е. мы как бы забываем про уже считанные, и не читаем следующие. Ну по типу бинарного чтения - считали N байт с таким-то смещением...
Выглядит как абсолютное ненужное накручивание условий. Файл считывается последовательно, то что между итерациями ждем пока юзер тыкнет enter -- погоды не делает. Плюс это учебный материал, его усложнение на пользу не идет.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
08.08.2023, 23:42
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Из этого не следует что следует каждый раз начинать с начала.
Простите меня за дотошность, но именно так я понял задачу - считать из файла следующую N-ную строку не трогая остальных (предыдущих). Понятно, что я уже начал лезть в перспективу, куда-то дальше, чем требуется автору. Но это лишь простое обсуждение вариантов в рамках уже заданного вопроса. Не создавать же новую тему для того, что практически не нужно и не применяется в практике.
OwenGlendower, последний вопрос если позволите: из этого вашего поста, получается после чтения перед циклом GC ее съедает, но оставляет ссылку на массив (адрес в памяти)? Ссылка на массив строк остается и вызывается в дальнейшем. Неочевидный нюанс, или я неправильно (и студия тоже) показывает мне реальную выделенную память текущей задачи...?

Добавлено через 2 минуты
Цитата Сообщение от Wolfdp Посмотреть сообщение
ждем пока юзер тыкнет enter
Wolfdp, ну это понятно что по клавише или еще как-то он читает следующую строку. Этот механизм даже не подлежит обсуждению - я затрагиваю совсем другие вещи. Ну пусть он 6 миллионов раз тычет клавишу для просмотра всех строк - я делаю это просто в цикле - что это меняет?
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
08.08.2023, 23:46
Окей, я придумал ситуацию, которая не противоречит оригинальному условию, но при этом потребует дополнительной оптимизации -- каждая строка будет ооооооочень длинной, скажем на десятки миллионов символов. Вот тут можно с уверенностью сказать что необходимо считывать поблочно (приблизительно так)

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var buff = new char[10]; // 10 -- исключительно для проверки работоспособности
 
var count = 0;
do
{
    count = await file.ReadAsync(buff);
    var startIndex = 0;
    for (var i = 0; i < count; i++)
    {
        if (buff[i] == '\n')
        {
            Console.Write(buff, startIndex, i - startIndex);
            Console.WriteLine();
            startIndex = i + 1;
            Console.ReadKey();
        }
    }
    Console.Write(buff, startIndex, count - startIndex);
}
while (count > 0);
 
Console.ReadKey();
Но честно говоря, на месте преподавателя я бы конечно похвалил ученика, но также сказал бы на будущее не усложнять себе жизнь за зря, так как "скорость написания программы тоже критична". А вот тому кто принесет решение через ReadLine или ReadLines просто бы сказал "хорошо" без лишних напутствий.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18418 / 14349 / 5371
Регистрация: 17.03.2014
Сообщений: 29,033
Записей в блоге: 1
08.08.2023, 23:48
Цитата Сообщение от wizard41 Посмотреть сообщение
последний вопрос если позволите: из этого вашего поста, получается после чтения перед циклом GC ее съедает, но оставляет ссылку на массив (адрес в памяти)? Ссылка на массив строк остается и вызывается в дальнейшем. Неочевидный нюанс, или я неправильно (и студия тоже) показывает мне реальную выделенную память текущей задачи...?
Точно не перед циклом. Думаю вам просто везло и сборщик мусора отрабатывал сразу после цикла.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
08.08.2023, 23:54
Цитата Сообщение от wizard41 Посмотреть сообщение
Понятно, что я уже начал лезть в перспективу, куда-то дальше, чем требуется автору. Но это лишь простое обсуждение вариантов в рамках уже заданного вопроса. Не создавать же новую тему для того, что практически не нужно и не применяется в практике.
Вот к сожалению это не так. Я тут недавно очень долго воевал с Элд Хасп по поводу утечек, пока не дошло что он говорит именно про конкретный специфический случай, а не общий подход. Все эти мелочи и контекст очень влияют на то, какой код требуется в итоге.

Есть конечно вещи, которые стараются делать всегда, а не говнокодить простыню, но на мой взгляд это тот случай.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
09.08.2023, 00:07
Цитата Сообщение от Wolfdp Посмотреть сообщение
Окей, я придумал ситуацию
Мдааа.... Wolfdp, по моему еще больше намутил воды )). Строки да, разные бывают, но суть то...
Блин, то ли я уже старею и не могу толком донести мысль, то ли че...

Добавлено через 12 минут
Цитата Сообщение от Wolfdp Посмотреть сообщение
а не говнокодить простыню, но на мой взгляд это тот случай.
Чтобы не говнокодить простыню - нужно понимание базовых вещей. К сожалению, многие из них бывают опущены (не приняты к сведению) по разным причинам. Но в процессе работы могут возникнуть непонятки.
Wolfdp, ведь вы перед тем как разрабатывать текущие задачи не изучали все нюансы консоли в течение 5-6 лет? Hello World получилось и пошли дальше, верно? (условно).
Тут вроде все ясно и понятно, но если вникнуть в детали -- Ага! Что-то тут не так... Хотя пишем уже MVVM'ы и многослойные базы...
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
09.08.2023, 00:13
Цитата Сообщение от wizard41 Посмотреть сообщение
по моему еще больше намутил воды
при всем уважении, но:

- я ниже написал что это явно излишняя оптимизация, для специфического случая
- это не противоречит условию, в отличии от вашего требования "начать считывание, пропустив большой кусок файла"
- этот пример как раз решает вопрос перфоманса, тем что не создаются новые строки, а используется общий буфер.
0
403 / 265 / 69
Регистрация: 12.04.2020
Сообщений: 1,404
09.08.2023, 00:14
Цитата Сообщение от wizard41 Посмотреть сообщение
Блин, то ли я уже старею и не могу толком донести мысль, то ли че...
просто ребята душнят
мысль понятна, интересно узнать как решить ее
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
09.08.2023, 00:24
Цитата Сообщение от Wolfdp Посмотреть сообщение
при всем уважении, но:
Wolfdp, ай-я-яй! Я как раз это все учел в идее. Пока остановились на затыке с "пропустив большой кусок файла".
Цитата Сообщение от Wolfdp Посмотреть сообщение
- этот пример как раз решает вопрос перфоманса
эмммм.... Спорить не буду, но проверю при оказии. Честно говоря - кажется что не особо тут перфоманса будет...
Цитата Сообщение от Wolfdp Посмотреть сообщение
тем что не создаются новые строки
Wolfdp, я умоляю, ну не дети же с вами разговаривают. ))

Добавлено через 3 минуты

Не по теме:

Цитата Сообщение от Dr9vik Посмотреть сообщение
просто ребята душнят
Похоже есть такое немного )).
Но мне блин интересно самому стало, как выгоднее достать из файла строку N.

0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
09.08.2023, 01:04
Цитата Сообщение от wizard41 Посмотреть сообщение
эмммм.... Спорить не буду, но проверю при оказии. Честно говоря - кажется что не особо тут перфоманса будет...
98Мб текста, со словами длинной до 20 символов и до 30 слов в строке (или около того, код генерации канул в небытие)

Если влепить банальный foreach(var s in Lines) Console.WriteLine(s);, то программа выедает до 17Мб памяти (по скорости хз, я не дожидался окончания работы) и переодически вызывается GC. Подход через буфер отъедает до 13Мб и GC не задействуется (по крайне мере на мониторинговой тулзе).

Но это очень не гибкое решение (это скорее ТСу адресуется) в плане "считать строку и что с ней сделать", так как в общем случае у нас подразуевается что есть некий Action<string>, которому мы скармливаем строку, что опять приводит к тому что строка таки появится в памяти приложения и GC придется её убирать. В общем не стоит воспринимать это как эталон.

Цитата Сообщение от wizard41 Посмотреть сообщение
Но мне блин интересно самому стало, как выгоднее достать из файла строку N.
Ну, вроде же в той теме что вы скидывали и было решение: читаем в буфер, смотрим есть ли переносы, и так пока не дойдем до нужного места. Дальше пихаем в билдер, и выдаем строку.

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
28
29
30
31
32
33
IEnumerable<string> SkipAndReadLines(string path, int count)
{
    using var file = new StreamReader(path);
    var buff = new char[1024];
 
    var builder = new StringBuilder();
 
    var c = 0;
    do
    {
        c = file.Read(buff);
        for (var i = 0; i < c; i++)
        {
            if (count == 0)
            {
                builder.Append(buff[i]);
            }
            else if (buff[i] == '\n')
            {
                if (count == 0)
                {
                    yield return builder.ToString();
                    builder.Clear();
                }
                else
                {
                    count--;
                }
            }
        }
    }
    while (c > 0);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.08.2023, 01:04

Как вывести текст построчно на экран
Как вывести текст построчно и вообще как дальше работать со строками? Помогите, пожалуйста) Подскажите хотя бы, если где-нибудь есть...

Ввести построчно текст программы написанной на языке ПАСКАЛЬ. Заменить понятия тип INTEGER на ЦЕЛОЕ, REAL на ВЕЩЕСТВЕННОЕ. Вывести построчно получен
Помогите плз написать программу Ввести построчно текст программы написанной на языке ПАСКАЛЬ. Заменить понятия тип INTEGER...

Как из массива строк вывести текст в мемо, одной операцией, не выводя построчно?
Задача в следущем. Есть файл с байтами. После их раскодирования получаем двумерный массив тоже с байтами, но если эти байты представить в...

Как вывести текст на консоль
Первая задачка. К примеру есть дефолтное консольное приложение static void Main() { Console.Write(&quot; from...

Как вывести текст в консоль
Подскажите плз..мне нужно в консольном приложении вывести рисунок к примеру такой, как можно сделать это просто(новичок): ___Н __Н Н ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru