| Microsoft Docs
- Чтение занимает 2 мин
В этой статье
Определяет несколько классов, поддерживающих операции iostreams для последовательностей, хранящихся во внешних файлах.
Синтаксис
#include <fstream>
Определения типов
Имя типа | Описание |
---|---|
filebuf | Тип, basic_filebuf специализированный для char параметров шаблона. |
fstream | Тип, basic_fstream специализированный для char параметров шаблона. |
ifstream | Тип, basic_ifstream специализированный для char параметров шаблона. |
ofstream | Тип, basic_ofstream специализированный для char параметров шаблона. |
wfstream | Тип, basic_fstream специализированный для wchar_t параметров шаблона. |
wifstream | Тип, basic_ifstream специализированный для wchar_t параметров шаблона. |
wofstream | Тип, basic_ofstream специализированный для wchar_t параметров шаблона. |
wfilebuf | Тип, basic_filebuf специализированный для wchar_t параметров шаблона. |
Классы
Класс | Описание |
---|---|
basic_filebuf | Шаблон класса описывает буфер потока, который управляет передачей элементов типа Elem , признаки символов которых определяются классом Tr , в последовательность элементов, хранящуюся во внешнем файле, и из нее. |
basic_fstream | Шаблон класса описывает объект, управляющий вставкой и извлечением элементов и закодированных объектов с помощью буфера потока класса basic_filebuf <Elem, Tr> , с элементами типа Elem , признаки символов которых определяются классом Tr . |
basic_ifstream | Шаблон класса описывает объект, управляющий извлечением элементов и закодированных объектов из буфера потока класса basic_filebuf <Elem, Tr> с элементами типа Elem , признаки символов которых определяются классом . |
basic_ofstream | Шаблон класса описывает объект, управляющий вставкой элементов и закодированных объектов в буфер потока класса basic_filebuf <Elem, Tr> с элементами типа Elem , признаки символов которых определяются классом Tr . |
См. также
Справочник по файлам заголовков
Безопасность потоков в стандартной библиотеке C++
Программирование iostream
Соглашения iostream
Ofstream c описание функций – Тарифы на сотовую связь
78 пользователя считают данную страницу полезной.
Информация актуальна! Страница была обновлена 16.12.2019
Блог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()) по причинам, которые обсуждались в предыдущей лекции.
В следующем примере показан цикл считывания строк из файла test.txt и их отображения на консоли.
Этот код под ОС Windows также зависит от наличия в последней строке файла символа перевода строки, надежнее было бы сделать так:
Явные вызовы методов open и close не обязательны. Действительно, вызов конструктора с аргументом позволяет сразу же, в момент создания поточного объекта file , открыть файл:
Вместо метода close можно использовать оператор delete , который автоматически вызовет деструктор объекта file и закроет файл. Код цикла while обеспечивает надлежащую проверку признака конца файла.
Класс ofstream: запись файлов
Класс ofstream предназначен для вывода данных из файлового потока. Далее перечислены основные методы данного класса.
Метод | Описание |
open | Открывает файл для записи |
put | Записывает одиночный символ в файл |
write | Записывает заданное число байт из памяти в файл |
seekp | Перемещает указатель позиционирования в указанное положение |
tellp | Возвращает текущее значение указателя позиционирования файла |
close | Закрывает файл |
Описанный ранее оператор включения удобен для организации записи в текстовый файл:
В принципе, бинарные данные обслуживаются наподобие текстовых. Отличие состоит в том, что если бинарные данные записываются в определенной логической структуре, то они должны считываться из файла в переменную того же структурного типа.
Первый параметр методов write и read (адрес блока записи/чтения) должен иметь тип символьного указателя char * , поэтому необходимо произвести явное преобразование типа адреса структуры void * . Второй параметр указывает, что бинарные блоки файла имеют постоянный размер байтов независимо от фактической длины записи. Следующее приложение дает пример создания и отображения данных простейшей записной книжки. Затем записи файла последовательно считываются и отображаются на консоли.
В результате выполнения этого кода образуется бинарный файл Notebook.dat из трех блоков размером по 80 байт каждый (при условии, что символы – однобайтовые). Естественно, вы можете использовать другие поточные методы и проделывать любые операции над полями определенной структуры данных.
Класс fstream: произвольный доступ к файлу
Предположим что в нашей записной книжке накопилось 100 записей, а мы хотим считать 50-ю. Конечно, можно организовать цикл и прочитать все записи с первой по заданную. Очевидно, что более целенаправленное решение – установить указатель позиционирования файла pos прямо на запись 50 и считать ее:
Подобные операции поиска эффективны, если файл состоит из записей известного и постоянного размера. Чтобы заменить содержимое произвольной записи, надо открыть поток вывода в режиме модификации:
Если не указать флаг ios::ate (или ios::app ), то при открытии бинарного файла Notebook.dat его предыдущее содержимое будет стерто!
Наконец, можно открыть файл одновременно для чтения/записи, используя методы, унаследованные поточным классом fstream от своих предшественников. Поскольку класс fstream произведен от istream и ostream (родителей ifstream и ofstream соответственно), все упомянутые ранее методы становятся доступными в приложении.
В следующем примере показана перестановка первой и третьей записей файла Notebook.dat .
В конструкторе объекта file надо указать флаги ios::in и ios::out , разрешая одновременное выполнение операций чтения и записи. В результате выполнения этого кода первая и третья записи бинарного файла Notebook.dat поменяются местами.
Дополнительные примеры по теме есть в этой заметке.
Оглавление серии
05.11.2015, 09:45; рейтинг: 103621
Привет я c++ начинающий, и это одно из моих заданий, и я немного застрял. Это не весь мой код, это всего лишь фрагмент того, с чем мне нужна помощь. То, что я пытаюсь сделать, это иметь одну функцию, предназначенную для экспорта всего с этой функцией в text файл, который называется results.txt. Поэтому строка «делает эту работу» должна отображаться, когда я открываю файл, но когда я запускаю файл, я получаю такие ошибки, как
«Ошибка C2065:« out »: необъявленный идентификатор»
«Ошибка C2275:« std :: ofstream »: незаконное использование этого типа в качестве выражения»
«IntelliSense: имя типа не допускается»
«IntelliSense: идентификатор» out «не определен»
Сейчас очень поздно, и я просто не понимаю, что делаю не так.
Решение
Прежде всего, это хорошо:
Однако это не так:
Это первая ошибка, которую вы получите: «Ошибка C2065:« out »: необъявленный идентификатор», потому что компилятор еще не знает об этом.
Во втором фрагменте вы хотите вызов выход с определенным ostream& , Вместо вызова функции вы даете объявление функции, что не разрешено в этом контексте. Вы должны назвать это с учетом ostream& :
В этом случае вы вызов output с out в качестве параметра.
Другие решения
Поскольку вы описали себя как начинающего, я отвечу соответственно и, надеюсь, в образовательной форме. Вот что происходит: подумайте о fstream , ofstream а также ifstream как умные типы переменных (даже если вы знаете, что такое классы, подумайте об этом ради логическая ясность). Как и любая другая переменная, вы должны объявить это прежде чем использовать. После того, как объявлено, эта переменная может держать совместимое значение. fstream типы переменных для хранение файлов. Все его вариации содержат одно и то же, но то, что они делают, отличается.
Вы используете переменную для открыть файл, используй это в вашей программе, то близко.
- atomic (C++11)
- condition_variable (C++11)
- future (C++11)
- mutex (C++11)
- shared_mutex (C++14)
- thread (C++11)
- cassert
- cctype
- cerrno
- cfenv (C++11)
- cfloat
- cinttypes (C++11)
- ciso646
- climits
- clocale
- cmath
- csetjmp
- csignal
- cstdarg
- cstdbool (C++11)
- cstddef
- cstdint (C++11)
- cstdio
- cstdlib
- cstring
- ctgmath (C++11)
- ctime
- cuchar (C++11)
- cwchar
- cwctype
fstream (сокращение от «FileStream») — заголовочный файл из стандартной библиотеки C++, включающий набор классов, методов и функций, которые предоставляют интерфейс для чтения/записи данных из/в файл. Для манипуляции с данными файлов используются объекты, называемые потоками («stream»).
Функции, включенные в данный файл, позволяют производить чтение из файлов как побайтово, так и блоками, и записывать так же. В комплект включены все необходимые функции для управления последовательностью доступа к данным файлов, а также множество вспомогательных функций.
Общедоступные функции [ править | править код ]
Это корневые функции библиотеки, не вошедшие ни в один из основных классов. Они используются довольно часто и могут быть применимы ко всем объектам потоков в каждом из классов.
- rdbuf . Все объекты fstream могут быть ассоциированы с объектом буфера файлов filebuf . Чтобы сопоставить объект класса fstream с объектом буфера, используют функцию rdbuf (без аргументов). Объект буфера предоставляет намного большие возможности по управлению данными в файле, чем стандартные функции подклассов fstream .
- open() . Этим методом можно открыть заданный файл, сопоставив его с одним из объектов потока[1]. В зависимости от передаваемых аргументов, файл может быть открыт для чтения, для записи (либо для полной, либо для добавления данных), как бинарный, или как текстовый файл.
- is_open() . Функция, определяющая, открыт ли в данный момент файл, которому сопоставлен определенный объект потока. Возвращает булевское значение. Используется в основном для предотвращения ошибок доступа при попытке открыть уже использующийся файл. Без аргументов.
- close() . Функция закрывает файл, то есть прекращает доступ к нему, таким образом освобождая его для других функций или программ.
Привет, std::filesystem!. Небольшой пост о больших возможностях… | by Sergey Shambir
Небольшой пост о больших возможностях C++17
Как попробовать filesystem
На момент написания поста, то есть в июне 2017 года, стандарт С++17 ещё не утверждён окончательно, поэтому пространство имён filesystem
целиком находится в std::exprimental
. Три ведущих компилятора уже реализовали filesystem:
- Для Visuals Studio данный модуль доступен начиная с VS2017, и не забудьте включить в своих проектах флаг “/std:c++latest”
- Для Clang/LLVM с библиотекой libc++ модуль также доступен, но не забудьте добавить к флагам компоновщика
-lc++experimental -pthread
, поскольку в этой реализации STL все экспериментальные возможности выделены в “libc++experimental.a”, а сама STL использует pthreads - Для компилятора G++ из состава GCC версии 6.x и выше также потребуется флаг компоновщика:
-lstdc++fs
.
В любом случае, вам потребуется включать <std/experimental/filesystem>
вплоть до окончательного вступления C++17 в силу.
Конструирование путей и работа с кодировками
Любой опытный программист знает о разнице в обработке путей между Windows и UNIX-системами:
- в Windows пути принимаются в виде UTF-16 строк, часто используемый тип wchar_t представляет 2-байтный символ в кодировке UTF-16, а разделителем путей служит обратный слеш “\”
- в UNIX пути принимаются в виде UTF-8 строк, редко используеый wchar_t представляет 4-байтный символ в кодировке UCS32, а разделителем путей служит прямой слеш “/”
Конечно же filesystem абстрагируется от подобных различий и позволяет легко работать как с платформо-зависимыми строками, так и с универсальным UTF-8. Для получения UTF-8 версии пути служит метод .u8string()
.
Другие методы path и свободные функции позволяют конвертировать относительные пути в абсолютные и обратно, заменять расширение или имя файла, нормализовывать разделители к родному для ОС формату или получать “каноническое” представление пути.
Создание, удаление, переименование, копирование
Модуль filesystem предоставляет средства
- для проверки существования файла или каталога по заданному пути:
fs::exists
- для создания каталога (даже если потребуется создать несколько вложенных каталогов, он с этим справится):
fs::create_directories
- для удаления каталогов и файлов:
fs::remove
(удаляет файл или пустой каталог) иfs::remove_all
(удаляет файл или рекурсивно удаляет каталог) - для копирования и переименования каталогов и файлов средствами ОС, то есть с минимальными накладными расходами для приложения:
fs::copy
,fs::copy_file
иfs::rename
. - для обрезания или увеличения размера файла (путём забивания нулями):
fs::resize_file
.
Все подобные операции могут завершиться с ошибкой не по вине программиста, а из-за отказа операционной системы: например, процессу не хватит прав для удаления каталога. В одних приложениях такая ошибка доступа приводит к срыву всей операции и должна порождать исключение, в других — это типичная ситуация, которую приложение должно быстро обработать, и желательно без исключений. Чтобы учесть интересы всех программистов, каждая операция над файлами и каталогами в filesystem имеет две версии:
- более простая версия выбрасывает исключение типа
std::system_error
при ошибке - более сложная версия принимает дополнительный out-параметр типа
std::error_code
, в который в случае ошибки записывается код ошибки
Рекурсивный и нерекурсивный обход каталогов
До появления filesystem перечисление содержимого каталога в C++ было настоящей проблемой, решаемой чаще всего средствами нестандартного для C/C++ заголовка <dirent.h>
и ручной работы с циклами и списками.
В C++17 модуль filesystem предоставляет как рекурсивный, так и нерекурсивный итератор для доступа к содержимому каталога. С ним легко сочетаются любые алгоритмы из STL или Boost.Range. Ниже показан пример рекурсивного обхода каталога “data”:
Запрос метаинформации о файле
С помощью filesystem можно родными средствами ОС узнать метаинформацию о файле, например:
- определить размер файла, не читая его содержимое:
fs::file_size
- прочитать или установить последнее время записи данных каким-либо процессом в заданный файл:
fs::last_write_time
- прочитать или установить права доступа к файлу:
fs::permissions
Обработка symlink и hardlink
В современных UNIX-системах и даже в Windows есть так называемые мягкие и жёсткие ссылки на файлы, расположенные в другом месте.
- Мягкие ссылки хранят в метаданных файловой системы оригинальный путь файла, из-за этого они могут становиться битыми, если оригинальный файл удалят
- Жёсткие ссылки позволяют одному файлу одновременно быть доступным по нескольким путям, при этом все пути равноправны, а файл не удаляется, пока число жёстких ссылок на него не упадёт до нуля. Есть ограничение: жёсткие ссылки на один и тот же файл должны находиться на одном и том же разделе диска.
Эти ссылки воспринимаются как настоящие файлы при работе с ними через обычные средства, такие как fopen
или std::ifstream
. Но иногда возникает нужда поработать именно со ссылкой, и ОС предоставляют такой API, а filesystem абстрагирует программиста от ОС. Ниже показан пример работы с мягкими ссылками:
Информация о свободном месте на диске
Глобальная функция fs::space
возвращает объект типа fs::space_info
, который описывает объём свободного места на носителе, на котором расположен указанный путь. Если передать несколько путей, находящихся на одном носителе, результат будет одинаковым.
Возвращаемый объект содержит три показателя, все в байтах:
- capacity — общий объём носителя
- free — объём свободного места
- available — объём места, доступного непривелигированным процессам; этот показатель меньше или равен free — например, в Linux система резервирует 5% места для пользователя root и размер available скорее всего будет меньше на 5% от capacity.
Так можно вывести информацию о свободном месте на диске, где находися текущий рабочий каталог:
Решена ли проблема 2038 года?
Тип данных time_t на большинстве платформ хранит число секунд с полуночи 1 января 1970 года (хотя по стандарту единица измерения времени в time_t не определена, почти все используют секунды). Если time_t остаётся 32-битным, то возникает проблема 2038 года: именно в этот год произойдёт переполнение time_t, и время в формате UNIX Timestamp уже нельзя будет представить в виде 32-битной переменной.
В Windows по умолчанию используется 64-битный time_t. В Linux, к сожалению, нет. Это означает, что вы никогда не должны использовать time_t в своём повседневном коде! Напишите для своего проекта простой класс для создания и хранения Timestamp или воспользуйтесь библиотечным, таким как класс Poco::Timestamp. Для взаимодействия со стандартной библиотекой используйте struct tm
.
Проблема 2038 года не была решена в boost::filesystem
— в нём дата модификации файла передавалась в виде time_t. К счастью, std::filesystem
не имеет такого недостатка: для хранения времени используются типы данных из chrono
. Посмотрите пример:
Чего нет в filesystem?
Хотя в filesystem есть большинство популярных операций, некоторые задачи могут потребовать использования внешних библиотек либо API операционной системы. Примеры задач, не решённых в filesystem:
- определить, что путь является путём к сетевому хранилищу, а не к локальному диску
- определить путь к каталогу, в котором находится исполняемый файл процесса либо библиотека .dll/.so, код которой сейчас выполняется
- прочитать всю метаинформацию о файле за один запрос к ОС, а не за несколько
Впрочем, для решения таких задач нетрудно один раз написать вспомогательный класс, интерфейс которого будет использовать классы из filesystem.
Что ещё почитать
При составлении статьи мной были прочитаны и переосмыслены несколько англоязычных статей:
Если вы захотите ещё больше погрузиться в нюансы filesystem, то я советую их прочитать.
fstream — Справочник по C ++
класс
<поток>
typedef basic_fstreamfstream;
Класс файлового потока ввода / вывода
Класс потока ввода / вывода для работы с файлами.
Объекты этого класса поддерживают объект filebuf в качестве своего внутреннего буфера потока , который выполняет операции ввода / вывода с файлом, с которым они связаны (если есть).
Файловые потоки связываются с файлами либо при создании, либо путем вызова элемента open .
Это экземпляр basic_fstream со следующими параметрами шаблона:
параметр шаблона | определение | комментарии |
---|---|---|
charT | char | Псевдоним как элемент char_type |
traits | char_traits | Псевдоним как член traits_type |
Помимо внутреннего буфера файлового потока , объекты этого класса хранят набор внутренних полей, унаследованных от ios_base , ios и istream :
поле | функции-члены | описание | |
---|---|---|---|
Форматирование | флаги формата | flags setf unsetf | A set внутренних флагов которые влияют на то, как интерпретируются или генерируются определенные операции ввода / вывода. См. Тип элемента fmtflags . |
ширина поля | ширина | Ширина следующего отформатированного элемента для вставки. | |
точность отображения | точность | Десятичная точность для следующего вставленного значения с плавающей запятой. | |
locale | getloc imbue | Объект locale , используемый функцией для операций форматированного ввода / вывода, на которые влияют свойства локализации. | |
символ заполнения | заполнение | Символ для заполнения отформатированного поля до ширины поля ( ширины ). | |
Состояние | состояние ошибки | rdstate setstate clear | Текущее состояние ошибки потока. Индивидуальные значения можно получить, позвонив хорошо , eof , fail и bad . См. Тип элемента iostate . |
маска исключения | исключения | Флаги состояния, для которых создается исключение сбоя. См. Тип элемента iostate . | |
Другое | Стек обратного вызова | register_callback | Стек указателей на функции, которые вызываются при возникновении определенных событий. |
расширяемые массивы | iword pword xalloc | Внутренние массивы для хранения объектов типа long и void * . | |
связанный поток | привязка | Указатель на выходной поток, который сбрасывается перед каждой операцией ввода-вывода в этом потоке. | |
буфер потока | rdbuf | Указатель на связанный объект streambuf , который отвечает за все операции ввода / вывода. | |
количество символов | gcount | Количество символов, прочитанных последней неформатированной операцией ввода. |
Типы элементов
Класс объявляет следующие типы членов:Эти типы членов наследуются от его базовых классов istream , ostream и ios_base :
- event
- Тип для обозначения типа события (общедоступный тип члена )
- event_callback
- Тип функции обратного вызова события (общедоступный тип члена )
- сбой
- Базовый класс для исключений потока (открытый класс-член )
- fmtflags
- Тип для флагов формата потока (общедоступный тип элемента )
- Init
- Инициализировать стандартные объекты потока (открытый класс-член )
- iostate
- Тип для флагов состояния потока (общедоступный тип члена )
- openmode
- Тип для флагов режима открытия потока (общедоступный тип элемента )
- seekdir
- Тип флага направления поиска потока (общедоступный тип элемента )
- sentry (istream)
- Подготовить поток для ввода (открытый класс-член )
- sentry (ostream)
- Подготовить поток для вывода (открытый класс-член )
Функции публичных членов
- (конструктор)
- Создать объект и при необходимости открыть файл (общедоступная функция-член )
- открыть
- Открыть файл (общедоступная функция-член )
- is_open
- Проверить, открыт ли файл (общедоступная функция-член )
- закрыть
- Закрыть файл (общедоступная функция-член )
- rdbuf
- Получить связанный объект filebuf (общедоступная функция-член )
- operator =
- Перемещение присвоения (общедоступная функция-член )
- своп
- Внутренние элементы подкачки (общедоступная функция-член )
Открытые функции-члены, унаследованные от
istream- оператор >>
- Извлечение форматированного ввода (общедоступная функция-член )
- gcount
- Получить количество символов (общедоступная функция-член )
- получить
- Получить символы (общедоступная функция-член )
- getline
- Get line (общедоступная функция-член )
- игнорировать
- Извлечь и отбросить символы (общедоступная функция-член )
- peek
- Peek next character (общедоступная функция-член )
- чтение
- чтение блока данных (общедоступная функция-член )
- readsome
- Считывание данных, доступных в буфере (общедоступная функция-член )
- возврат
- Вернуть символ (общедоступная функция-член )
- unget
- Персонаж Unget (общедоступная функция-член )
- tellg
- Получить позицию во входной последовательности (общедоступная функция-член )
- seekg
- Установить позицию во входной последовательности (общедоступная функция-член )
- синхронизация
- Синхронизация входного буфера (общедоступная функция-член )
Открытые функции-члены, унаследованные от
ostream- оператор <<
- Вставить форматированный вывод (общедоступная функция-член )
- положить
- символ положить (общедоступная функция-член )
- запись
- Запись блока данных (общедоступная функция-член )
- tellp
- Получить позицию в выходной последовательности (общедоступная функция-член )
- seekp
- Установить позицию в выходной последовательности (общедоступная функция-член )
- очистить
- Очистить буфер выходного потока (общедоступная функция-член )
Открытые функции-члены, унаследованные от
ios- хорошо
- Проверить, хорошее ли состояние потока (общедоступная функция-член )
- eof
- Проверьте, установлен ли eofbit (общедоступная функция-член )
- сбой
- Проверьте, установлен ли сбой или сбой (общедоступная функция-член )
- неверно
- Проверьте, установлен ли неверный бит (общедоступная функция-член )
- оператор!
- Оценить поток (не) (общедоступная функция-член )
- operator bool
- Evaluate stream (общедоступная функция-член )
- rdstate
- Получить флаги состояния ошибки (общедоступная функция-член )
- setstate
- Установить флаг состояния ошибки (общедоступная функция-член )
- очистить
- Установить флаги состояния ошибки (общедоступная функция-член )
- copyfmt
- Копирование информации о форматировании (общедоступная функция-член )
- заполнить
- Получить / установить символ заполнения (общедоступная функция-член )
- исключения
- Получение / установка маски исключений (общедоступная функция-член )
- imbue
- Imbue locale (общедоступная функция-член )
- tie
- Получить / установить связанный поток (общедоступная функция-член )
- rdbuf
- Получение / установка буфера потока (общедоступная функция-член )
- узкий
- узкий символ (общедоступная функция-член )
- расширение
- Расширенный символ (общедоступная функция-член )
Открытые функции-члены, унаследованные от
ios_base- флаги
- Получить / установить флаги формата (общедоступная функция-член )
- setf
- Установка определенных флагов формата (общедоступная функция-член )
- unsetf
- Очистить определенные флаги формата (общедоступная функция-член )
- точность
- Получение / установка десятичной точности с плавающей запятой (общедоступная функция-член )
- ширина
- Получение / установка ширины поля (общедоступная функция-член )
- imbue
- Imbue locale (общедоступная функция-член )
- getloc
- Получить текущую локаль (общедоступная функция-член )
- xalloc
- Получить новый индекс для расширяемого массива [статический] (общедоступная статическая функция-член )
- iword
- Получить целочисленный элемент расширяемого массива (общедоступная функция-член )
- pword
- Получить элемент указателя расширяемого массива (общедоступная функция-член )
- register_callback
- Функция обратного вызова событий регистрации (общедоступная функция-член )
- sync_with_stdio
- Переключить синхронизацию с потоками cstdio [статические] (общедоступная статическая функция-член )
Перегрузки функций, не являющихся членами
- своп
- потоки файлов подкачки (шаблон функции )
поле | функции-члены | описание | |
---|---|---|---|
Форматирование | флаги формата | flags setf unsetf | Набор внутренних флагов, которые влияют на то, как определенные операции ввода / вывода интерпретируются или генерируются. См. Тип элемента fmtflags . |
ширина поля | ширина | Ширина следующего отформатированного элемента для вставки. | |
точность отображения | точность | Десятичная точность для следующего вставленного значения с плавающей запятой. | |
locale | getloc imbue | Объект locale , используемый функцией для операций форматированного ввода / вывода, на которые влияют свойства локализации. | |
символ заполнения | заполнение | Символ для заполнения отформатированного поля до ширины поля ( ширины ). | |
Состояние | состояние ошибки | rdstate setstate clear | Текущее состояние ошибки потока. Индивидуальные значения можно получить, позвонив хорошо , eof , fail и bad . См. Тип элемента iostate . |
маска исключения | исключения | Флаги состояния, для которых создается исключение сбоя. См. Тип элемента iostate . | |
Другое | Стек обратного вызова | register_callback | Стек указателей на функции, которые вызываются при возникновении определенных событий. |
расширяемые массивы | iword pword xalloc | Внутренние массивы для хранения объектов типа long и void * . | |
связанный поток | привязка | Указатель на выходной поток, который сбрасывается перед каждой операцией ввода-вывода в этом потоке. | |
буфер потока | rdbuf | Указатель на связанный объект streambuf , который отвечает за все операции ввода / вывода. | |
количество символов | gcount | Количество символов, прочитанных последней неформатированной операцией ввода. |
поле | функции-члены | описание | |
---|---|---|---|
Форматирование | флаги формата | flags setf unsetf | Набор внутренних флагов, которые влияют на то, как определенные операции ввода / вывода интерпретируются или генерируются. См. Тип элемента fmtflags . |
ширина поля | ширина | Ширина следующего отформатированного элемента для вставки. | |
точность отображения | точность | Десятичная точность для следующего вставленного значения с плавающей запятой. | |
locale | getloc imbue | Объект locale , используемый функцией для операций форматированного ввода / вывода, на которые влияют свойства локализации. | |
символ заполнения | заполнение | Символ для заполнения отформатированного поля до ширины поля ( ширины ). | |
Состояние | состояние ошибки | rdstate setstate clear | Текущее состояние ошибки потока. Индивидуальные значения можно получить, позвонив хорошо , eof , fail и bad . См. Тип элемента iostate . |
маска исключения | исключения | Флаги состояния, для которых создается исключение сбоя. См. Тип элемента iostate . | |
Другое | Стек обратного вызова | register_callback | Стек указателей на функции, которые вызываются при возникновении определенных событий. |
расширяемые массивы | iword pword xalloc | Внутренние массивы для хранения объектов типа long и void * . | |
связанный поток | привязка | Указатель на выходной поток, который сбрасывается перед каждой операцией ввода-вывода в этом потоке. | |
буфер потока | rdbuf | Указатель на связанный объект streambuf , который отвечает за все операции ввода / вывода. | |
количество символов | gcount | Количество символов, прочитанных последней неформатированной операцией ввода. |
| Документы Microsoft
- 2 минуты на чтение
В этой статье
Определяет несколько классов, которые поддерживают операции iostreams с последовательностями, хранящимися во внешних файлах.
Синтаксис
#include
Typedefs
Название типа | Описание |
---|---|
filebuf | Тип basic_filebuf , специализированный на параметрах шаблона char . |
поток | Тип basic_fstream , специализированный на char параметрах шаблона. |
ifstream | Тип basic_ifstream , специализированный на char параметрах шаблона. |
от потока | Тип basic_ofstream , специализированный на char параметрах шаблона. |
поток | Тип basic_fstream , специализированный на wchar_t параметрах шаблона. |
wifstream | Тип basic_ifstream , специализированный на wchar_t параметрах шаблона. |
wofstream | Тип basic_ofstream , специализированный на wchar_t параметрах шаблона. |
wfilebuf | Тип basic_filebuf , специализированный на wchar_t параметрах шаблона. |
Классы
Класс | Описание |
---|---|
basic_filebuf | Шаблон класса описывает буфер потока, который управляет передачей элементов типа Elem , чьи характеристики символов определяются классом Tr , в последовательность элементов, хранящуюся во внешнем файле, и обратно. |
basic_fstream | Шаблон класса описывает объект, который управляет вставкой и извлечением элементов и закодированных объектов с использованием буфера потока класса basic_filebuf < Elem , Tr > с элементами типа Elem , чьи характерные черты определяются класс Тр . |
basic_ifstream | Шаблон класса описывает объект, который управляет извлечением элементов и закодированных объектов из буфера потока класса basic_filebuf < Elem , Tr >, с элементами типа Elem , характерные черты которого определяются классом Тр . |
basic_ofstream | Шаблон класса описывает объект, который управляет вставкой элементов и закодированных объектов в буфер потока класса basic_filebuf < Elem , Tr >, с элементами типа Elem , характерные черты которого определяются классом Тр . |
См. Также
Справочник по файлам заголовков
Безопасность потоков в стандартной библиотеке C ++
Программирование iostream
Условные обозначения iostreams
Заголовок стандартной библиотеки — cppreference.com
Этот заголовок является частью библиотеки ввода / вывода.
[править] Сводка
namespace std { шаблон <диаграмма классов, черты класса = характеры-символы <диаграмма>> class basic_filebuf; используя filebuf = basic_filebuf; используя wfilebuf = basic_filebuf ; шаблон <диаграмма классов, черты класса = признаки_символа <диаграмма>> class basic_ifstream; используя ifstream = basic_ifstream ; используя wifstream = basic_ifstream ; шаблон <диаграмма классов, черты класса = признаки_символа <диаграмма>> class basic_ofstream; использование ofstream = basic_ofstream ; используя wofstream = basic_ofstream ; шаблон <диаграмма классов, черты класса = признаки_символа <диаграмма>> class basic_fstream; используя fstream = basic_fstream ; используя wfstream = basic_fstream ; }
[править] Шаблон класса std :: basic_filebuf
namespace std { шаблон <класс CharT, class Traits = char_traits> class basic_filebuf: public basic_streambuf { общественность: используя char_type = CharT; using int_type = typename Traits :: int_type; using pos_type = typename Traits :: pos_type; using off_type = typename Traits :: off_type; using traits_type = Traits; // конструкторы / деструктор basic_filebuf (); basic_filebuf (const basic_filebuf &) = удалить; basic_filebuf (базовый_filebuf && rhs); виртуальный ~ basic_filebuf (); // присваиваем и меняем местами basic_filebuf & operator = (const basic_filebuf &) = удалить; basic_filebuf & operator = (basic_filebuf && rhs); недействительный своп (basic_filebuf & rhs); // члены bool is_open () const; basic_filebuf * open (const char * s, режим ios_base :: openmode); basic_filebuf * open (const filesystem :: path :: value_type * s, ios_base :: openmode mode); // только широкие системы basic_filebuf * open (константная строка & s, ios_base :: openmode mode); basic_filebuf * open (файловая система const :: путь & s, ios_base :: openmode mode); basic_filebuf * close (); защищено: // переопределить виртуальные функции streamsize showmanyc () переопределить; int_type underflow () переопределение; int_type uflow () override; int_type pbackfail (int_type c = Traits :: eof ()) переопределить; int_type overflow (int_type c = Traits :: eof ()) override; basic_streambuf * setbuf (char_type * s, размер потока n) переопределить; pos_type seekoff (off_type off, путь ios_base :: seekdir, ios_base :: openmode который = ios_base :: in | ios_base :: out) переопределить; pos_type seekpos (pos_type sp, ios_base :: openmode который = ios_base :: in | ios_base :: out) переопределить; int sync () переопределить; void imbue (const locale & loc) override; }; шаблон <класс CharT, класс Traits> void swap (basic_filebuf & x, basic_filebuf & y); }
[править] Шаблон класса std :: basic_ifstream
namespace std { шаблон <класс CharT, class Traits = char_traits> class basic_ifstream: public basic_istream { общественность: используя char_type = CharT; using int_type = typename Traits :: int_type; using pos_type = typename Traits :: pos_type; using off_type = typename Traits :: off_type; using traits_type = Traits; // конструкторы basic_ifstream (); явный basic_ifstream (const char * s, ios_base :: openmode mode = ios_base :: in); явный basic_ifstream (const filesystem :: path :: value_type * s, ios_base :: openmode mode = ios_base :: in); // только широкие системы явный basic_ifstream (const string & s, ios_base :: openmode mode = ios_base :: in); явный basic_ifstream (const filesystem :: path & s, ios_base :: openmode mode = ios_base :: in); basic_ifstream (const basic_ifstream &) = удалить; basic_ifstream (basic_ifstream && rhs); // присваиваем и меняем местами basic_ifstream & operator = (const basic_ifstream &) = удалить; basic_ifstream & operator = (basic_ifstream && rhs); недействительный своп (basic_ifstream & rhs); // члены basic_filebuf * rdbuf () const; bool is_open () const; void open (const char * s, ios_base :: openmode mode = ios_base :: in); void open (const filesystem :: path :: value_type * s, ios_base :: openmode mode = ios_base :: in); // только широкие системы void open (const string & s, ios_base :: openmode mode = ios_base :: in); void open (const filesystem :: path & s, ios_base :: openmode mode = ios_base :: in); void close (); частный: basic_filebuf sb; // только экспозиция }; шаблон <класс CharT, класс Traits> void swap (basic_ifstream & x, basic_ifstream & y); }
[править] Шаблон класса std :: basic_ofstream
namespace std { шаблон <класс CharT, class Traits = char_traits> class basic_ofstream: public basic_ostream { общественность: используя char_type = CharT; using int_type = typename Traits :: int_type; using pos_type = typename Traits :: pos_type; using off_type = typename Traits :: off_type; using traits_type = Traits; // конструкторы basic_ofstream (); явный basic_ofstream (const char * s, ios_base :: openmode mode = ios_base :: out); явный basic_ofstream (const filesystem :: path :: value_type * s, // только для широких систем ios_base :: openmode mode = ios_base :: out); явный basic_ofstream (const string & s, ios_base :: openmode mode = ios_base :: out); явный basic_ofstream (const filesystem :: path & s, ios_base :: openmode mode = ios_base :: out); basic_ofstream (const basic_ofstream &) = удалить; basic_ofstream (basic_ofstream && rhs); // присваиваем и меняем местами basic_ofstream & operator = (const basic_ofstream &) = удалить; basic_ofstream & operator = (basic_ofstream && rhs); недействительный своп (basic_ofstream & rhs); // члены basic_filebuf * rdbuf () const; bool is_open () const; void open (const char * s, ios_base :: openmode mode = ios_base :: out); void open (const filesystem :: path :: value_type * s, ios_base :: openmode mode = ios_base :: out); // только широкие системы void open (const string & s, ios_base :: openmode mode = ios_base :: out); void open (const filesystem :: path & s, ios_base :: openmode mode = ios_base :: out); void close (); частный: basic_filebuf sb; // только экспозиция }; шаблон <класс CharT, класс Traits> void swap (basic_ofstream & x, basic_ofstream <диаграмма, черты> & y); }
[править] Шаблон класса std :: basic_fstream
namespace std { шаблон <класс CharT, class Traits = char_traits> class basic_fstream: public basic_iostream { общественность: используя char_type = CharT; using int_type = typename Traits :: int_type; using pos_type = typename Traits :: pos_type; using off_type = typename Traits :: off_type; using traits_type = Traits; // конструкторы basic_fstream (); явный basic_fstream ( const char * s, ios_base :: openmode mode = ios_base :: in | ios_base :: out); явный basic_fstream ( const filesystem :: path :: value_type * s, ios_base :: openmode mode = ios_base :: in | ios_base :: out); // только широкие системы явный basic_fstream ( константная строка & s, ios_base :: openmode mode = ios_base :: in | ios_base :: out); явный basic_fstream ( const filesystem :: path & s, ios_base :: openmode mode = ios_base :: in | ios_base :: out); basic_fstream (const basic_fstream &) = удалить; basic_fstream (basic_fstream && rhs); // присваиваем и меняем местами basic_fstream & operator = (const basic_fstream &) = удалить; basic_fstream & operator = (basic_fstream && rhs); недействительный своп (basic_fstream & rhs); // члены basic_filebuf * rdbuf () const; bool is_open () const; пусто открытый ( const char * s, ios_base :: openmode mode = ios_base :: in | ios_base :: out); пусто открытый ( const filesystem :: path :: value_type * s, ios_base :: openmode mode = ios_base :: in | ios_base :: out); // только широкие системы пусто открытый ( константная строка & s, ios_base :: openmode mode = ios_base :: in | ios_base :: out); пусто открытый ( const filesystem :: path & s, ios_base :: openmode mode = ios_base :: in | ios_base :: out); void close (); частный: basic_filebuf sb; // только экспозиция }; шаблон <класс CharT, класс Traits> void swap (basic_fstream & x, basic_fstream & y); }
Классы | |
---|---|
fstream | |
файлбуф | |
ifstream | Описывает объект, который управляет извлечением элементов и закодированных объектов из буфера потока класса filebuf .В объекте хранится объект класса filebuf . |
от потока | Описывает объект, который управляет вставкой элементов и закодированных объектов в буфер потока класса filebuf . В объекте хранится объект класса filebuf . |
Конструкторы / деструкторы | |
filebuf :: filebuf | Конструктор сохраняет нулевой указатель во всех указателях, управляющих входным буфером и выходным буфером.Он также сохраняет нулевой указатель в указателе файла. |
ifstream :: ifstream | |
из потока :: из потока | |
fstream :: fstream | |
Члены | |
filebuf :: char_type | Тип является синонимом char. |
filebuf :: закрыть | Функция-член возвращает нулевой указатель, если указатель файла fp является нулевым указателем.В противном случае он вызывает fclose (fp) . Если эта функция возвращает ненулевое значение, функция возвращает нулевой указатель. В противном случае он возвращает это , чтобы указать, что файл был успешно закрыт. |
filebuf :: int_type | Тип является синонимом traits_type :: int_type . |
filebuf :: is_open | Функция-член возвращает истину, если указатель файла не является нулевым указателем. |
filebuf :: off_type | Тип является синонимом traits_type :: off_type . |
filebuf :: открыть | Функция-член пытается открыть файл с именем файла filename , вызывая fopen (filename, strmode) . Здесь strmode определяется из mode & ~ (ate & | binary) :
Если Если указатель файла является нулевым указателем, функция возвращает нулевой указатель. В противном случае он возвращает |
filebuf :: переполнение | Если meta! = Traits_type :: eof () , защищенная виртуальная функция-член пытается вставить элемент ch = traits_type :: to_char_type (meta) в выходной буфер.Это можно сделать разными способами:
Если функция не может завершиться успешно, она возвращает |
filebuf :: pbackfail | Защищенная виртуальная функция-член пытается вернуть элемент во входной буфер, а затем сделать его текущим элементом (на который указывает следующий указатель). Если meta == traits_type :: eof () , возвращаемый элемент фактически уже находится в потоке перед текущим элементом.В противном случае этот элемент заменяется на ch = traits_type :: to_char_type (meta) . Функция может вернуть элемент обратно различными способами:
Если функция не может завершиться успешно, она возвращает |
filebuf :: pos_type | Тип является синонимом traits_type :: pos_type . |
filebuf :: seekoff | Защищенная виртуальная функция-член пытается изменить текущие позиции для управляемых потоков. Для объекта класса filebuf позиция потока может быть представлена объектом типа fpos_t .Нулевое смещение обозначает первый элемент потока. (Объект типа pos_type хранит как минимум объект fpos_t .) Для файла, открытого для чтения и записи, потоки ввода и вывода располагаются в тандеме. Чтобы переключаться между вставкой и извлечением, вы должны вызвать Если указатель файла |
filebuf :: seekpos | Защищенная виртуальная функция-член пытается изменить текущие позиции для управляемых потоков. Для объекта класса filebuf позиция потока может быть представлена объектом типа fpos_t . Нулевое смещение обозначает первый элемент потока. (Объект типа pos_type хранит как минимум объект fpos_t .) Для файла, открытого для чтения и записи, потоки ввода и вывода располагаются в тандеме.Чтобы переключаться между вставкой и извлечением, вы должны вызвать Если указатель файла |
filebuf :: setbuf | Защищенная функция-член возвращает ноль, если указатель файла fp является нулевым указателем. В противном случае он вызывает setvbuf (fp, (char *) buffer, _IOFBF, count * sizeof (Elem)) , чтобы предложить массив из count элементов, начиная с buffer в качестве буфера для потока.Если эта функция возвращает ненулевое значение, функция возвращает нулевой указатель. В противном случае он возвращает , это , чтобы сигнализировать об успехе. |
filebuf :: синхронизация | Защищенная функция-член возвращает ноль, если указатель файла fp является нулевым указателем. В противном случае он возвращает ноль, только если вызовы как overflow () , так и fflush (fp) успешно сбрасывают любой ожидающий вывод в поток. |
filebuf :: traits_type | Тип является синонимом char_traits . |
filebuf :: переполнение | Защищенная виртуальная функция-член пытается извлечь текущий элемент ch из входного потока и вернуть элемент как traits_type :: to_int_type (ch) . Это можно сделать разными способами:
traits_type :: eof () . В противном случае он возвращает ch , преобразованный, как описано выше. |
ifstream :: ifstream | Первый конструктор инициализирует базовый класс, вызывая istream (sb) , где sb — это сохраненный объект класса filebuf . Он также инициализирует sb , вызывая filebuf () . Второй конструктор инициализирует базовый класс, вызывая |
ifstream :: закрыть | Функция-член вызывает rdbuf () -> close () . |
ifstream :: is_open | Функция-член возвращает rdbuf () -> is_open () . |
ifstream :: открыть | Функция-член вызывает rdbuf () -> open (filename, mode | ios_base :: in) . Если эта функция возвращает нулевой указатель, функция вызывает setstate (failbit) . |
ifstream :: rdbuf | Функция-член возвращает адрес сохраненного буфера потока. |
из потока :: из потока | Первый конструктор инициализирует базовый класс, вызывая ostream (sb) , где sb — это сохраненный объект класса filebuf .Он также инициализирует sb , вызывая filebuf () . Второй конструктор инициализирует базовый класс, вызывая |
ofstream :: закрыть | Функция-член вызывает rdbuf () -> close () . |
ofstream :: is_open | Функция-член возвращает rdbuf () -> is_open () . |
ofstream :: открыть | Функция-член вызывает rdbuf () -> open (filename, mode | ios_base :: out) . Если эта функция возвращает нулевой указатель, функция вызывает setstate (failbit) . |
офстрим :: rdbuf | Функция-член возвращает адрес сохраненного буфера потока. |
Операторы | |
Макросы | |
Typedefs | |
typename streambuf :: char_type | |
typename streambuf :: traits_type | |
typename streambuf :: int_type | |
typename streambuf :: pos_type | |
typename streambuf :: off_type |
Как читать и записывать в файл в C ++
В этой статье мы покажем вам, как читать и записывать в файл на языке программирования C ++, используя несколько примеров.Чтобы понять файловые операции C ++, такие как чтение и запись, мы должны сначала понять концепцию потока в C ++.
Что такое поток?Поток — это просто поток данных или символов. Есть два типа потоков: входные потоки и выходные потоки. Входной поток используется для чтения данных с внешнего устройства ввода, такого как клавиатура, а выходной поток используется для записи данных на внешнее устройство вывода, такое как монитор. Файл можно рассматривать как источник ввода и вывода.
В C ++ мы используем поток для отправки или получения данных во внешний источник или из него.
Мы можем использовать встроенные классы для доступа к потоку ввода / вывода, то есть «ios».
Вот иерархия потоковых классов языка программирования C ++:
Объекты «cin» и «cout» используются для чтения данных с клавиатуры и отображения вывода на мониторе соответственно. Кроме того, «ifstream», что означает «поток входного файла», используется для чтения потока данных из файла, а «ofstream», что означает «поток выходного файла», используется для записи потока данных. в файл.
Файл «iostram.h» содержит все необходимые классы стандартных потоков ввода / вывода на языке программирования C ++.
ПримерыТеперь, когда вы понимаете основы потоков, мы обсудим следующие примеры, которые помогут вам лучше понять файловые операции в C ++:
- Пример 1. Открытие и закрытие файла
- Пример 2: Запись в файл
- Пример 3: Чтение из файла
- Пример 4: Чтение и запись в файл
- Пример 5: Чтение и запись в двоичный файл
В этом примере программы мы продемонстрируем, как открыть / создать файл и как закрыть файл в C ++.Как вы можете видеть в приведенной ниже программе, мы включили библиотеку, необходимую для файловых операций.
Чтобы открыть и закрыть файл, нам нужен объект ofstream. Затем, чтобы прочитать или записать в файл, мы должны открыть файл. Мы включили файл заголовка fstream в строку номер 1, чтобы мы могли получить доступ к классу ofstream.
Мы объявили myFile_Handler как объект ofstream внутри основной функции. Затем мы можем использовать функцию open () для создания пустого файла и функцию close () для закрытия файла.
#includeс использованием пространства имен std;
int main ()
{
ofstream myFile_Handler;
// Открыть файл
myFile_Handler.open («File_1.txt»);
// Закрытие файла
myFile_Handler.close ();
возврат 0;
}
Теперь мы скомпилируем программу и проверим вывод. Как вы можете видеть в окне вывода ниже, файл «File_1.txt» был создан после выполнения программы. Размер файла равен нулю, поскольку мы не записали в файл никакого содержимого.
Пример 2: Запись в файлВ предыдущем примере программы мы показали вам, как открыть файл и как закрыть файл. Теперь мы покажем вам, как что-то записать в файл.
Мы можем записывать в файл с помощью оператора вставки потока, то есть «<<». В этой программе мы использовали обработчик файла и оператор вставки для записи двух строк в файл. Оператор вставки («<<») указывает, что мы вставляем строку в объект потока выходного файла.
#includeс использованием пространства имен std;
int main ()
{
ofstream myFile_Handler;
// Открытие файла
myFile_Handler.open («File_1.txt»);
// Запись в файл
myFile_Handler << "Это образец тестового файла." << endl;
myFile_Handler << "Это вторая строка файла." << endl;
// Закрытие файла
myFile_Handler.close ();
возврат 0;
}
Теперь мы скомпилируем указанную выше программу и выполним ее.Как видите ниже, мы успешно записали в файл File_1.txt.
Пример 3: чтение из файлаВ предыдущих примерах мы показали вам, как записывать содержимое в файл. Теперь давайте прочитаем содержимое файла, который мы создали в Примере-2, и отобразим содержимое на стандартном устройстве вывода, то есть на мониторе.
Мы используем функцию getline () для чтения всей строки из файла, а затем «cout» для вывода строки на монитор.
#include#include
#include
с использованием пространства имен std;
int main ()
{
ifstream myFile_Handler;
string myLine;
// Файл открыт в режиме чтения
myFile_Handler.open («File_1.txt»);
if (myFile_Handler.is_open ())
{
// Продолжаем читать файл
while (getline (myFile_Handler, myLine))
{
// выводим строку на стандартный вывод
cout << myLine << endl;
}
// Закрыть файл
myFile_Handler.близко();
}
else
{
cout << "Невозможно открыть файл!";
}
возврат 0;
}
Теперь мы распечатаем содержимое File_1.txt, используя следующую команду: cat File_1.txt. После компиляции и выполнения программы становится ясно, что вывод соответствует содержимому файла. Таким образом, мы успешно прочитали файл и распечатали его содержимое на мониторе.
Пример 4: Чтение и запись в файлДо сих пор мы показали вам, как открывать, читать, писать и закрывать файл.В C ++ мы также можем одновременно читать и записывать в файл. Для чтения и записи в файл мы должны получить объект fstream и открыть файл в режиме «ios :: in» и «ios :: out».
В этом примере мы сначала записываем некоторый контент в файл. Затем мы читаем данные из файла и выводим их на монитор.
#include#include
#include
с использованием пространства имен std;
int main ()
{
fstream myFile_Handler;
string myLine;
// Открыть файл
myFile_Handler.open («File_1.txt», ios :: in | ios :: out);
// Проверяем, открылся ли файл
if (! MyFile_Handler)
{
cout << "Файл не открылся!";
выход (1);
}
// Записываем в файл
myFile_Handler << "1. Это еще один пример тестового файла." << endl;
myFile_Handler << "2. Это вторая строка файла." << endl;
myFile_Handler.seekg (ios :: begin);
// Прочитать файл
if (myFile_Handler.is_open ())
{
// Продолжаем читать файл
while (getline (myFile_Handler, myLine))
{
// выводим строку на стандартный вывод
cout << myLine << endl;
}
// Закрыть файл
myFile_Handler.close ();
}
else
{
cout << "Невозможно открыть файл!";
}
myFile_Handler.close ();
возврат 0;
}
Теперь скомпилируем и выполним программу.
Пример 5: Чтение и запись в двоичный файлВ этом примере мы собираемся объявить класс, а затем записать объект в двоичный файл. Чтобы упростить этот пример, мы объявили класс Employee с общедоступной переменной emp_id. Затем мы прочитаем двоичный файл и выведем результат на монитор.
#include#include
с использованием пространства имен std;
class Employee
{
public:
int emp_id;
};
int main ()
{
из потока binOutFile_Handler;
ifstream binInFile_Handler;
Сотрудник empObj_W, empObj_R;
// Открыть файл
binOutFile_Handler.open («Employee.dat», ios :: out | ios :: binary);
// Проверяем, открылся ли файл
if (! BinOutFile_Handler)
{
cout << "Файл не открылся!";
выход (1);
}
// Инициализировать empObj_W
empObj_W.emp_id = 1512;
// Записываем в файл
binOutFile_Handler.write ((char *) & empObj_W, sizeof (Employee));
binOutFile_Handler.close ();
if (! BinOutFile_Handler.good ())
{
cout << "Произошла ошибка при записи двоичного файла!" << endl;
выход (2);
}
// Теперь давайте прочитаем сотрудника.dat файл
binInFile_Handler.open («Employee.dat», ios :: in | ios :: binary);
// Проверяем, открылся ли файл
if (! BinInFile_Handler)
{
cout << "Файл не открылся!";
выход (3);
}
// Чтение содержимого двоичного файла
binInFile_Handler.read ((char *) & empObj_R, sizeof (Employee));
binInFile_Handler.close ();
if (! BinInFile_Handler.good ())
{
cout << "Произошла ошибка при чтении двоичного файла!" << endl;
выход (4);
}
// Распечатать вывод empObj_R
cout << "Подробная информация о сотруднике:" << endl;
cout << "Идентификатор сотрудника:" << empObj_R.