Какие файловые потоки бывают
Для работы с файлами в стандартной библиотеке определен заголовочный файл fstream , который определяет базовые типы для чтения и записи файлов. В частности, это:
ifstream : для чтения с файла
ofstream : для записи в файл
fstream : совмещает запись и чтение
Для работы с данными типа wchar_t для этих потоков определены двойники:
Типы потоков
Ниже приведен список типов потоков NTFS, которые также называются кодами типов атрибутов. Некоторые типы потоков являются внутренними для файловой системы NTFS, и их формат не является документом.
Программа взаимодействует с целевой средой путем чтения и записи файлов. Файл может представлять собой:
Набор данных, который можно считывать и записывать многократно.
Поток байт, создаваемый программой (например, конвейер).
Поток байт, полученный из периферийного устройства или отправленный на периферийное устройство.
Последние два элемента — это интерактивные файлы. Как правило, файлы являются основным способом взаимодействия с программой. Все эти типы файлов управляются практически так же — , путем вызова библиотечных функций. Для объявления большинства этих функций необходимо включать стандартный заголовок STDIO.H.
Перед выполнением большинства операций над файлом его необходимо открыть. Открытие файла связывает его с потоком — структурой данных в стандартной библиотеке C, которая сглаживает большинство различий между файлами различных типов. Библиотека поддерживает состояние каждого потока в объекте типа FILE.
Перед запуском программы целевая среда открывает три файла. Вы можете открыть файл, вызвав функцию библиотеки fopen, _wfopen с двумя аргументами. (Функция fopen не рекомендуется к использованию, используйте вместо нее fopen ). Первым аргументом является имя файла. Вторым аргументом является строка C, определяющая:
предполагается ли считывание данных из файла или запись в него данных (либо и то, и другое);
предполагается ли содержание нового содержимого для файла (или создание нового файла, если он не существовал до этого) или сохранение существующего содержимого;
может ли запись в файл изменить существующее содержимое или следует только добавить байты в конец файла;
с текстовым потоком или двоичным потоком требуется работать.
После того как файл успешно открыт, можно определить, является ли поток ориентированным на байты (байтовым потоком), или ориентированным на расширенные символы (расширенный поток). Поток изначально несвязан. Вызов некоторых функций для работы над потоком делает его байтовым, тогда как некоторые другие функции делают его расширенным. Когда поток уже создан, он сохраняет ориентацию до тех пор, пока не будет закрыт функцией fclose или freopen.
Все инструменты для работы с системой ввода-вывода и потоками в языке С++ определены в стандартной библиотеке. Заголовочный файл iostream определяет следующие базовые типы для работы с потоками:
istream и wistream : читают данные с потока
ostream и wostream : записывают данные в поток
iostream и wiostream : читают и записывают данные в поток
Для каждого типа определен его двойник, который начинается на букву w и который предназначен для поддержки данных типа wchar_t.
Эти типы являются базовыми для других классов, управляющих потоками ввода-вывода.
Объект типа ostream получает значения различных типов, преобразует их в последовательность символов и передает их через буфер в определенное место для вывода (консоль, файл, сетевые интерфейсы и т.д.)
Поток istream получает через буфер из определенного места последовательности символов (с консоли, из файла, из сети и т.д.) и преобразует эти последовательности в значения различных типов. То есть когда мы вводим данные (с той же клавиатуры в консоли), сначала данные накапливаются в буфере и только затем передаются объекту istream.
По умолчанию в стандартной библиотеке определены объекты этих классов - cout , cin , cerr , которые работают с консолью.
Средства чтения и записи
Пространство имен System.IO также предоставляет типы для чтения закодированных символов из потоков и их записи в потоки. Как правило, потоки предназначены для ввода и вывода байтов. Типы чтения и записи обрабатывают преобразование закодированных символов в байты или из байтов, чтобы поток мог завершить операцию. Каждый класс чтения и записи связан с потоком, который можно получить с помощью свойства класса BaseStream .
Ниже перечислены некоторые часто используемые классы для чтения и записи:
BinaryReader и BinaryWriter — для чтения и записи простых типов данных, таких как двоичные значения.
StreamReader и StreamWriter — для чтения и записи символов с использованием закодированного значения для преобразования символов в байты или из байтов.
StringReader и StringWriter — для чтения и записи символов в строки или из строк.
TextReader и TextWriter используются в качестве абстрактных базовых классов для других средств чтения и записи, которые считывают и записывают символы и строки, а не двоичные данные.
соглашения об именовании для Потоки
при указании из командной строки оболочки Windows полное имя потока — "имя_файла:поток имя:тип потока", как показано в следующем примере: "myfile. dat: stream1: $DATA".
Все символы, допустимые для имени файла, также являются допустимыми для имени потока, включая пробелы. Дополнительные сведения см. в разделе Присвоение имени файлу. Тип потока (также называемый кодом типа атрибута) является внутренним для файловой системы NTFS. Поэтому пользователи не могут создавать новые типы потоков, но могут открывать существующие типы файловой системы NTFS. Значения спецификатора типа потока всегда начинаются с символа доллара ($). Список типов потоков см. ниже.
По умолчанию поток данных не имеет имени. Чтобы полностью указать поток данных по умолчанию, используйте "filename:: $Data", где $Data является типом потока. Это эквивалентно "filename". В файле можно создать именованный поток, используя соглашения об именовании файлов. Обратите внимание, что "$DATA" является допустимым именем потока. Например, полное имя потока с именем "$DATA" для файла "Sample" будет иметь вид "Sample: $data: $Data". Если вы создали поток с именем "Bar" для того же файла, его полное имя будет иметь вид "Пример: линейчатая диаграмма: $Data".
При создании и работе с файлами, имеющими имена из одного символа, добавляйте к имени файла с точкой, за которой следует обратная косая черта (. ) или используйте полное имя пути. причина этого заключается в том, что Windows воспринимает имена файлов одного символа как буквы диска. Если буква диска указана с помощью относительного пути, двоеточие отделяет букву диска от пути. при неоднозначности того, является ли односимвольное имя буквой диска или именем файла, Windows предполагает, что это буква диска, если строка, следующая за двоеточием, является допустимым путем, даже если буква диска является недопустимой.
Изолированное хранилище
Изолированное хранилище — это механизм хранения данных, обеспечивающий изоляцию и безопасность путем определения стандартизованных способов сопоставления кода с хранимыми данными. Хранилище предоставляет виртуальную файловую систему, изолированную по пользователю, сборке и (необязательно) домену. Изолированное хранилище особенно полезно в том случае, когда приложение не имеет разрешения на доступ к файлам пользователя. Можно сохранить параметры или файлы для приложения таким способом, который контролируется политикой безопасности компьютера.
Изолированное хранилище недоступно для приложений Microsoft Store для Windows 8.x. Вместо этого используйте классы данных приложения в пространстве имен Windows.Storage. Дополнительные сведения см. в разделе Данные приложения.
Часто используются следующие классы, реализующие изолированное хранилище:
IsolatedStorage предоставляет базовый класс для реализации изолированного хранилища.
IsolatedStorageFile предоставляет область изолированного хранилища, в которой содержатся файлы и каталоги.
IsolatedStorageFileStream представляет файл в изолированном хранилище.
Вывод ошибок
Закрытие файла
После завершения работы с файлом его следует закрыть с помощью функции close() . Также стоит отметить, то при выходе объекта потока из области видимости, он удаляется, и у него автоматически вызывается функция close.
Стоит отметить, что при компиляции через g++ следует использовать флаг -static , если программа работает со файлами и использует типы из заголовочного файла fstream:
Файл — это упорядоченная и именованная последовательность байтов, имеющая постоянное хранилище. При работе с файлами используются пути к каталогам, запоминающие устройства, а также имена файлов и каталогов. В отличие от файла, поток — это последовательность байтов, которую можно использовать для записи или чтения из вспомогательного запоминающего устройства, являющегося одним из устройств хранения информации (например, дисков или памяти). Есть несколько видов запоминающих устройств, отличных от дисков, и существует несколько видов потоков, помимо файловых потоков, например сетевые потоки, потоки памяти и потоки каналов.
Файлы и каталоги
Типы в пространстве имен System.IO можно использовать для взаимодействия с файлами и каталогами. Например, можно получать и задавать свойства файлов и каталогов, а также извлекать коллекции файлов и каталогов на основе критерия поиска.
Ниже перечислены некоторые часто используемые классы для файлов и каталогов:
File предоставляет статические методы для создания, копирования, удаления, перемещения и открытия файлов, а также помогает создать объект FileStream.
FileInfo предоставляет методы экземпляра для создания, копирования, удаления, перемещения и открытия файлов, а также помогает создать объект FileStream.
Directory предоставляет статические методы для создания, перемещения и перечисления в каталогах и подкаталогах.
DirectoryInfo предоставляет методы экземпляра для создания, перемещения и перечисления в каталогах и подкаталогах.
Path предоставляет методы и свойства для обработки строк каталогов межплатформенным способом.
При вызове методов для работы с файловой системой следует всегда использовать надежные механизмы обработки исключений. Дополнительные сведения см. в разделе об обработке ошибок ввода-вывода.
Помимо использования этих классов, пользователи Visual Basic могут использовать методы и свойства, предоставляемые классом Microsoft.VisualBasic.FileIO.FileSystem для файлового ввода-вывода.
Потоки
Абстрактный базовый класс Stream поддерживает чтение и запись байтов. Все классы, представляющие потоки, являются производными от класса Stream. Класс Stream и его производные классы обеспечивают общий способ просмотра источников данных и хранилищ объектов, а также изолируют программиста от специфических особенностей операционной системы и базовых устройств.
Потоки включают три основные операции:
Чтение — перенос информации из потока в структуру данных, такую как массив байтов.
Запись — перенос данных в поток из источника данных.
Поиск — определение и изменение текущей позиции внутри потока.
В зависимости от базового источника или хранилища данных поток может поддерживать лишь некоторые из этих возможностей. Например, класс PipeStream не поддерживает поиск. Свойства CanRead, CanWrite и CanSeek потока определяют операции, поддерживаемые потоком.
Ниже перечислены некоторые часто используемые классы потока:
FileStream — для чтения и записи в файл.
IsolatedStorageFileStream — для чтения и записи в файл в изолированном хранилище.
MemoryStream — для чтения и записи в память в качестве резервного хранилища.
BufferedStream — для повышения быстродействия операций чтения и записи.
NetworkStream — для чтения и записи на сетевые сокеты.
PipeStream — для чтения и записи в анонимные и именованные каналы.
CryptoStream — для связи потоков данных с криптографическими преобразованиями.
Пример асинхронной работы с потоками см. в разделе Асинхронный файловый ввод-вывод.
Асинхронные операции ввода-вывода
Чтение и запись больших объемов данных может быть ресурсоемкой. Эти задачи необходимо выполнять асинхронно, если приложение должно продолжать отвечать на запросы пользователя. В случае синхронных операций ввода-вывода поток пользовательского интерфейса будет заблокирован до тех пор, пока ресурсоемкая операция не завершится. При разработке приложений Microsoft Store для Windows 8.x используйте асинхронные операции ввода-вывода, чтобы не создавалось впечатления, что приложение прекратило свою работу.
Асинхронные члены содержат Async имена, такие как CopyToAsync методы, FlushAsyncReadAsync , и WriteAsync . Используйте эти методы с ключевыми словами async и await .
Дополнительные сведения см. в разделе Асинхронный файловый ввод-вывод.
Операции ввода-вывода в приложениях Microsoft Store
Следует отметить некоторые важные различия в использовании операций ввода-вывода в приложениях Microsoft Store для Windows 8.x:
Изолированное хранилище недоступно; вместо этого используйте данные приложения.
Используйте асинхронные методы, такие как ReadAsync и WriteAsync, чтобы предотвратить блокировку потока пользовательского интерфейса.
Дополнительные сведения об операциях ввода-вывода в приложении Microsoft Store для Windows 8.x: Краткое руководство. Чтение и запись файлов.
См. также
Распространенные задачи ввода-вывода
Содержит список задач ввода-вывода, связанных с файлами, каталогами и потоками, а также ссылки на соответствующее содержимое и примеры для каждой задачи.
Асинхронный файловый ввод-вывод
Описывает преимущества и основные операции асинхронного ввода и вывода.
Изолированное хранилище
Описывает механизм хранения данных, обеспечивающий автономность и безопасность путем определения стандартизованных способов сопоставления кода с защищенными данными.
Сопоставленные в памяти файлы
Описание отображаемых в память файлов, позволяющих разместить содержимое файлов с диска в виртуальной памяти. С их помощью можно вносить изменения в очень большие файлы и создавать совместно используемую память для межпроцессного взаимодействия.
Поток — это последовательность байтов. В файловой системе NTFS потоки содержат данные, которые записываются в файл и предоставляют дополнительные сведения о файле, чем атрибуты и свойства. Например, можно создать поток, содержащий ключевые слова поиска, или удостоверение учетной записи пользователя, которая создает файл.
Каждый поток, связанный с файлом, имеет свой собственный размер выделения, фактический размер и допустимую длину данных:
- Размер выделения — это объем места на диске, зарезервированный для потока.
- Фактический размер — это число байтов, используемых вызывающим объектом.
- Допустимая длина данных (ВДЛ) — это число байтов, инициализированных из размера выделения для потока.
Каждый поток также сохраняет свое собственное состояние для сжатия, шифрования и разреженности. Атрибут _ _ разреженного _ файла атрибута file задается в элементе двфилеаттрибутес структуры _ _ данных Win32 Find , возвращаемой функциями FindFirstFile, финдфирстфиликси FindNextFile , если любой из потоков когда-либо был разреженным. GetFileAttributes, сбой getfileattributesex, жетфилеаттрибутестрансактед, жетфилеинформатионбихандлеи жетфилеинформатионбихандликс возвращают разреженное состояние потока данных по умолчанию, если поток не указан.
Нет файлов со временем, связанных с потоком. Время файла для файла обновляется при обновлении любого потока в файле.
Для каждого потока поддерживается оппортунистическая блокировка. Режимы совместного использования также поддерживаются для каждого потока. Когда для файла запрашивается доступ на удаление, операционная система проверяет доступ на удаление всех открытых потоков в файле. Если другой процесс открыл поток без разрешения на _ _ удаление файлового ресурса , открыть его для удаления доступа нельзя.
Если копируемый файл содержит поток данных и используется перенаправитель сети, то файл можно скопировать только в том случае, если у клиента есть разрешение на чтение и чтение атрибутов.
Потоки символов wchar_t
Для работы с потоками данных типов wchar_t в стандартной библиотеке определены объекты wcout (тип wostream), wcerr (тип wostream) и wcin (тип wistream), которые являются аналогами для объектов cout, cerr и cin и работают аналогично
Запись в поток
К примеру, по умолчанию стандартная библиотека C++ предоставляет объект cout , который представляет тип ostream и позволяет выводить данные на консоль:
Ввод-вывод и безопасность
При использовании классов в пространстве имен System.IO необходимо выполнить требования безопасности операционной системы, такие как списки управления доступом для контроля доступа к файлам и каталогам. Это требование дополняет остальные требования FileIOPermission. Списками управления доступом можно управлять программно. Дополнительные сведения см. в разделе Практическое руководство. Добавление или удаление записей списка управления доступом.
Проверка безопасности выполняется только при создании потока. Поэтому не рекомендуется открывать поток, а затем передавать его коду с меньшим уровнем доверия или доменам приложений.
Открытие файла
При операциях с файлом вначале необходимо открыть файл с помощью функции open() . Данная функция имеет две версии:
Для открытия файла в функцию необходимо передать путь к файлу в виде строки. И также можно указать режим открытия. Список доступных режимов открытия файла:
ios::in : файл открывается для ввода (чтения). Может быть установлен только для объекта ifstream или fstream
ios::out : файл открывается для вывода (записи). При этом старые данные удаляются. Может быть установлен только для объекта ofstream или fstream
ios::app : файл открывается для дозаписи. Старые данные не удаляются.
ios::ate : после открытия файла перемещает указатель в конец файла
ios::trunc : файл усекается при открытии. Может быть установлен, если также установлен режим out
ios::binary : файл открывается в бинарном режиме
Если при открытии режим не указан, то по умолчанию для объектов ofstream применяется режим ios::out , а для объектов ifstream - режим ios::in . Для объектов fstream совмещаются режимы ios::out и ios::in .
Однако в принципе необязательно использовать функцию open для открытия файла. В качестве альтернативы можно также использовать конструктор объектов-потоков и передавать в них путь к файлу и режим открытия:
При вызове конструктора, в который передан путь к файлу, данный файл будет автоматически открываться:
Вообще использование конструкторов для открытия потока является более предпочтительным, так как определение переменной, представляющей файловой поток, уже преполагает, что этот поток будет открыт для чтения или записи. А использование конструктора избавит от ситуации, когда мы забудем открыть поток, но при этом начнем его использовать.
В процессе работы мы можем проверить, окрыт ли файл с помощью функции is_open() . Если файл открыт, то она возвращает true:
Сжатие
При сжатии и распаковке файлов и потоков часто используются следующие классы:
ZipArchive — для создания и восстановления содержимого ZIP-архива.
ZipArchiveEntry — для представления сжатого файла.
ZipFile — для создания, извлечения и открытия сжатого пакета.
ZipFileExtensions — для создания и извлечения содержимого из сжатого пакета.
DeflateStream — для сжатия и распаковки потоков с помощью алгоритма Deflate.
GZipStream — для сжатия и распаковки потоков в формате gzip.
См. практическое руководство по Сжатие и извлечение файлов.
Открытие файла
При операциях с файлом вначале необходимо открыть файл с помощью функции open() . Данная функция имеет две версии:
Для открытия файла в функцию необходимо передать путь к файлу в виде строки. И также можно указать режим открытия. Список доступных режимов открытия файла:
ios::in : файл открывается для ввода (чтения). Может быть установлен только для объекта ifstream или fstream
ios::out : файл открывается для вывода (записи). При этом старые данные удаляются. Может быть установлен только для объекта ofstream или fstream
ios::app : файл открывается для дозаписи. Старые данные не удаляются.
ios::ate : после открытия файла перемещает указатель в конец файла
ios::trunc : файл усекается при открытии. Может быть установлен, если также установлен режим out
ios::binary : файл открывается в бинарном режиме
Если при открытии режим не указан, то по умолчанию для объектов ofstream применяется режим ios::out , а для объектов ifstream - режим ios::in . Для объектов fstream совмещаются режимы ios::out и ios::in .
Однако в принципе необязательно использовать функцию open для открытия файла. В качестве альтернативы можно также использовать конструктор объектов-потоков и передавать в них путь к файлу и режим открытия:
При вызове конструктора, в который передан путь к файлу, данный файл будет автоматически открываться:
Вообще использование конструкторов для открытия потока является более предпочтительным, так как определение переменной, представляющей файловой поток, уже преполагает, что этот поток будет открыт для чтения или записи. А использование конструктора избавит от ситуации, когда мы забудем открыть поток, но при этом начнем его использовать.
В процессе работы мы можем проверить, окрыт ли файл с помощью функции is_open() . Если файл открыт, то она возвращает true:
Чтение данных
Для чтения данных из потока применяется оператор ввода >> , который принимает два операнда. Левый операнд представляет поток istream, с которого производится считывание, а правый операнд - объект, в который считываются данные.
Для чтения с консоли применяется объект cin , который представляет тип istream.
Однако такой способ не очень подходит для чтения строк с консоли особенно когда считываемая строка содержит пробельные символы. В этом случае лучше использовать встроенную функцию getline() , которая в качестве параметра принимает поток istream и переменную типа string, в которую надо считать данные:
Консольный вывод данной программы:
Читайте также: