Файловый ввод вывод c. Файловый и потоковый ввод-вывод

Эта документация перемещена в архив и не поддерживается.

Файловый и потоковый ввод-вывод относятся к передаче данных с носителя информации или на него. В платформе.NET Framework пространства имен System.IO содержат типы, которые обеспечивают как синхронные, так и асинхронные операции чтения и записи для потоков и файлов данных. Кроме того, эти пространства имен содержат типы, выполняющие сжатие и распаковку файлов, а также типы, которые обеспечивают взаимодействие через каналы и последовательные порты.

Однако этого не должно быть. Используя некоторые специальные обозначения, мы можем перенаправить вывод многих команд на файлы, устройства и даже на ввод других команд. Большинство программ командной строки, отображающих их результаты, делают это, отправляя свои результаты на объект, называемый стандартным выходом. По умолчанию стандартный вывод направляет его содержимое на дисплей.

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

Файл - это упорядоченная и именованная последовательность байтов, имеющая постоянное хранилище. При работе с файлами используются пути к каталогам, запоминающие устройства, а также имена файлов и каталогов. В отличие от файла, поток - это последовательность байтов, которую можно использовать для записи или чтения из вспомогательного запоминающего устройства, являющегося одним из устройств хранения информации (например, дисков или памяти). Есть несколько видов запоминающих устройств, отличных от дисков, и существует несколько видов потоков, помимо файловых потоков, например сетевые потоки, потоки памяти и потоки каналов.

Отображает 10 новейших файлов в текущем каталоге. Отображает список каталогов и количество пространства, которое они потребляют, отсортированные от самого большого до самого маленького. Отображает общее количество файлов в текущем рабочем каталоге и всех его подкаталогах.

Один вид программы, часто используемый в конвейерах, называется фильтрами. Фильтры берут стандартный ввод и выполняют операцию над ним и отправляют результаты на стандартный вывод. Таким образом, они могут быть объединены для обработки информации мощными способами. Вот некоторые из распространенных программ, которые могут действовать как фильтры.

  • Чтение и запись больших объемов данных может быть ресурсоемкой. Эти задачи необходимо выполнять асинхронно, если приложение должно продолжать отвечать на запросы пользователя. В случае синхронных операций ввода-вывода поток пользовательского интерфейса будет заблокирован до тех пор, пока ресурсоемкая операция не завершится. При разработке приложений для Магазин Windows 8.x используйте асинхронные операции ввода-вывода, чтобы не создавалось впечатления, что приложение прекратило свою работу.

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

    Второй пример начинается с несортированного списка данных с повторяющимися записями.

    • Печать из командной строки.
    • Он часто используется с трубами и фильтрами.
    Когда вам потребуется время, чтобы подумать об этом, компьютер был бы совершенно бесполезен, чтобы не разговаривать с людьми, которые его используют. Так же, как нам нужна информация для выполнения задач, так же как и компьютеры. И так же, как мы предоставляем информацию другим, чтобы они могли выполнять задачи, так же как и компьютеры.

    Имена асинхронных элементов содержат Async , например: , и . Используйте эти методы с ключевыми словами async и await .

    Дополнительные сведения см. в разделе .

    Сжатием называется процесс сокращения размера сохраняемого файла. Распаковка - это процесс извлечения содержимого сжатого файла, что приводит его в формат, пригодный для использования. Пространство имен содержит типы для сжатия и распаковки файлов и потоков.

    Эти поставки и возврат информации на компьютер называются вводом и выводом. «Вход» - это информация, предоставленная компьютеру или программе. «Выход» - это информация, предоставляемая компьютером или программой. Удивительно, но самые простые методы, обычно преподаваемые начинающим программистам, также могут быть самыми мощными. Напомним, что в начале этого текста демонстрационная программа дублируется ниже.

    Если вы скомпилируете и запустите эту программу, на экране появится следующее предложение. Функция похожа на «черный ящик», который делает что-то для вас, не подвергая внутренности внутри. В качестве пояснения иногда удобно включать открытые и закрывающиеся круглые скобки после имени функции, чтобы напомнить нам, что это действительно функция. Однако, как правило, когда имя функции, о которой мы говорим, понимается, это необязательно.

    При сжатии и распаковке файлов и потоков часто используются следующие классы:

    • Изолированное хранилище - это механизм хранения данных, обеспечивающий изоляцию и безопасность путем определения стандартизованных способов сопоставления кода с хранимыми данными. Хранилище предоставляет виртуальную файловую систему, изолированную по пользователю, сборке и (необязательно) домену. Изолированное хранилище особенно полезно в том случае, когда приложение не имеет разрешения на доступ к файлам пользователя. Можно сохранить параметры или файлы для приложения таким способом, который контролируется политикой безопасности компьютера.

      Например, давайте рассмотрим проблему. То, что мы делаем, помещает в строку код формата заполнителя. Эти заполнители называются спецификаторами формата. Что делать, если мы хотим добиться определенного результата, который будет выглядеть так. Поэтому для достижения вышеизложенного мы пишем.

      А затем символ новой строки. В то время как указатели можно использовать здесь, это концепция, которая не подходила бы до конца в тексте. На данный момент лучше всего рассмотреть эту «магию», прежде чем обсуждать указатели. Типичное приложение может быть таким.

      Изолированное хранилище недоступно для приложений Магазин Windows 8.x. Вместо этого используйте классы данных приложения, которые содержатся в пространстве имен . Подробнее см. в разделе Доступ к данным приложения в Центре разработки для Windows.

      Часто используются следующие классы, реализующие изолированное хранилище:

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

      Примечание по входам: когда данные вводятся на клавиатуре, информация не переходит прямо к запущенной программе. Он сначала сохраняется в так называемом буфере - небольшой объем памяти, зарезервированный для источника ввода. У этого есть падение, которое, если вы возьмете свой код на другой компьютер с другим компилятор, ваш код может работать неправильно. Конечно, переход к этому вопросу связан с небольшим количеством программирования. Таким образом, он следует многим правилам для этой операционной системы в отношении ввода и вывода.

        NET для приложений Магазина Windows 8.x содержат множество типов для чтения и записи в потоки, однако этот набор содержит не все типы ввода-вывода платформы.NET Framework.

        Следует отметить некоторые важные различия в использовании операций ввода-вывода для приложений в стиле Магазин Windows 8.x:

        • Специальные типы, относящиеся к операциям с файлами, такие как , и , не включены в.NET для приложений Магазина Windows 8.x. Вместо этого используйте типы в пространстве имен Среда выполнения Windows, такие как и .

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

          Ну, если вы не кодируете свою программу для этого. Если вы забудете это, вы можете попасть в беду. Пришло время для вашего кода стать более интерактивным. Эта функция получает символ от стандартного ввода. Компилятор предупреждает вас, когда вы забываете.

          Изолированное хранилище недоступно. Вместо этого используйте данные приложения .

        • Используйте асинхронные методы, такие как и , чтобы предотвратить блокировку потока пользовательского интерфейса.

          При использовании классов в пространстве имен необходимо выполнить требования безопасности операционной системы, такие как списки управления доступом для контроля доступа к файлам и каталогам. Это требование дополняет остальные требования . Списками управления доступом можно управлять программно. Дополнительные сведения см. в разделе .

          Только когда информация отображается как символ, она выглядит как текст. Упражнение 4: Напишите программу, которая предложит три символа; например. Программа, созданная в упражнении 4, ждет трех символов. Стандартный вход ориентирован на поток. Он служит для того, чтобы выгнать одного персонажа на стандартный выход.

          Функция возвращает значение написанного символа. Заявление в строке 8 ожидает ввода. Полученный вход не сохраняется; это не обязательно. Опять же, символ должен быть заключен в одинарные кавычки. Одна странная вещь о выходе состоит в том, что за последним символом не следует новая строка. Этот вывод может выглядеть неудобно на текстовом дисплее, поэтому.

          По умолчанию политика безопасности не позволяет обращаться к файлам на компьютере пользователя через Интернет или из приложений интрасети. Поэтому при составлении кода не используйте классы ввода-вывода, которым нужен путь к физическому файлу, загружаемому через Интернет или интрасеть. Вместо этого используйте для обычных приложений.NET Framework или данные приложения для приложений Магазин Windows 8.x.

          Упражнение 6: Измените исходный код из упражнения 5, чтобы один дополнительный символ выводился после! персонаж. Когда мы говорим «Ввод», это означает, что некоторые данные передаются в программу. Ввод может быть задан в виде файла или из командной строки.

          Когда мы говорим «Выход», это означает отображение некоторых данных на экране, в принтере или в любом файле. Таким образом, такие устройства, как дисплей, адресуются так же, как файлы, и следующие три файла автоматически открываются, когда программа выполняет доступ к клавиатуре и экрану. Указатели файлов являются средством доступа к файлу для чтения и записи. В этом разделе объясняется, как считывать значения с экрана и как распечатывать результат на экране.

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

          Заголовок Описание
          Содержит список задач ввода-вывода, связанных с файлами, каталогами и потоками, а также ссылки на соответствующее содержимое и примеры для каждой задачи.
          Описывает преимущества и основные операции асинхронного ввода и вывода.
          Описывает механизм хранения данных, обеспечивающий автономность и безопасность путем определения стандартизованных способов сопоставления кода с защищенными данными.
          Описывает операции с анонимными и именованными каналами в.NET Framework.
          Описание отображаемых в память файлов, позволяющих разместить содержимое файлов с диска в виртуальной памяти. С их помощью можно вносить изменения в очень большие файлы и создавать совместно используемую память для межпроцессного взаимодействия.

          Показ:

          Эта функция считывает только один символ за раз. Вы можете использовать этот метод в цикле, если вы хотите прочитать более одного символа с экрана. Эта функция помещает только один символ за раз. Вы можете использовать этот метод в цикле, если вы хотите отображать более одного символа на экране. Когда вышеуказанный код скомпилирован и исполнен, он ждет ввода некоторого текста.

          Существует множество других вариантов форматирования, которые можно использовать на основе требований. Перейдем теперь к простому примеру, чтобы лучше понять понятия -. Когда вы вводите текст и нажимаете «Ввод», программа переходит и считывает ввод и отображает его следующим образом. Если вы предоставите «строковую строку» или «целое целое число», то это будет считаться неправильным вводом.

  • файл ). Несмотря на то, что потоки связываются с различными физическими устройствами, характер поведения всех потоков одинаков. Поэтому классы и методы ввода-вывода можно применить ко многим типам устройств.

    На самом низком уровне иерархии потоков ввода-вывода находятся потоки, оперирующие байтами. Это объясняется тем, что многие устройства при выполнении операций ввода-вывода ориентированы на байты. Однако для человека привычнее оперировать символами, поэтому разработаны символьные потоки, которые фактически представляют собой оболочки, выполняющие преобразование байтовых потоков в символьные и наоборот. Кроме этого, реализованы потоки для работы с int -, double -, short - значениями, которые также представляют оболочку для байтовых потоков, но работают не с самими значениями, а с их внутренним представлением в виде двоичных кодов.

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

    Для обычных файлов используйте раздельные и вызовы, чтобы избежать путаницы. Попытка получить блокировку файла с использованием возможностей текущей платформы для блокировки файлов. Несколько процессов могут получить «общую блокировку файла», но не более одного процесса может содержать «исключительную блокировку», а «общие» и «эксклюзивные блокировки» являются взаимоисключающими. Когда режим «общий», порт должен быть входным портом, когда режим «эксклюзивный», порт должен быть выходным портом.

    Центральную часть потоковой С#-системы занимает класс Stream пространства имен System.IO. Класс Stream представляет байтовый поток и является базовым для всех остальных потоковых классов. Из класса Stream выведены такие байтовые классы потоков как:

    1. FileStream - байтовый поток, разработанный для файлового ввода-вывода
    2. BufferedStream - заключает в оболочку байтовый поток и добавляет буферизацию, которая во многих случаях увеличивает производительность программы;
    3. MemoryStream - байтовый поток, который использует память для хранения данных.

    Программист может вывести собственные потоковые классы. Однако для подавляющего большинства приложений достаточно встроенных потоков.

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

    Блокировка, полученная для входного порта, может быть освобождена через соответствующий выходной порт и наоборот. Мы всегда будем использовать указатели на эти структуры. Эта функция используется для открытия и создания файлов на диске. Возвращаемое значение является указателем на структуру. Входными параметрами являются.

    Подробно мы рассмотрим класс FileStream , классы StreamWriter и StreamReader , представляющие собой оболочки для класса FileStream и позволяющие преобразовывать байтовые потоки в символьные, а также классы BinaryWriter и BinaryReader , представляющие собой оболочки для класса FileStream и позволяющие преобразовывать байтовые потоки в двоичные для работы с int -, double -, short - и т.д. значениями.

    Важно закрыть открытые файлы перед выходом из приложения. Закрытие файла сохраняет данные, которые все еще находятся в буфере памяти, и обновляет некоторые данные из заголовка файла, поддерживаемого операционной системой. Он также позволяет другим программам открывать файл для использования. Чаще всего файлы не могут использоваться несколькими программами.

    Параметр - это указатель на структуру файла, который мы хотим закрыть. Эта функция считывает символ из файла. Параметр является указателем на структуру файла, который нужно прочитать. Эта функция записывает символ в файл. Эта функция используется для проверки того, достигнут ли конец файла. Очень часто мы должны работать со всеми значениями, хранящимися в файле, последовательно, так как циклы, обычно используемые для чтения всех данных в файле, должны оставаться в памяти до тех пор, пока не будет обнаружен конец файла.

    Байтовый поток

    Чтобы создать байтовый поток, связанный с файлом, создается объект класса FileStream . При этом в классе определено несколько конструкторов. Чаще всего используется конструктор, который открывает поток для чтения и/или записи:

    FileStream(string filename, FileMode mode)

    1. параметр filename определяет имя файла, с которым будет связан поток ввода-вывода данных; при этом filename определяет либо полный путь к файлу, либо имя файла, который находится в папке bin/debug вашего проекта.
    2. параметр mode определяет режим открытия файла, который может принимать одно из возможных значений, определенных перечислением FileMode :
      • FileMode.Append - предназначен для добавления данных в конец файла;
      • FileMode.Create - предназначен для создания нового файла, при этом если существует файл с таким же именем, то он будет предварительно удален;
      • FileMode. CreateNew - предназначен для создания нового файла, при этом файл с таким же именем не должен существовать;
      • FileMоde.Open - предназначен для открытия существующего файла;
      • FileMode.ОpenOrCreate - если файл существует, то открывает его, в противном случае создает новый
      • FileMode.Truncate - открывает существующий файл, но усекает его длину до нуля

    Если попытка открыть файл оказалась неуспешной, то генерируется одно из исключений: FileNotFoundException - файл невозможно открыть по причине его отсутствия, IOException - файл невозможно открыть из-за ошибки ввода-вывода, ArgumentNullException - имя файла представляет собой null -значение, ArgumentException - некорректен параметр mode, SecurityException - пользователь не обладает правами доступа, DirectoryNotFoundException - некорректно задан каталог.

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

    Это функция, унаследованная от времени магнитных лент. Это буквально означает «перемотка назад» и относится к тому, чтобы перемотать его в начало файла, хранящегося на ленте. Параметр - это указатель на структуру файла, который мы хотим перемотать. Эта функция предназначена для чтения строк. В последнем случае также читается символ онлайн-возврата. Возвращаемое значение является указателем на строку чтения, если она была прочитана успешно, и является ли обнаружен конец файла или произошла ошибка.

    Другая версия конструктора позволяет ограничить доступ только чтением или только записью:

    FileStream(string filename, FileMode mode, FileAccess how)

    1. параметры filename и mode имеют то же назначение, что и в предыдущей версии конструктора;
    2. параметр how, определяет способ доступа к файлу и может принимать одно из значений, определенных перечислением FileAccess :
    1. FileAccess.Read - только чтение;
    2. FileAccess.Write - только запись;
    3. FileAccess.ReadWrite - и чтение, и запись.

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

    Для чтения очередного байта из потока, связанного с физическим файлом, используется метод ReadByte() . После прочтения очередного байта внутренний указатель перемещается на следующий байт файла. Если достигнут конец файла, то метод ReadByte() возвращает значение -1 .

    Для побайтовой записи данных в поток используется метод WriteByte() .

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

    Рассмотрим пример использования класса FileStream , для копирования одного файла в другой. Но вначале создадим текстовый файл text.txt в папке bin/debug текущего проекта. И внесем в него произвольную информацию, например:

    12 456 Hello! 23,67 4: Message using System; using System.Text; using System.IO; //для работы с потоками namespace MyProgram { class Program { static void Main() { try { FileStream fileIn = new FileStream("text.txt", FileMode.Open, FileAccess.Read); FileStream fileOut = new FileStream("newText.txt", FileMode.Create, FileAccess.Write); int i; while ((i = fileIn.ReadByte())!=-1) { //запись очередного файла в поток, связанный с файлом fIleOut fileOut.WriteByte((byte)i); } fileIn.Close(); fileOut.Close(); } catch (Exception EX) { Console.WriteLine(EX.Message); } } } }

    Задание . Подумайте, почему для переменной i указан тип int . Можно было бы указать тип byte ?

    Символьный поток

    Чтобы создать символьный поток нужно поместить объект класса Stream (например, FileStream ) "внутрь" объекта класса StreamWriter или объекта класса StreamReader . В этом случае байтовый поток будет автоматически преобразовываться в символьный.

    Класс StreamWriter предназначен для организации выходного символьного потока. В нем определено несколько конструкторов. Один из них записывается следующим образом:

    StreamWriter(Stream stream);

    где параметр stream определяет имя уже открытого байтового потока.

    Например, создать экземпляр класса StreamReader можно следующим образом:

    StreamWriter fileOut=new StreamWriter(new FileStream("text.txt", FileMode.Create, FileAccess.Write));

    Этот конструктор генерирует исключение типа ArgumentException , если поток stream не открыт для вывода, и исключение типа ArgumentNullException , если он (поток) имеет null-значение.

    Другой вид конструктора позволяет открыть поток сразу через обращения к файлу:

    StreamWriter(string name);

    где параметр name определяет имя открываемого файла.

    Например, обратиться к данному конструктору можно следующим образом:

    StreamWriter fileOut=new StreamWriter("c:\temp\t.txt");

    И еще один вариант конструктора StreamWriter :

    StreamWriter(string name, bool appendFlag);

    где параметр name определяет имя открываемого файла;

    параметр appendFlag может принимать значение true - если нужно добавлять данные в конец файла, или false - если файл необходимо перезаписать.

    Например:

    StreamWriter fileOut=new StreamWriter("t.txt", true);

    Теперь для записи данных в поток fileOut можно обратиться к методу WriteLine . Это можно сделать следующим образом:

    fileOut.WriteLine("test");

    В данном случае в конец файла t.txt будет дописано слово test .

    Класс StreamReader предназначен для организации входного символьного потока. Один из его конструкторов выглядит следующим образом:

    StreamReader(Stream stream);

    где параметр stream определяет имя уже открытого байтового потока.

    В C# символы реализуются кодировкой Unicode. Для того, чтобы можно было обрабатывать текстовые файлы, содержащие русские символы, созданные, например, в Блокноте, рекомендуется вызывать следующий вид конструктора StreamReader:

    StreamReader fileIn=new StreamReader ("c:\temp\t.txt", Encoding.GetEncoding(1251));

    Параметр Encoding.GetEncoding(1251) говорит о том, что будет выполняться преобразование из кода Windows-1251 (одна из модификаций кода ASCII, содержащая русские символы) в Unicode. Encoding.GetEncoding(1251) реализован в пространстве имен System.Text .

    Теперь для чтения данных из потока fileIn можно воспользоваться методом ReadLine . При этом если будет достигнут конец файла, то метод ReadLine вернет значение null.

    Рассмотрим пример, в котором данные из одного файла копируются в другой, но уже с использованием классов StreamWriter и StreamReader .

    static void Main() { StreamReader fileIn = new StreamReader("text.txt", Encoding.GetEncoding(1251)); StreamWriter fileOut=new StreamWriter("newText.txt", false); string line; while ((line=fileIn.ReadLine())!=null) //пока поток не пуст { fileOut.WriteLine(line); } fileIn.Close(); fileOut.Close(); }

    Задание . Выясните, для чего предназначен метод ReadToEnd() и когда имеется смысл его применять.

    Таким образом, данный способ копирования одного файла в другой, даст нам тот же результат, что и при использовании байтовых потоков. Однако, его работа будет менее эффективной, т.к. будет тратиться дополнительное время на преобразование байтов в символы. Но у символьных потоков есть свои преимущества. Например, мы можем использовать регулярные выражения для поиска заданных фрагментов текста в файле.

    static void Main() { StreamReader fileIn = new StreamReader("text.txt"); StreamWriter fileOut=new StreamWriter("newText.txt", false); string text=fileIn.ReadToEnd(); Regex r= new Regex(@"[-+]?\d+"); Match integer = r.Match(text); while (integer.Success) { fileOut.WriteLine(integer); integer = integer.NextMatch(); } fileIn.Close(); fileOut.Close(); }



    Есть вопросы?

    Сообщить об опечатке

    Текст, который будет отправлен нашим редакторам: