C# файловый ввод вывод. Файловый и потоковый ввод-вывод

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

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

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

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

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

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

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

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

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

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

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

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

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

Чтобы создать байтовый поток, связанный с файлом, создается объект класса 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 () . При закрытии файла освобождаются системные ресурсы, ранее выделенные для этого файла, что дает возможность использовать их для работы с другими файлами.

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

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

Рассмотрим пример использования класса 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 определяет имя открываемого файла.

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

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

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

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(); }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

          Показ:



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

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

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