Как записать файл в filestream
В пространстве имен System.IO хранятся классы, предназначенные для считывания и записи данных в файлы. Классы:
File – содержит статические методы для манипуляции файлами (создание, копирование, удаление); Directory – содержит статические методы для манипуляции директориями;
Path – статических класс, «путь»; FileInfo – не обладает статическими методами, соответствует физическому фалу, во многом дублирует функциональность File;
FileStream – представляет поток, указывающий на файл или местоположение в сети. Представляет файл для считывания/записи, оперирует байтами и массивом байтов, в то время как Stream оперирует символьными данными.
Класс FileStream поддерживает внутренний указатель файла, ссылающийся на то место в файле, в котором будет производиться очередная операция чтения/записи. Метод Seek() позволяет осуществить поиск конкретной позиции в файле (байтовой).
При чтении и записи в файл, происходит изменение позиции указателя (при считывании на 1б)
Классы Stream позволяют осуществлять последовательный доступ к файлам, и в них не предусмотрена возможность работы с указателем.
StreamWriter – позволяет осуществлять запись в файл символов и строк и самостоятельно выполняет все необходимые преобразования.
StreamReader – осуществляет чтение символьных данных из потока и их преобразование.
FileStreamWatcher – используется для слежения за состоянием файловой системы (файлов и директорий) и генерирует события в моменты, когда изменяется их местоположение. Сначала нужно задать значения свойств, определив, где следует осуществлять контроль, что нужно контролировать и когда следует генерировать события. Свойства:
Path – путь к файлу/директории, подлежащей контрою.
NotifyFilter – сочетание значений перечисляемого типа NotifyFilters, которое позволяет определить за наступлением каких именно событий для данных файлов следует наблюдать. < Attributes, CreationTime, DirectoryName, FileName, LastAccess, LastWrite, Security, Size >. Допускается использование различных сочетаний этих значений посредством оператора | или &.
Filter – фильтр, определяющий какие именно файлы подлежат контролю, например, *.txt
EnableRaisingEvents – после задания всех свойст необходимо присвоить значение true, что будет означать начало наблюдения .
Асинхронный доступ к файлам
Приложение может выполнять какие-то действия параллельно с процессом ввода/вывода файла, вместо ожидания окончания этого процесса. Процесс считываня файла начинается с вызова метода BeginRead(), методу передаются параметры аналогичные методу Read() + дополнительные, необходимые для осуществления асинхронного процесса.
Создается экземпляр класса AsyncReader, а заме продолжается выполнение – вывод порядковых чисел на консоль; теперь этому методу не приходиться отслеживать процедуру считывания, и он может выполнять какие-либо другие действия, совершенно от этой процедуры не зависящие. Метод HandleRead вызывается системой, когда завершается процедура считывания файла. Это позволяет приложению продолжать обработку какой-либо иной информации, пока выполняется относительно медленная процедура считывания файла.
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Предоставляет Stream в файле, поддерживая синхронные и асинхронные операции чтения и записи.
Примеры
В следующем примере показаны некоторые FileStream конструкторы.
В следующем примере показано, как выполнить запись в файл асинхронно. Этот код выполняется в приложении WPF с элементом управления TextBlock с именем UserInput и кнопкой, привязанной к обработчику событий щелчка, который называется Button_Click. Путь к файлу необходимо заменить на файл, существующий на компьютере.
Комментарии
Используйте FileStream класс для чтения, записи, открытия и закрытия файлов в файловой системе, а также для управления другими дескрипторами операционной системы, связанными с файлами, включая каналы, стандартные входные и стандартные выходные данные. Read Write Методы,, и можно использовать CopyTo Flush для выполнения синхронных операций или ReadAsync WriteAsync методов,, CopyToAsync и FlushAsync для выполнения асинхронных операций. Используйте асинхронные методы для выполнения ресурсоемких файловых операций без блокировки основного потока. Это соображение, связанное с производительностью, особенно важно в приложениях Магазина Windows 8.x и классических приложениях, в которых длительная потоковая операция может блокировать поток пользовательского интерфейса и создавать впечатление, что приложение не работает. FileStream буферизация входных и выходных данных для повышения производительности.
IsAsyncСвойство определяет, был ли этот файл открыт асинхронно. Это значение указывается при создании экземпляра FileStream класса с помощью конструктора, который имеет isAsync useAsync параметр, или options . Если свойство имеет значение true , поток использует перекрывающиеся операции ввода-вывода для асинхронного выполнения операций с файлами. Однако IsAsync свойство не обязательно должно true вызывать ReadAsync WriteAsync метод, или CopyToAsync . Если IsAsync свойство имеет значение false и вызываются асинхронные операции чтения и записи, то поток пользовательского интерфейса по-прежнему не блокируется, но фактическая операция ввода-вывода выполняется синхронно.
SeekМетод поддерживает произвольный доступ к файлам. Seek позволяет переместить расположение для чтения и записи в любое расположение в файле. Это делается с помощью параметров точки ссылки смещения в байтах. Смещение в байтах задается относительно точки ссылки поиска, которая может быть началом, текущей позицией или концом базового файла, как представлено тремя элементами SeekOrigin перечисления.
Файлы на диске всегда поддерживают произвольный доступ. Во время создания CanSeek значение свойства устанавливается в true или в false зависимости от базового типа файла. Если базовым типом файла является FILE_TYPE_DISK, как определено в винбасе. h, CanSeek свойство имеет значение true . В противном случае CanSeek значение свойства равно false .
Если процесс завершается с заблокированной частью файла или закрывает файл с необработанными блокировками, поведение не определено.
Сведения об операциях с каталогами и других файловых операциях см. в разделе File Directory классы, и Path . FileКласс — это служебный класс, который имеет статические методы в основном для создания FileStream объектов на основе путей к файлам. MemoryStreamКласс создает поток из массива байтов и аналогичен FileStream классу.
Список общих операций с файлами и каталогами см. в разделе Общие задачи ввода-вывода.
Обнаружение изменений в положении потока
Если у FileStream объекта нет монопольного удержания на его обработчике, другой поток может одновременно получить доступ к этому обработчику файлов и изменить расположение указателя файла операционной системы, связанного с этим обработчиком файлов. В этом случае кэшированное расположение в FileStream объекте и кэшированные данные в буфере могут быть скомпрометированы. FileStreamОбъект, как правило, выполняет проверки методов, обращающихся к кэшированному буферу, чтобы убедиться, что расположение маркера операционной системы совпадает с кэшированной позицией, используемой FileStream объектом.
Если в вызове метода обнаружено непредвиденное изменение в положении Handle Write , содержимое буфера удаляется и IOException создается исключение.
FileStreamУ объекта не будет монопольного удержания на его обработку, когда доступ к SafeFileHandle свойству предоставляется для доступа к обработчику, или FileStream объект получает SafeFileHandle свойство в своем конструкторе.
Конструкторы
Инициализирует новый экземпляр класса FileStream для заданного дескриптора файла, используя указанные разрешения на чтение и запись.
Инициализирует новый экземпляр класса FileStream для заданного дескриптора файла, используя указанные разрешения на чтение и запись и владельца экземпляра FileStream .
Инициализирует новый экземпляр класса FileStream для заданного дескриптора файла, используя указанные разрешения на чтение и запись, владельца экземпляра FileStream и размер буфера.
Инициализирует новый экземпляр класса FileStream для заданного дескриптора файла, используя указанные разрешения на чтение и запись, владельца экземпляра FileStream , размер буфера и синхронное или асинхронное состояние.
Инициализирует новый экземпляр класса FileStream для заданного дескриптора файла, используя указанные разрешения на чтение и запись.
Инициализирует новый экземпляр класса FileStream для заданного дескриптора файла, используя указанные разрешения на чтение и запись и размер буфера.
Инициализирует новый экземпляр класса FileStream для заданного дескриптора файла, используя указанные разрешения на чтение и запись, размер буфера и синхронное или асинхронное состояние.
Инициализирует новый экземпляр класса FileStream указанным путем и режимом создания.
Инициализирует новый экземпляр класса FileStream заданным путем, режимом создания и разрешением на чтение и запись.
Инициализирует новый экземпляр класса FileStream заданным путем, режимом создания, разрешением на чтение и запись и разрешением на совместное использование.
Инициализирует новый экземпляр класса FileStream заданным путем, режимом создания, разрешениями на чтение и запись и на совместное использование, а также размером буфера.
Инициализирует новый экземпляр класса FileStream заданным путем, режимом создания, разрешениями на чтение и запись и совместное использование, размером буфера и синхронным или асинхронным состоянием.
Инициализирует новый экземпляр класса FileStream заданным путем, режимом создания, разрешениями на чтение, запись и совместное использование, доступом для других FileStreams к этому же файлу, размером буфера и дополнительными параметрами файла.
Инициализирует новый экземпляр класса FileStream заданным путем, режимом создания, разрешениями на чтение, запись и совместное использование, размером буфера и дополнительными параметрами файла.
Инициализирует новый экземпляр класса FileStream заданными путем, режимом создания, правами на доступ и совместное использование, размером буфера, дополнительными параметрами файла, управлением доступом и аудитом безопасности.
Инициализирует новый экземпляр FileStream класса с заданным путем, режимом создания, разрешением на чтение, запись и совместное использование, доступ к другим потокам FILESTREAM может иметь один и тот же файл, размер буфера, дополнительные параметры файла и размер выделения.
Свойства
Получает значение, указывающее, поддерживает ли текущий поток чтение.
Получает значение, указывающее, поддерживает ли текущий поток поиск.
Возвращает значение, которое показывает, может ли для данного потока истечь время ожидания.
Получает значение, указывающее, поддерживает ли текущий поток запись.
Возвращает дескриптор файла операционной системы для файла, инкапсулируемого текущим объектом FileStream .
Получает значение, указывающее, как был открыт FileStream : синхронно или асинхронно.
Получает длину потока в байтах.
Получает абсолютный путь к файлу, открытому в функции FileStream .
Возвращает или задает текущую позицию этого потока.
Возвращает или задает значение в миллисекундах, определяющее период времени, отведенного потоку на выполнение операции чтения.
Возвращает объект SafeFileHandle, представляющий дескриптор файла операционной системы для файла, инкапсулируемого текущим объектом FileStream.
Возвращает или задает значение в миллисекундах, определяющее период времени, отведенного потоку на выполнение операции записи.
Методы
Начинает операцию асинхронного чтения. Вместо него рекомендуется использовать класс ReadAsync(Byte[], Int32, Int32, CancellationToken).
Начинает операцию асинхронного чтения. (Рекомендуется использовать ReadAsync(Byte[], Int32, Int32).)
Начинает операцию асинхронной записи. Вместо него рекомендуется использовать класс WriteAsync(Byte[], Int32, Int32, CancellationToken).
Начинает операцию асинхронной записи. (Рекомендуется использовать WriteAsync(Byte[], Int32, Int32).)
Закрывает текущий поток и отключает все ресурсы (например, сокеты и файловые дескрипторы), связанные с текущим потоком.
Закрывает текущий поток и отключает все ресурсы (например, сокеты и файловые дескрипторы), связанные с текущим потоком. Вместо вызова данного метода, убедитесь в том, что поток надлежащим образом ликвидирован.
Считывает байты из текущего потока и записывает их в другой поток.
Считывает байты из текущего потока и записывает их в другой поток, используя указанный размер буфера.
Асинхронно считывает байты из текущего потока и записывает их в другой поток.
Асинхронно считывает байты из текущего потока и записывает их в другой поток, используя указанный токен отмены.
Асинхронно считывает байты из текущего потока и записывает их в другой поток, используя указанный размер буфера.
Асинхронно считывает байты из текущего файлового потока и записывает их в другой поток, используя указанный размер буфера и токен отмены.
Асинхронно считывает байты из текущего потока и записывает их в другой поток, используя указанный размер буфера и токен отмены.
Создает объект, который содержит всю необходимую информацию для создания прокси-сервера, используемого для взаимодействия с удаленным объектом.
Освобождает все ресурсы, занятые модулем Stream.
Освобождает неуправляемые ресурсы, используемые объектом FileStream, а при необходимости освобождает также управляемые ресурсы.
Асинхронно освобождает неуправляемые ресурсы, используемые классом FileStream.
Асинхронно освобождает неуправляемые ресурсы, используемые классом Stream.
Ожидает завершения отложенной асинхронной операции чтения. (Рекомендуется использовать ReadAsync(Byte[], Int32, Int32, CancellationToken).)
Ожидает завершения отложенного асинхронного чтения. (Рекомендуется использовать ReadAsync(Byte[], Int32, Int32).)
Завершает асинхронную операцию записи и блокирует до тех пор, пока не будет завершена операция ввода-вывода. (Рекомендуется использовать WriteAsync(Byte[], Int32, Int32, CancellationToken).)
Заканчивает операцию асинхронной записи. (Рекомендуется использовать WriteAsync(Byte[], Int32, Int32).)
Определяет, равен ли указанный объект текущему объекту.
Гарантирует, что ресурсы освобождены и выполнены другие операции очистки, когда сборщик мусора восстанавливает FileStream .
Очищает буферы для этого потока и вызывает запись всех буферизованных данных в файл.
Очищает буферы для этого потока и вызывает запись всех буферизованных данных в файл, а также очищает все буферы промежуточных файлов.
Асинхронно очищает все буферы для этого потока и вызывает запись всех буферизованных данных в базовое устройство.
Асинхронно очищает все буферы данного потока, вызывает запись буферизованных данных в базовое устройство и отслеживает запросы отмены.
Асинхронно очищает все буферы данного потока, вызывает запись буферизованных данных в базовое устройство и отслеживает запросы отмены.
Возвращает объект FileSecurity, который инкапсулирует записи списка управления доступом (ACL) для файла, описываемого текущим объектом FileStream.
Служит хэш-функцией по умолчанию.
Извлекает объект обслуживания во время существования, который управляет политикой времени существования данного экземпляра.
Возвращает объект Type для текущего экземпляра.
Получает объект службы времени существования для управления политикой времени существования для этого экземпляра.
Запрещает другим процессам чтение объекта FileStream и запись в этот объект.
Создает неполную копию текущего объекта Object.
Создает неполную копию текущего объекта MarshalByRefObject.
Обеспечивает поддержку для Contract.
Выполняет чтение блока байтов из потока и запись данных в заданный буфер.
Считывает последовательность байтов из текущего файлового потока и перемещает позицию внутри файлового потока на число считанных байтов.
При переопределении в производном классе считывает последовательность байтов из текущего потока и перемещает позицию в потоке на число считанных байтов.
Асинхронно считывает последовательность байтов из текущего потока и перемещает позицию внутри потока на число считанных байтов.
Асинхронно считывает последовательность байтов из текущего файлового потока, записывает их в массив байтов по заданному смещению, перемещает позицию в файловом потоке на число считанных байтов и отслеживает запросы отмены.
Асинхронно считывает последовательность байтов из текущего потока, перемещает позицию в потоке на число считанных байтов и отслеживает запросы отмены.
Асинхронно считывает последовательность байтов из текущего файлового потока, записывает их в область памяти, перемещает позицию в файловом потоке на число считанных байтов и отслеживает запросы отмены.
Асинхронно считывает последовательность байтов из текущего потока, перемещает позицию в потоке на число считанных байтов и отслеживает запросы отмены.
Считывает байт из файла и перемещает положение чтения на один байт.
Устанавливает текущее положение этого потока на заданное значение.
Применяет записи списка управления доступом (ACL), описанные объектом FileSecurity, к файлу, который описывается текущим объектом FileStream.
Устанавливает длину этого потока на заданное значение.
Возвращает строку, представляющую текущий объект.
Разрешает доступ других процессов ко всему ранее заблокированному файлу или его части.
Записывает блок байтов в файловый поток.
Записывает последовательность байтов в текущий файловый поток из диапазона только для чтения и перемещает текущую позицию внутри файлового потока на число записанных байтов.
При переопределении в производном классе записывает последовательность байтов в текущий поток и перемещает текущую позицию в нем вперед на число записанных байтов.
Асинхронно записывает последовательность байтов в текущий поток и перемещает текущую позицию внутри потока на число записанных байтов.
Асинхронно записывает последовательность байтов в текущий поток, перемещает текущую позицию внутри потока на число записанных байтов и отслеживает запросы отмены.
Асинхронно записывает последовательность байтов в текущий поток, перемещает текущую позицию внутри потока на число записанных байтов и отслеживает запросы отмены.
Асинхронно записывает последовательность байтов из области памяти в текущий файловый поток, перемещает текущую позицию внутри файлового потока на число записанных байтов и отслеживает запросы отмены.
Асинхронно записывает последовательность байтов в текущий поток, перемещает текущую позицию внутри потока на число записанных байтов и отслеживает запросы отмены.
Запись байта в текущую позицию в потоке файла.
Явные реализации интерфейса
Освобождает все ресурсы, занятые модулем Stream.
Методы расширения
Возвращает сведения о безопасности для файла.
Изменяет атрибуты безопасности для существующего файла.
Преобразует заданный поток в поток прямого доступа.
Настраивает способ выполнения ожиданий для задач, возвращаемых из асинхронного высвобождаемого объекта.
БлогNot. Лекции по C/C++: работа с файлами (fstream)
Лекции по C/C++: работа с файлами (fstream)
Механизм ввода-вывода, разработанный для обычного языка С, не соответствует общепринятому сегодня стилю объектно-ориентированного программирования, кроме того, он активно использует операции с указателями, считающиеся потенциально небезопасными в современных защищённых средах выполнения кода. Альтернативой при разработке прикладных приложений является механизм стандартных классов ввода-вывода, предоставляемый стандартом языка C++.
Открытие файлов
Наиболее часто применяются классы ifstream для чтения, ofstream для записи и fstream для модификации файлов.
Все поточные классы ввода-вывода являются косвенными производными от общего предка ios , полностью наследуя его функциональность. Так, режим открытия файлов задает член данных перечисляемого типа open_mode, который определяется следующим образом:
Ниже приведены возможные значения флагов и их назначение.
Режим | Назначение |
in | Открыть для ввода (выбирается по умолчанию для ifstream) |
out | Открыть для вывода (выбирается по умолчанию для ofstream) |
binary | Открыть файл в бинарном виде |
aрр | Присоединять данные; запись в конец файла |
ate | Установить файловый указатель на конец файла |
trunc | Уничтожить содержимое, если файл существует (выбирается по умолчанию, если флаг out указан, а флаги ate и арр — нет) |
Например, чтобы открыть файл с именем test.txt для чтения данных в бинарном виде, следует написать:
Оператор логического ИЛИ ( | ) позволяет составить режим с любым сочетанием флагов. Так, чтобы, открывая файл по записи, случайно не затереть существующий файл с тем же именем, надо использовать следующую форму:
Предполагается, что к проекту подключён соответствующий заголовочный файл:
Для проверки того удалось ли открыть файл, можно применять конструкцию
Операторы включения и извлечения
Переопределённый в классах работы с файлами оператор включения ( << ) записывает данные в файловый поток. Как только вы открыли файл для записи, можно записывать в него текстовую строку целиком:
Можно также записывать текстовую строку по частям:
Оператор endl завершает ввод строки символом "возврат каретки":
С помощью оператора включения несложно записывать в файл значения переменных или элементов массива:
В результате выполнения кода образуется три строки текстового файла Temp.txt :
Обратите внимание, что числовые значения записываются в файл в виде текстовых строк, а не двоичных значений.
Оператор извлечения ( >> )производит обратные действия. Казалось бы, чтобы извлечь символы из файла Temp.txt , записанного ранее, нужно написать код наподобие следующего:
Однако оператор извлечения остановится на первом попавшемся разделителе (символе пробела, табуляции или новой строки). Таким образом, при разборе предложения "Текстовый массив содержит переменные" только слово "Текстовый" запишется в массив buff , пробел игнорируется, а слово "массив" станет значением целой переменной vx и исполнение кода "пойдет вразнос" с неминуемым нарушением структуры данных. Далее, при обсуждении класса ifstream , будет показано, как правильно организовать чтение файла из предыдущего примера.
Класс ifstream: чтение файлов
Как следует из расшифровки названия, класс ifstream предназначен для ввода файлового потока. Далее перечислены основные методы класса. Большая часть из них унаследована от класса istream и перегружена с расширением родительской функциональности. К примеру, функция get , в зависимости от параметра вызова, способна считывать не только одиночный символ, но и символьный блок.
Метод | Описание |
open | Открывает файл для чтения |
get | Читает один или более символов из файла |
getline | Читает символьную строку из текстового файла или данные из бинарного файла до определенного ограничителя |
read | Считывает заданное число байт из файла в память |
eof | Возвращает ненулевое значение (true), когда указатель потока достигает конца файла |
peek | Выдает очередной символ потока, но не выбирает его |
seekg | Перемещает указатель позиционирования файла в заданное положение |
tellg | Возвращает текущее значение указателя позиционирования файла |
close | Закрывает файл |
Теперь понятно, как нужно модифицировать предыдущий пример, чтобы использование оператора извлечения данных давало ожидаемый результат:
Метод getline прочитает первую строку файла до конца, а оператор >> присвоит значения переменным.
Следующий пример показывает добавление данных в текстовый файл с последующим чтением всего файла. Цикл while (1) используется вместо while(!file2.eof()) по причинам, которые обсуждались в предыдущей лекции.
Этот код под ОС Windows также зависит от наличия в последней строке файла символа перевода строки, надежнее было бы сделать так:
Явные вызовы методов open и close не обязательны. Действительно, вызов конструктора с аргументом позволяет сразу же, в момент создания поточного объекта file , открыть файл:
Вместо метода close можно использовать оператор delete , который автоматически вызовет деструктор объекта file и закроет файл. Код цикла while обеспечивает надлежащую проверку признака конца файла.
Класс ofstream: запись файлов
Класс ofstream предназначен для вывода данных из файлового потока. Далее перечислены основные методы данного класса.
Метод | Описание |
open | Открывает файл для записи |
put | Записывает одиночный символ в файл |
write | Записывает заданное число байт из памяти в файл |
seekp | Перемещает указатель позиционирования в указанное положение |
tellp | Возвращает текущее значение указателя позиционирования файла |
close | Закрывает файл |
Описанный ранее оператор включения удобен для организации записи в текстовый файл:
Бинарные файлы
В принципе, бинарные данные обслуживаются наподобие текстовых. Отличие состоит в том, что если бинарные данные записываются в определенной логической структуре, то они должны считываться из файла в переменную того же структурного типа.
Первый параметр методов write и read (адрес блока записи/чтения) должен иметь тип символьного указателя char * , поэтому необходимо произвести явное преобразование типа адреса структуры void * . Второй параметр указывает, что бинарные блоки файла имеют постоянный размер байтов независимо от фактической длины записи. Следующее приложение дает пример создания и отображения данных простейшей записной книжки. Затем записи файла последовательно считываются и отображаются на консоли.
P.S. При выполнении этого и других листингов в Visual Studio последних версий может дополнительно понадобиться подключение директивы _CRT_SECURE_NO_WARNINGS.
В результате выполнения этого кода образуется бинарный файл Notebook.dat из трех блоков размером по 80 байт каждый (при условии, что символы - однобайтовые). Естественно, вы можете использовать другие поточные методы и проделывать любые операции над полями определенной структуры данных.
Класс fstream: произвольный доступ к файлу
Предположим что в нашей записной книжке накопилось 100 записей, а мы хотим считать 50-ю. Конечно, можно организовать цикл и прочитать все записи с первой по заданную. Очевидно, что более целенаправленное решение - установить указатель позиционирования файла pos прямо на запись 50 и считать ее:
Подобные операции поиска эффективны, если файл состоит из записей известного и постоянного размера. Чтобы заменить содержимое произвольной записи, надо открыть поток вывода в режиме модификации:
Если не указать флаг ios::ate (или ios::app ), то при открытии бинарного файла Notebook.dat его предыдущее содержимое будет стерто!
Дополнительно может понадобиться указать, откуда отсчитывается смещение.
Наконец, можно открыть файл одновременно для чтения/записи, используя методы, унаследованные поточным классом fstream от своих предшественников. Поскольку класс fstream произведен от istream и ostream (родителей ifstream и ofstream соответственно), все упомянутые ранее методы становятся доступными в приложении.
Примеры применения класса FileStream без использования дополнительных потоков (декораторов, адаптеров)
Перед изучением данной темы рекомендуется ознакомиться со следующими темами:
Класс FileStream может быть применен автономно без использования дополнительных потоков адаптеров или декораторов. Для этого в классе есть все необходимые средства (методы). Основные методы класс наследует от базового класса Stream .
Содержание
Поиск на других ресурсах:
1. Пример чтения/записи числа типа double в файл. Использование FileStream
В примере продемонстрировано использование средств класса FileStream и базового класса Stream для записи/чтения числа типа double в файл.
2. Пример записи/чтения массива чисел типа int[]
В примере продемонстрирована запись массива типа int[] в файл и его чтение. В программном коде используются методы Read() , Write() базового класса Stream . Поскольку методы Read() , Write() требуют представления данных в виде массива байт типа byte[] , то для выполнения операций конвертирования используются возможности класса BitConverter .
Результат выполнения программы
3. Пример записи/чтения массива строк string[]
В примере продемонстрирована запись массива строк в файл и его чтение.
Результат выполнения программы
4. Пример записи/чтения массива экземпляров класса Car (автомобиль)
Условие задачи. Задан класс Car , который содержит следующие члены данных:
- model – марка автомобиля;
- volume – объем двигателя;
- year – год выпуска.
Также класс Car содержит свойства доступа к членам данных и специальные функции класса:
- конструктор;
- свойства Model , Volume , Year .
Нужно реализовать запись массива экземпляров типа Car[] в файл и его считывание с последующим выводом результата.
Решение. Текст программы, решающий данную задачу следующий.
Читайте также: