Как записать данные в txt c#. Работа с файлами в Си-шарп. Классы StreamReader и StreamWriter

Особенности языка С. Учебное пособие

Открытие и закрытие файлов

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

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

Другие функции обработки файлов

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

В языке программирования C указатель на файл имеет тип FILE и его объявление выглядит так:
FILE * myfile;

С другой стороны, функция fopen() открывает файл по указанному в качестве первого аргумента адресу в режиме чтения ("r"), записи ("w") или добавления ("a") и возвращает в программу указатель на него. Поэтому процесс открытия файла и подключения его к программе выглядит примерно так:
myfile = fopen ("hello.txt" , "r" ) ;

Стандартный ввод и вывод в виде файлов

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

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

При чтении или записи данных в файл обращение к нему осуществляется посредством файлового указателя (в данном случае, myfile ).

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

Более того, по стандарту мы можем надеяться на полную переносимость наших исходных текстов на всех платформах добросовестно. Мы уже упоминали файл выше. Теперь мы сосредоточимся на потоке данных. Таким образом, поток данных является логическим интерфейсом файла. Для абстрактного набора мы можем рассматривать диск, экран, клавиатуру, порт, печать и другие. Самый очевидный тип - это, конечно, набор дисков. Преимущество такого подхода заключается в том, что одно аппаратное устройство выглядит одинаково для программиста, как и другое.

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

Объявление функции fopen() содержится в заголовочном файле stdio.h, поэтому требуется его подключение. Также в stdio.h объявлен тип-структура FILE.

После того, как работа с файлом закончена, принято его закрывать, чтобы освободить буфер от данных и по другим причинам. Это особенно важно, если после работы с файлом программа продолжает выполняться. Разрыв связи между внешним файлом и указателем на него из программы выполняется с помощью функции fclose() . В качестве параметра ей передается указатель на файл:
fclose(myfile) ;

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

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

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

Чтение из текстового файла и запись в него

fscanf()

Функция fscanf() аналогична по смыслу функции scanf() , но в отличии от нее осуществляет форматированный ввод из файла, а не стандартного потока ввода. Функция fscanf() принимает параметры: файловый указатель, строку формата, адреса областей памяти для записи данных:
fscanf (myfile, "%s%d" , str, & a) ;

Ток и вход и выход переключателей

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

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

Возвращает количество удачно считанных данных или EOF. Пробелы, символы перехода на новую строку учитываются как разделители данных.

Допустим, у нас есть файл содержащий такое описание объектов:

Apples 10 23.4 bananas 5 25.0 bread 1 10.3

#include main () { FILE * file; struct food { char name[ 20] ; unsigned qty; float price; } ; struct food shop[ 10] ; char i= 0 ; file = fopen("fscanf.txt" , "r" ) ; while (fscanf (file, "%s%u%f" , shop[ i] .name , & (shop[ i] .qty ) , & (shop[ i] .price ) ) != EOF) { printf ("%s %u %.2f\n " , shop[ i] .name , shop[ i] .qty , shop[ i] .price ) ; i++; } }

Текущий и сформированный вход и выход

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

Библиотека, ответственная за обработку файлов

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

Когда мы не получаем доступ к файлу

У нас нет прав на изменение файла: у нас нет прав на каталог, в котором мы хотим создать файл, носитель, на котором мы хотим писать, доступен только для чтения. Загрузка данных по потоку. Файл не существует на диске, у нас нет разрешения на чтение для файла. . Что нужно знать о потоке.

В данном случае объявляется структура и массив структур. Каждая строка из файла соответствует одному элементу массива; элемент массива представляет собой структуру, содержащую строковое и два числовых поля. За одну итерацию цикл считывает одну строку. Когда встречается конец файла fscanf() возвращает значение EOF и цикл завершается.

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

Другие методы чтения данных

Сохранение данных по потоку

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

fgets()

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

Сохранение данных в деталях

Обратите внимание, однако, что сохранение таких данных, как показано здесь, неэффективно.

Навигация по файлу данных

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

Когда мы выходим за пределы досягаемости файла

Другие функции, используемые при работе с файлами

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

Например:
fgets (str, 50 , myfile)

Такой вызов функции прочитает из файла, связанного с указателем myfile , одну строку текста полностью, если ее длина меньше 50 символов с учетом символа "\n", который функция также сохранит в массиве. Последним (50-ым) элементом массива str будет символ "\0", добавленный fgets() . Если строка окажется длиннее, то функция прочитает 49 символов и в конце запишет "\0". В таком случае "\n" в считанной строке содержаться не будет.

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

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

#include #define N 80 main () { FILE * file; char arr[ N] ; file = fopen("fscanf.txt" , "r" ) ; while (fgets (arr, N, file) != NULL) printf ("%s" , arr) ; printf ("\n " ) ; fclose(file) ; }

В этой программе в отличие от предыдущей данные считываются строка за строкой в массив arr . Когда считывается следующая строка, предыдущая теряется. Функция fgets() возвращает NULL в случае, если не может прочитать следующую строку.

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

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

getc() или fgetc()

Функция getc() или fgetc() (работает и то и другое) позволяет получить из файла очередной один символ.

while ((arr[ i] = fgetc (file) ) != EOF) { if (arr[ i] == "\n " ) { arr[ i] = "\0 " ; printf ("%s\n " , arr) ; i = 0 ; } else i++; } arr[ i] = "\0 " ; printf ("%s\n " , arr) ;

Приведенный в качестве примера код выводит данные из файла на экран.

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

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

Запись в текстовый файл

Также как и ввод, вывод в файл может быть различным.

  • Форматированный вывод. Функция fprintf ( файловый_указатель, строка_формата, переменные ) .
  • Посточный вывод. Функция fputs ( строка, файловый_указатель ) .
  • Посимвольный вывод. Функция fputc() или putc( символ, файловый_указатель ) .

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

Путь к файлу должен быть указан. Можно использовать два типа путей. Абсолютный путь: это путь, который относится к корню диска. . Теперь вы можете использовать созданный поток для сохранения данных в файл. Если файл с заданным именем не существует, он будет автоматически создан!

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

Запись в каждую строку файла полей одной структуры:

file = fopen("fprintf.txt" , "w" ) ; while (scanf ("%s%u%f" , shop[ i] .name , & (shop[ i] .qty ) , & (shop[ i] .price ) ) != EOF) { fprintf(file, "%s %u %.2f\n " , shop[ i] .name , shop[ i] .qty , shop[ i] .price ) ; i++; }

Построчный вывод в файл ( fputs() , в отличие от puts() сама не помещает в конце строки "\n"):

while (gets (arr) != NULL) { fputs(arr, file) ; fputs("\n " , file) ; }

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

Пример посимвольного вывода:

while ((i = getchar() ) != EOF) putc(i, file) ;

Чтение из двоичного файла и запись в него

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

При открытии файла для двоичного доступа, вторым параметром функции fopen() является строка "rb" или "wb".

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

Функции fread() и fwrite() принимают в качестве параметров:

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

Эти функции возвращают количество успешно прочитанных или записанных данных. Т.е. можно "заказать" считывание 50 элементов данных, а получить только 10. Ошибки при этом не возникнет.

Пример использования функций fread() и fwrite() :

#include #include main () { FILE * file; char shelf1[ 50] , shelf2[ 100] ; int n, m; file = fopen("shelf1.txt" , "rb" ) ; n= fread(shelf1, sizeof (char ) , 50, file) ; fclose(file) ; file = fopen("shelf2.txt" , "rb" ) ; m= fread(shelf2, sizeof (char ) , 50, file) ; fclose(file) ; shelf1[ n] = "\0 " ; shelf2[ m] = "\n " ; shelf2[ m+ 1 ] = "\0 " ; file = fopen("shop.txt" , "wb" ) ; fwrite(strcat(shelf2, shelf1) , sizeof (char ) , n+ m, file) ; fclose(file) ; }

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

Решение задач

Задание

  1. Напишите программу, которая запрашивает у пользователя имя (адрес) текстового файла, далее открывает его и считает в нем количество символов и строк.
  2. Напишите программу, которая записывает в файл данные, полученные из другого файла и так или иначе измененные перед записью. Каждая строка данных, полученная из файла, должна помещаться в структуру.

Класс FileStream представляет возможности по считыванию из файла и записи в файл. Он позволяет работать как с текстовыми файлами, так и с бинарными.

Рассмотрим наиболее важные его свойства и методы:

    Свойство Length : возвращает длину потока в байтах

    Свойство Position : возвращает текущую позицию в потоке

    Метод Read : считывает данные из файла в массив байтов. Принимает три параметра: int Read(byte array, int offset, int count) и возвращает количество успешно считанных байтов. Здесь используются следующие параметры:

    • array - массив байтов, куда будут помещены считываемые из файла данные

      offset представляет смещение в байтах в массиве array, в который считанные байты будут помещены

      count - максимальное число байтов, предназначенных для чтения. Если в файле находится меньшее количество байтов, то все они будут считаны.

    Метод long Seek(long offset, SeekOrigin origin) : устанавливает позицию в потоке со смещением на количество байт, указанных в параметре offset.

    Метод Write : записывает в файл данные из массива байтов. Принимает три параметра: Write(byte array, int offset, int count)

    • array - массив байтов, откуда данные будут записываться в файла

      offset - смещение в байтах в массиве array, откуда начинается запись байтов в поток

      count - максимальное число байтов, предназначенных для записи

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

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

Посмотрим на примере считывания-записи в текстовый файл:

Console.WriteLine("Введите строку для записи в файл:"); string text = Console.ReadLine(); // запись в файл using (FileStream fstream = new FileStream(@"C:\SomeDir\noname\note.txt", FileMode.OpenOrCreate)) { // преобразуем строку в байты byte array = System.Text.Encoding.Default.GetBytes(text); // запись массива байтов в файл fstream.Write(array, 0, array.Length); Console.WriteLine("Текст записан в файл"); } // чтение из файла using (FileStream fstream = File.OpenRead(@"C:\SomeDir\noname\note.txt")) { // преобразуем строку в байты byte array = new byte; // считываем данные fstream.Read(array, 0, array.Length); // декодируем байты в строку string textFromFile = System.Text.Encoding.Default.GetString(array); Console.WriteLine("Текст из файла: {0}", textFromFile); } Console.ReadLine();

Разберем этот пример. И при чтении, и при записи используется оператор using . Не надо путать данный оператор с директивой using, которая подключает пространства имен в начале файла кода. Оператор using позволяет создавать объект в блоке кода, по завершению которого вызывается метод Dispose у этого объекта, и, таким образом, объект уничтожается. В данном случае в качестве такого объекта служит переменная fstream .

Объект fstream создается двумя разными способами: через конструктор и через один из статических методов класса File.

Здесь в конструктор передается два параметра: путь к файлу и перечисление FileMode . Данное перечисление указывает на режим доступа к файлу и может принимать следующие значения:

    Append : если файл существует, то текст добавляется в конец файл. Если файла нет, то он создается. Файл открывается только для записи.

    Create : создается новый файл. Если такой файл уже существует, то он перезаписывается

    CreateNew : создается новый файл. Если такой файл уже существует, то он приложение выбрасывает ошибку

    Open : открывает файл. Если файл не существует, выбрасывается исключение

    OpenOrCreate : если файл существует, он открывается, если нет - создается новый

    Truncate : если файл существует, то он перезаписывается. Файл открывается только для записи.

Статический метод OpenRead класса File открывает файл для чтения и возвращает объект FileStream.

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

И при записи, и при чтении применяется объект кодировки Encoding.Default из пространства имен System.Text . В данном случае мы используем два его метода: GetBytes для получения массива байтов из строки и GetString для получения строки из массива байтов.

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

Fstream.WriteByte(13); fstream.WriteByte(103);

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

Произвольный доступ к файлам

Нередко бинарные файлы представляют определенную стрктуру. И, зная эту структуру, мы можем взять из файла нужную порцию информации или наоброт записать в определенном месте файла определенный набор байтов. Например, в wav-файлах непосредственно звуковые данные начинаются с 44 байта, а до 44 байта идут различные метаданные - количество каналов аудио, частота дискретизации и т.д.

С помощью метода Seek() мы можем управлять положением курсора потока, начиная с которого производится считывание или запись в файл. Этот метод принимает два параметра: offset (смещение) и позиция в файле. Позиция в файле описывается тремя значениями:

    SeekOrigin.Begin : начало файла

    SeekOrigin.End : конец файла

    SeekOrigin.Current : текущая позиция в файле

Курсор потока, с которого начинается чтение или запись, смещается вперед на значение offset относительно позиции, указанной в качестве второго параметра. Смещение может отрицательным, тогда курсор сдвигается назад, если положительное - то вперед.

Рассмотрим на примере:

Using System.IO; using System.Text; class Program { static void Main(string args) { string text = "hello world"; // запись в файл using (FileStream fstream = new FileStream(@"D:\note.dat", FileMode.OpenOrCreate)) { // преобразуем строку в байты byte input = Encoding.Default.GetBytes(text); // запись массива байтов в файл fstream.Write(input, 0, input.Length); Console.WriteLine("Текст записан в файл"); // перемещаем указатель в конец файла, до конца файла- пять байт fstream.Seek(-5, SeekOrigin.End); // минус 5 символов с конца потока // считываем четыре символов с текущей позиции byte output = new byte; fstream.Read(output, 0, output.Length); // декодируем байты в строку string textFromFile = Encoding.Default.GetString(output); Console.WriteLine("Текст из файла: {0}", textFromFile); // worl // заменим в файле слово world на слово house string replaceText = "house"; fstream.Seek(-5, SeekOrigin.End); // минус 5 символов с конца потока input = Encoding.Default.GetBytes(replaceText); fstream.Write(input, 0, input.Length); // считываем весь файл // возвращаем указатель в начало файла fstream.Seek(0, SeekOrigin.Begin); output = new byte; fstream.Read(output, 0, output.Length); // декодируем байты в строку textFromFile = Encoding.Default.GetString(output); Console.WriteLine("Текст из файла: {0}", textFromFile); // hello house } Console.Read(); } }

Консольный вывод:

Текст записан в файл Текст из файл: worl Текст из файла: hello house

Вызов fstream.Seek(-5, SeekOrigin.End) перемещает курсор потока в конец файлов назад на пять символов:

То есть после записи в новый файл строки "hello world" курсор будет стоять на позиции символа "w".

После этого считываем четыре байта начиная с символа "w". В данной кодировке 1 символ будет представлять 1 байт. Поэтому чтение 4 байтов будет эквивалентно чтению четырех сиволов: "worl".

Затем опять же перемещаемся в конец файла, не доходя до конца пять символов (то есть опять же с позиции символа "w"), и осуществляем запись строки "house". Таким образом, строка "house" заменяет строку "world".

Закрытие потока

В примерах выше дл закрытия потока применяется конструкция using . После того как все операторы и выражения в блоке using отработают, объект FileStream уничтожается. Однако мы можем выбрать и другой способ:

FileStream fstream = null; try { fstream = new FileStream(@"D:\note3.dat", FileMode.OpenOrCreate); // операции с потоком } catch(Exception ex) { } finally { if (fstream != null) fstream.Close(); }

Если мы не используем конструкцию using, то нам надо явным образом вызвать метод Close() : fstream.Close()



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

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

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