Главная страница
Навигация по странице:

  • Результат выполнения программы (из листинга 9.6)

  • ПОДРОБНОСТИ bМетод ReadByte() считывает байт, но возвращает значение типа int. Значение типа byte не может быть отрицательным. Значение Глава 9496

  • Васильев А.Н. Основы программирования на C#. Васильев А. Н. Программирование


    Скачать 5.54 Mb.
    НазваниеВасильев А. Н. Программирование
    АнкорВасильев А.Н. Основы программирования на C
    Дата20.09.2022
    Размер5.54 Mb.
    Формат файлаpdf
    Имя файлаVasilev_Programmirovanie-na-C-dlya-nachinayushchih-Osobennosti-y.pdf
    ТипДокументы
    #686596
    страница38 из 40
    1   ...   32   33   34   35   36   37   38   39   40
    488
    today и date. Свойства Days и Ticks позволяют узнать количество дней в этом интервале и количество тактов в этом интервале (напомним, один такт равен 100 наносекундам).
    Еще один небольшой пример, связанный с использованием дат, представлен в листинге 9.5. В этой простой программе для указанного диапазона лет вычисляются дни, когда й день месяца попадает на пятницу.
    
    Листинг 9.5. Использование дат System;
    //
    Ƚɥɚɜɧɵɣ ɤɥɚɫɫ:
    class FindFridayDemo{
    //
    Ƚɥɚɜɧɵɣ ɦɟɬɨɞ:
    static void Main(){
    //
    Ƚɨɞɵ ɧɚɱɚɥɚ ɢ ɨɤɨɧɱɚɧɢɹ ɩɨɢɫɤɚ ɢ ɞɟɧɶ ɦɟɫɹɰɚ:
    int start=2015,end=2020,day=13;
    //
    ɉɟɪɟɦɟɧɧɚɹ ɞɥɹ ɡɚɩɢɫɢ ɞɚɬɵ:
    DateTime date;
    Console.WriteLine(
    Ǝɉɹɬɧɢɰɚ:Ǝ);
    //
    ɉɟɪɟɛɢɪɚɸɬɫɹ ɝɨɞɵ:
    for(int year=start;year<=end;year++){
    //
    ɉɟɪɟɛɢɪɚɸɬɫɹ ɦɟɫɹɰɵ:
    for(int month=1;month<=12;month++){
    //
    Ⱦɚɬɚ:
    date=new DateTime(year,month,day);
    //
    ȿɫɥɢ ɷɬɨ ɩɹɬɧɢɰɚ:
    if(date.DayOfWeek==DayOfWeek.Friday){
    //
    Ɉɬɨɛɪɚɠɟɧɢɟ ɞɚɬɵ:
    Console.WriteLine(date.ToString(
    Ǝdd MMMM yyyy ɝɨɞɚƎ));
    }
    }
    }
    }
    }
    Немного о разном
    489
    Результат выполнения программы представлен ниже:
    
    Результат выполнения программы (из листинга 9.5)
    ɉɹɬɧɢɰɚ:
    13
    ɮɟɜɪɚɥɹ 2015 ɝɨɞɚ
    13
    ɦɚɪɬɚ 2015 ɝɨɞɚ
    13
    ɧɨɹɛɪɹ 2015 ɝɨɞɚ
    13
    ɦɚɹ 2016 ɝɨɞɚ
    13
    ɹɧɜɚɪɹ 2017 ɝɨɞɚ
    13
    ɨɤɬɹɛɪɹ 2017 ɝɨɞɚ
    13
    ɚɩɪɟɥɹ 2018 ɝɨɞɚ
    13
    ɢɸɥɹ 2018 ɝɨɞɚ
    13
    ɫɟɧɬɹɛɪɹ 2019 ɝɨɞɚ
    13
    ɞɟɤɚɛɪɹ 2019 ɝɨɞɚ
    13
    ɦɚɪɬɚ 2020 ɝɨɞɚ
    13
    ɧɨɹɛɪɹ 2020 В целочисленную переменную start записывается год, начиная с которого выполняется поиск (значение 2015), в переменную end записывается год окончания поиска (значение 2020), а в переменную day записывается номер дня в месяце (значение 13). Переменная date типа
    DateTime нужна для запоминания даты. В программе использованы вложенные операторы цикла. Во внешнем операторе цикла переменная year
    (год для даты) принимает значения от start до end включительно. Во внутреннем операторе цикла с помощью переменной month перебираются месяцы. Командой date=new DateTime(year,month,day) создается экземпляр для даты. В условном операторе проверяется условие. Условие истинно, если дата, записанная в date, соответствует пятнице. Если так, то дата отображается в консольном окне
    Глава Работа с файлами
    Такие вопросы, дорогой посол, с кондачка не решаются. Нам надо посоветоваться с товарищами, зайдите на недельке.
    из к/ф Иван Васильевич меняет профессию»
    Очень часто данные в программу передаются с помощью файлов. Вывод результатов в файл также является удобными популярным способом реализации программы. В этом разделе речь пойдет о том, как в C# реализуется работа с файлами. Более конкретно, мы обсудим вопросы, связанные со считыванием информации из файла и записью информации в файл.
    Важным элементом в концепции файлового ввода и вывода данных является такое понятие, как поток НАЗ А МЕТКУ Не следует путать потоки данных с потоками, которые мы рассматривали в главе, посвященной многопоточному программированию. В английском языке термин thread используется для обозначения кода, выполняемого одновременно с другими блоками кода. Термин stream используется для обозначения последовательности данных. Оба термина на русский язык обычно переводят как поток, но это разные потоки. В данном случае мы говорим о потоках, которым соответствует англоязычный термин Под потоком мы будем подразумевать некоторую упорядоченную последовательность данных. Технически такая последовательность может рассматриваться как набор битов (нулей и единиц. Обрабатываются такие последовательности блоками. Как мы знаем, блок из восьми битов называется байтом. Соответственно, байтовый поток — это поток, который обрабатывается на уровне байтов (то есть байтовыми блоками. Есть и символьные потоки — в них данные обрабатываются блоками по два байта, и каждый такой блок интерпретируется как символ НАЗ А МЕТКУ Напомним, что в языке C# для хранения символьных значений выделяется битов, или 2 байта
    Немного о разном
    491
    Для работы с потоками существуют специальные классы. Абстрактный класс Stream из пространства имен System.IO является базовым для других классов, предназначенных для работы с потоками. В частности, для реализации файлового ввода/вывода используется класс
    FileStream
    . Этот класс предназначен для работы с байтовыми потоками. У класса есть несколько конструкторов, которые позволяют создать поток, связанный с файлом. Например, первым аргументом конструктору класса можно передать текст с названием файла (полным путем к файлу, а второй аргумент при этом определяет режим доступа к файлу. Для определения режима доступа к файлу используют одну из констант перечисления FileMode:
    • Константа
    Append означает режим, при котором новые данные добавляются вконец файла Константа
    Create означает, что будет создан новый файл. Если файл с указанным именем уже существует, то он будет заменен новым Константа
    CreateNew используется, если нужно создать новый файл. При этом не допускается, чтобы файл с указанным именем уже существовал Константа
    Open означает, что открывается уже существующий файл Если использована константа
    OpenOrCreate
    , то открывается существующий файла если файла нетто он создается Константа
    Truncate означает, что открывается существующий файл, при этом для файла устанавливается нулевой размер НАЗ А МЕТКУ Попытка открыть файл может привести к ошибке. Например, если файл отсутствует, генерируется ошибка класса При отсутствии прав доступа к файлу генерируется исключение класса. При ошибке ввода/вывода генерируется исключение итак далее. Поэтому при создании потока на основе файла обычно применяется обработка исключительных ситуаций.
    Создание потока на основе файла открывает возможность для записи данных в файл и считывания данных из файла. В принципе, можно ограничиться лишь одной операцией (считывание данных или запись данных. Сделать это можно с помощью третьего аргумента, который
    Глава передается конструктору класса FileStream. Это константа из перечисления (только чтение, Write (только запись) или ReadWrite (чтение и запись).
    Объекты класса FileStream имеют полезные свойства и методы. Например, длину потока в байтах можно узнать с помощью свойства
    Length
    . Свойства CanRead и CanWrite позволяют определить доступность потока для чтения и записи соответственно. Позиция в потоке определяется с помощью свойства Position. Есть и другие свойства. Среди методов можно выделить такие Метод
    ReadByte()
    позволяет считать байт из потока. Считанный байт возвращается результатом метода. Если достигнут конец файла, результатом метода возвращается значение
    -1
    • Метод
    Read()
    считывает байты из потока и записывает их в байтовый массив. Первым аргументом метод получает байтовый массив, в который записываются байты. Второй аргумент метода определяет позицию в массиве, начиная с которого копируются байты. Третий аргумент метода определяет количество байтов, считываемых из потока Метод
    WriteByte()
    позволяет записать байт (аргумент метода) в файловый поток (то есть в файл) в текущую позицию Метод
    Write()
    позволяет записать байты из массива (первый аргумент метода) в файловый поток (то есть в файл. Вторым аргументом методу передается индекс элемента в массиве, начиная с которого копируются байты. Третий аргумент метода — количество байтов, записываемых в поток Метод
    Close()
    используется для закрытия потока. При завершении работы с потоком необходимо вызывать этот метод Метод
    CopyTo()
    позволяет копировать содержимое одного потока из объекта которого вызывается метод) в другой поток (аргумент метода Метод
    Flush()
    вызывается в случае, если необходимо записать бу- феризированные данные в поток Метод
    Seek()
    используется для установки текущего положения в потоке для ввода/вывода данных. Вторым аргументом методу передается константа из перечисления
    SeekOrigin
    (возможные значения и
    End
    ), которая определяет отправную точку
    Немного о разном
    493
    для определения позиции в потоке. Позиция в потоке определяется смещением по отношению к отправной точке. Значение смещения в байтах) передается первым аргументом методу.
    В листинге 9.6 представлена программа, при выполнении которой осуществляется побайтовое копирование файла содержимое исходного существующего) файла считывается байт за байтом и копируется в новый файл, который создается программой.
    
    Листинг 9.6. Байтовые файловые потоки System;
    using System.IO;
    //
    Ƚɥɚɜɧɵɣ ɤɥɚɫɫ:
    class FileStreamDemo{
    //
    Ƚɥɚɜɧɵɣ ɦɟɬɨɞ:
    static void Main(){
    //
    Ʉɚɬɚɥɨɝ ɫ ɢɫɯɨɞɧɵɦ ɮɚɣɥɨɦ:
    string pathFrom=
    ƎD:/Books/pictures/Ǝ;
    //
    Ʉɚɬɚɥɨɝ ɫ ɧɨɜɵɦ ɮɚɣɥɨɦ:
    string pathTo=
    ƎD:/Books/files/Ǝ;
    //
    ɇɚɡɜɚɧɢɟ ɢɫɯɨɞɧɨɝɨ (ɤɨɩɢɪɭɟɦɨɝɨ) ɮɚɣɥɚ:
    string file=
    Ǝbear.jpgƎ;
    //
    ɇɚɡɜɚɧɢɟ ɞɥɹ ɧɨɜɨɝɨ ɮɚɣɥɚ:
    string name=
    Ǝanimal.jpgƎ;
    //
    ɇɚɡɜɚɧɢɟ ɢ ɩɨɥɧɵɣ ɩɭɬɶ ɞɥɹ ɮɚɣɥɨɜ:
    string f=pathFrom+file;
    string F=pathTo+name;
    //
    Ʉɨɧɬɪɨɥɢɪɭɟɦɵɣ ɤɨɞ:
    try{
    //
    ɋɨɡɞɚɧɢɟ ɩɨɬɨɤɚ ɞɥɹ ɫɱɢɬɵɜɚɧɢɹ ɮɚɣɥɚ:
    FileStream fin=new FileStream(f,FileMode.Open);
    Console.WriteLine(
    Ǝɂɫɯɨɞɧɵɣ ɮɚɣɥ: \Ǝ{0}\ƎƎ,f);
    //
    ɋɨɡɞɚɧɢɟ ɩɨɬɨɤɚ ɞɥɹ ɡɚɩɢɫɢ ɜ ɮɚɣɥ:
    FileStream fout=new FileStream(F,FileMode.Create);
    Глава 9
    494
    Console.WriteLine(
    Ǝɇɨɜɵɣ ɮɚɣɥ: \Ǝ{0}\ƎƎ,F);
    //
    ɐɟɥɨɱɢɫɥɟɧɧɚɹ ɩɟɪɟɦɟɧɧɚɹ:
    int val;
    //
    ɋɱɢɬɵɜɚɟɬɫɹ ɩɟɪɜɵɣ ɛɚɣɬ ɢɡ ɩɨɬɨɤɚ:
    val=fin.ReadByte();
    //
    ɑɬɟɧɢɟ ɢ ɡɚɩɢɫɶ ɛɚɣɬɨɜ:
    while(val!=-1){
    //
    Ɂɚɩɢɫɶ ɛɚɣɬɚ ɜ ɩɨɬɨɤ:
    fout.WriteByte((byte)val);
    //
    ɋɱɢɬɵɜɚɟɬɫɹ ɛɚɣɬ ɢɡ ɩɨɬɨɤɚ:
    val=fin.ReadByte();
    }
    //
    Ɂɚɤɪɵɜɚɸɬɫɹ ɩɨɬɨɤɢ:
    fout.Close();
    fin.Close();
    } //
    Ɉɛɪɚɛɨɬɤɚ ɢɫɤɥɸɱɟɧɢɣ:
    catch(Exception e){
    Console.WriteLine(
    Ǝɉɪɨɢɡɨɲɥɚ ɨɲɢɛɤɚ!Ǝ);
    Console.WriteLine(e.Message);
    return; //
    Ɂɚɜɟɪɲɟɧɢɟ ɜɵɩɨɥɧɟɧɢɹ ɩɪɨɝɪɚɦɦɵ
    }
    Console.WriteLine(
    ƎɄɨɩɢɪɨɜɚɧɢɟ ɭɫɩɟɲɧɨ ɡɚɜɟɪɲɟɧɨƎ);
    При успешном выполнении программы в консольном окне появляются такие сообщения:
    
    Результат выполнения программы (из листинга 9.6)
    ɂɫɯɨɞɧɵɣ ɮɚɣɥ: ƎD:/Books/pictures/bear.jpgƎ
    ɇɨɜɵɣ ɮɚɣɥ: ƎD:/Books/files/animal.jpgƎ
    Ʉɨɩɢɪɨɜɚɧɢɟ ɭɫɩɟɲɧɨ ɡɚɜɟɪɲɟɧɨ
    Немного о разном
    495
    Но главный результат выполнения программы иной в каталоге
    D:\Books\files появляется файл animal.jpg, который является копией файла bear.jpg из каталога D:\Books\pictures.
    {
    i
    НАЗ А МЕТКУ Разумеется, перед запуском программы на выполнение в каталог
    D:\Books\pictures нужно поместить файл bear.jpg
    . Альтернатива указать в программе другой каталоги другой исходный файл. Но если, несмотря на все усилия, при выполнении программы возникает ошибка (связанная, например, с отсутствием исходного файла в указанном каталоге, тов процессе обработки исключения отображается сообщение о том, что возникла ошибка, и описание этой ошибки (значение свойства
    Message объекта исключения).
    В самой программе в текстовые переменные f и F записывается полный путь к исходному файлу и файлу, который должен быть создан в процессе копирования. Текстовая переменная f передается в качестве аргумента конструктору класса FileStream при создании объекта потока fin. Это поток используется для считывания содержимого исходного файла. Второй аргумент конструктора FileMode.Open означает, что речь идет об открытии существующего файла. Текстовая переменная F передается первым аргументом конструктору класса FileStream при создании объекта потока fout. Поток предназначен для записи байтовых данных в файл, который создается при создании объекта потока (поэтому вторым аргументом конструктору передана константа Для запоминания считанных байтов мы используем переменную val типа int
    . Командой val=fin.ReadByte() в эту переменную записывается первый байт из потока, связанного с исходным файлом. После этого запускается оператор цикла while, в котором проверяется условие val!=-1. Здесь мы учли, что если достигнут конец файла, то при попытке прочитать очередной байт с помощью метода ReadByte() возвращается значение. Поэтому истинность условия val!=-1 означает, что конец файла не достигнут. Если так, то командой fout.WriteByte((byte)val) этот байт записывается в поток fout, после чего командой val=fin.
    ReadByte()
    считывается очередной байт из потока fin.
    q
    ПОДРОБНОСТИ bМетод
    ReadByte()
    считывает байт, но возвращает значение типа int
    . Значение типа byte не может быть отрицательным. Значение
    Глава 9
    496
    -1
    , возвращаемое методом при достижении конца файла, является целочисленным (типа int
    ). Поэтому результат метода заносится в переменную типа int
    . Но при записи байта в поток это int
    - значение необходимо преобразовать в byte
    -значение.
    После завершения оператора цикла, когда копирование выполнено, командами fout.Close() и fin.Close() оба потока закрываются.
    В рассмотренной выше программе мы проиллюстрировали процесс побайтового считывания информации из файла и записи данных в файл. Что касается собственно задачи копирования файлов, то ее можно было реализовать проще, воспользовавшись методом CopyTo(). Соответствующая программа представлена в листинге Листинг 9.7. Копирование файла System;
    using System.IO;
    //
    Ƚɥɚɜɧɵɣ ɤɥɚɫɫ:
    class CopyToDemo{
    //
    Ƚɥɚɜɧɵɣ ɦɟɬɨɞ:
    static void Main(){
    //
    ɇɚɡɜɚɧɢɟ ɢ ɩɨɥɧɵɣ ɩɭɬɶ ɞɥɹ ɮɚɣɥɨɜ:
    string f=
    ƎD:/Books/pictures/bear.jpgƎ;
    string F=
    ƎD:/Books/files/animal.jpgƎ;
    try{
    //
    ɋɨɡɞɚɧɢɟ ɩɨɬɨɤɚ ɞɥɹ ɫɱɢɬɵɜɚɧɢɹ ɮɚɣɥɚ:
    FileStream fin=new FileStream(f,FileMode.Open);
    Console.WriteLine(
    Ǝɂɫɯɨɞɧɵɣ ɮɚɣɥ: \Ǝ{0}\ƎƎ,f);
    //
    ɋɨɡɞɚɧɢɟ ɩɨɬɨɤɚ ɞɥɹ ɡɚɩɢɫɢ ɜ ɮɚɣɥ:
    FileStream fout=new FileStream(F,FileMode.Create);
    Console.WriteLine(
    Ǝɇɨɜɵɣ ɮɚɣɥ: \Ǝ{0}\ƎƎ,F);
    //
    Ʉɨɩɢɪɨɜɚɧɢɟ ɮɚɣɥɚ:
    fin.CopyTo(fout);
    //
    Ɂɚɤɪɵɜɚɸɬɫɹ ɩɨɬɨɤɢ:
    fout.Close();
    Немного о разном fin.Close();
    }
    catch(Exception e){
    Console.WriteLine(
    Ǝɉɪɨɢɡɨɲɥɚ ɨɲɢɛɤɚ!Ǝ);
    Console.WriteLine(e.Message);
    return;
    }
    Console.WriteLine(
    ƎɄɨɩɢɪɨɜɚɧɢɟ ɭɫɩɟɲɧɨ ɡɚɜɟɪɲɟɧɨƎ);
    Результат выполнения программы такой же, как ив предыдущем случае. В данном случаев программе, после создания потоков для считывания и записи данных, из объекта потока fin вызывается метода аргументом методу передается объект потока fout. В результате выполняется копирование файла, связанного с потоком fin, в файл, связанный с потоком Еще раз подчеркнем, что особенность байтового потока в том, что данные считываются блоками размером в байт. На практике нередко приходится иметь дело с символьными данными. Символ реализуется в виде блока размером в два байта. Поэтому при работе с символьной информацией удобнее выполнять вводи вывод данных блоками размером по два байта — то есть посимвольно. В таком случае используют символьные потоки. Объекты символьных потоков создаются на основе классов
    StreamReader
    (поток для считывания) и StreamWriter (поток для записи. Нов основе символьного потока все равно лежит байтовый поток. Разница лишь в том, какими блоками считывается и записывается информация. Это отражается и на процессе создания символьных потоков аргументом конструктору класса, на основе которого создается символьный поток, передается объект байтового потока. Вместе стем существует и другой способ создать символьный поток аргументом конструктору класса StreamReader или StreamWriter достаточно передать текст с именем файла, на основе которого создается поток.
    Объект символьного потока для считывания данных создается на основе класса StreamReader. Для считывания одного символа используется метод Read(). Результатом метода возвращается значение
    Глава с кодом символа или значение -1, если достигнут конец файла. Метод
    ReadLine()
    позволяет считать текстовую строку. Текстовая строка возвращается результатом метода. Если достигнут конец файла, то метод возвращает пустую ссылку Объект символьного потока для записи данных в файл создается на основе класса SreamWriter. Для записи данных в файл используются методы Write() и WriteLine(). Разница между методами в том, что метод WriteLine() после занесения данных в файл добавляет инструкцию перехода к новой строке. Пример создания и использования символьных потоков представлен в листинге Листинг 9.8. Символьные потоки System;
    using System.IO;
    //
    Ƚɥɚɜɧɵɣ ɤɥɚɫɫ:
    class ReaderWriterDemo{
    //
    Ƚɥɚɜɧɵɣ ɦɟɬɨɞ:
    static void Main(){
    //
    ɇɚɡɜɚɧɢɟ ɢ ɩɨɥɧɵɣ ɩɭɬɶ ɞɥɹ ɮɚɣɥɚ:
    string file=
    ƎD:/Books/files/MyText.txtƎ;
    //
    Ɍɟɤɫɬɨɜɚɹ ɩɟɪɟɦɟɧɧɚɹ:
    string str;
    //
    Ʉɥɸɱɟɜɨɟ ɫɥɨɜɨ:
    string word=
    ƎexitƎ;
    //
    ɐɟɥɨɱɢɫɥɟɧɧɚɹ ɩɟɪɟɦɟɧɧɚɹ:
    int k=1;
    try{ //
    Ʉɨɧɬɪɨɥɢɪɭɟɦɵɣ ɤɨɞ
    //
    ɋɢɦɜɨɥɶɧɵɣ ɩɨɬɨɤ ɞɥɹ ɡɚɩɢɫɢ ɜ ɮɚɣɥ:
    StreamWriter fw=new StreamWriter(file);
    Console.WriteLine(
    ƎȾɥɹ ɡɚɜɟɪɲɟɧɢɹ ɜɜɟɞɢɬɟ \Ǝ{0}\ƎƎ,word);
    //
    ɋɱɢɬɵɜɚɧɢɟ ɬɟɤɫɬɨɜɵɯ ɫɬɪɨɤ ɫ ɤɨɧɫɨɥɢ:
    do{
    //
    ɉɪɢɝɥɚɲɟɧɢɟ ɜɜɟɫɬɢ ɫɬɪɨɤɭ:
    Console.Write(
    Ǝ{0}-ɹ ɫɬɪɨɤɚ: > Ǝ,k);
    Немного о разном k++;
    //
    ɋɱɢɬɵɜɚɧɢɟ ɬɟɤɫɬɨɜɨɣ ɫɬɪɨɤɢ ɫ ɤɨɧɫɨɥɢ:
    str=Console.ReadLine();
    if(str==word){ //
    ȿɫɥɢ ɜɜɟɞɟɧɨ ɤɥɸɱɟɜɨɟ ɫɥɨɜɨ
    //
    Ɂɚɜɟɪɲɟɧɢɟ ɨɩɟɪɚɬɨɪɚ:
    break;
    }
    else{ //
    ȿɫɥɢ ɧɟ ɜɜɟɞɟɧɨ ɤɥɸɱɟɜɨɟ ɫɥɨɜɨ
    //
    Ɂɚɩɢɫɶ ɬɟɤɫɬɨɜɨɣ ɫɬɪɨɤɢ ɜ ɮɚɣɥ:
    fw.WriteLine(str);
    }
    }while(true);
    //
    Ɂɚɤɪɵɜɚɟɬɫɹ ɩɨɬɨɤ:
    fw.Close();
    Console.WriteLine(
    ƎɎɚɣɥ ɫɨɡɞɚɧ!Ǝ);
    //
    ɋɨɡɞɚɧɢɟ ɩɨɬɨɤɚ ɞɥɹ ɫɱɢɬɵɜɚɧɢɹ ɢɡ ɮɚɣɥɚ:
    StreamReader fr=new StreamReader(file);
    Console.WriteLine(
    Ǝɋɨɞɟɪɠɢɦɨɟ ɮɚɣɥɚ:Ǝ);
    //
    ɋɱɢɬɵɜɚɧɢɟ ɫɬɪɨɤɢ ɢɡ ɮɚɣɥɚ:
    str=fr.ReadLine();
    //
    ɉɨɫɬɪɨɱɧɨɟ ɫɱɢɬɵɜɚɧɢɟ ɫɨɞɟɪɠɢɦɨɝɨ ɮɚɣɥɚ:
    while(str!=null){
    //
    Ɉɬɨɛɪɚɠɟɧɢɟ ɫɱɢɬɚɧɧɨɣ ɢɡ ɮɚɣɥɚ ɫɬɪɨɤɢ:
    Console.WriteLine(str);
    //
    ɋɱɢɬɵɜɚɧɢɟ ɫɬɪɨɤɢ ɢɡ ɮɚɣɥɚ:
    str=fr.ReadLine();
    }
    //
    Ɂɚɤɪɵɜɚɟɬɫɹ ɩɨɬɨɤ:
    fr.Close();
    } //
    Ɉɛɪɚɛɨɬɤɚ ɢɫɤɥɸɱɟɧɢɣ:
    catch(Exception e){
    Console.WriteLine(
    Ǝɉɪɨɢɡɨɲɥɚ ɨɲɢɛɤɚ!Ǝ);
    Глава 9
    1   ...   32   33   34   35   36   37   38   39   40


    написать администратору сайта