Обработка файлов C ++: разница между ios :: app и ios :: ate?
В чем разница между ios::ate и ios:app при записи в файл.
На мой взгляд, ios::app дает вам возможность перемещаться по файлу, тогда как с ios::ate он может только читать / писать в конце файла. Это правильно?
5 ответов
Все наоборот. Когда установлено ios::ate , исходной позицией будет конец файла, но вы можете свободно искать после этого. Когда установлено ios::app , все операции вывода выполняются в конце файла. Поскольку всем операциям записи неявно предшествует поиск, нет возможности писать в другом месте.
Параметр ios::ate предназначен для операций ввода и вывода и ios::app позволяет нам добавлять данные в конец файла.
ios::app -> «Мы не можем переместить указатель. Это будет только в конце».
ios::ate -> «Мы можем переместить указатель записи в любое другое место».
Это довольно хорошо задокументировано здесь.
ios::ate «устанавливает индикатор положения потока в конец потока при открытии».
ios::app «установить индикатор положения потока в конец потока перед каждой операцией вывода».
Это означает, что разница в том, что ios::ate помещает вашу позицию в конец файла, когда вы его открываете. ios::app вместо этого помещает его в конец файла каждый раз, когда вы сбрасываете поток. Если, например, две программы, которые записывают в один и тот же файл журнала, ios::ate переопределят все, что было добавлено в файл другой программой с момента его открытия вашей программой. ios:app вместо этого будет переходить к концу файла каждый раз, когда ваша программа добавляет запись в журнал.
Они указаны следующим образом (в 27.5.3.1.4 C ++ 11):
app стремятся к концу перед каждой записью
ate открываются и стремятся завершить сразу после открытия
С ios::app позиция записи в файле «липкая» — все записи в конце, независимо от того, где вы ищите.
Класс ios_base
Этот класс описывает хранилище и функции-члены общие для обоих потоков (ввода и вывода), не зависящих от параметров шаблона. (Шаблон basic_ios класса описывает, что является общим и зависит от параметров шаблона.)
Объект класса ios_base хранит сведения о форматировании, состоящие из следующих элементов:
Форматирование флагов в объекте типа fmtflags .
Маска исключения в объекте типа iostate .
Ширина поля в объекте типа int .
Точность отображения в объекте типа int .
locale Объект в объекте типа locale .
Два расширяемых массива с элементами типа long и void указателя.
Объект класса ios_base также хранит сведения о состоянии потока в объекте типа iostate и стеке обратного вызова.
Члены
Конструкторы
| Имя | Описание |
|---|---|
| ios_base | Создает объект ios_base . |
Определения типов
| Имя | Описание |
|---|---|
| event_callback | Описывает функцию, переданную в register_call . |
| fmtflags | Константы для определения внешнего вида выходных данных. |
| iostate | Определяет константы, описывающие состояние потока. |
| openmode | Описывает процесс взаимодействия с потоком. |
| seekdir | Задает начальную точку для операций смещения. |
Перечисления
| Имя | Описание |
|---|---|
| event | Задает типы событий. |
Константы
| Имя | Описание |
|---|---|
| adjustfield | Битовая маска, определенная как internal right | left | . |
| app | Задает поиск до конца потока перед каждой вставкой. |
| ate | Задает поиск до конца потока при первом создании его управляющего объекта. |
| badbit | Регистрирует потерю целостности буфера потока. |
| basefield | Битовая маска, определенная как dec oct | hex | . |
| beg | Задает поиск относительно начала последовательности. |
| binary | Указывает, что файл должен быть считан как двоичный, а не текстовый поток. |
| boolalpha | Задает вставку или извлечение объектов типа bool в качестве имен (таких как true и false ), а не числовых значений. |
| cur | Задает поиск относительно текущей позиции в последовательности. |
| dec | Задает вставку или извлечение целочисленных значений в десятичном формате. |
| end | Задает поиск относительно конца последовательности. |
| eofbit | Регистрирует конец файла при извлечении из потока. |
| failbit | Регистрирует сбой при извлечении допустимого поля из потока. |
| fixed | Задает вставку значений с плавающей запятой в формате с фиксированной запятой (без поля экспоненты). |
| floatfield | Битовая маска, определенная как fixed | scientific |
| goodbit | Очищает все биты состояния. |
| hex | Задает вставку или извлечение целочисленных значений в шестнадцатеричном формате. |
| in | Задает извлечение из потока. |
| internal | Выполняет заполнение по ширине поля, вставляя символы заполнения в точке внутри созданного числового поля. |
| left | Задает выравнивание по левому краю. |
| oct | Задает вставку или извлечение целочисленных значений в восьмеричном формате. |
| out | Задает вставку в поток. |
| right | Задает выравнивание по правому краю. |
| scientific | Задает вставку значений с плавающей запятой в экспоненциальном формате (с полем экспоненты). |
| showbase | Задает вставку префикса, отображающего базу созданного целочисленного поля. |
| showpoint | Задает безусловную вставку десятичной запятой в созданное поле с плавающей запятой. |
| showpos | Задает вставку знака плюс в созданное неотрицательное числовое поле. |
| skipws | Задает пропуск начальных пробелов перед определенными извлечениями. |
| trunc | Задает удаление содержимого существующего файла при создании его управляющего объекта. |
| unitbuf | Обеспечивает запись выходных данных на диск после каждой вставки. |
| uppercase | Задает вставку эквивалентных прописных букв для букв нижнего регистра в определенных вставках. |
Функции
| Имя | Описание |
|---|---|
| failure | Класс-член служит базовым классом для всех исключений, создаваемых функцией-членом, ясной в шаблоне basic_ios класса. |
| flags | Задает или возвращает текущие параметры флага. |
| getloc | Возвращает сохраненный locale объект. |
| imbue | Изменяет языковой стандарт. |
| Init | Создает стандартные iostream объекты при создании. |
| iword | Присваивает значение, сохраняемое в виде iword . |
| precision | Задает количество цифр для отображения числа с плавающей запятой. |
| pword | Присваивает значение, сохраняемое в виде pword . |
| register_callback | Задает функцию обратного вызова. |
| setf | Задает указанные флаги. |
| sync_with_stdio | Гарантирует, что iostream и операции библиотеки времени выполнения C выполняются в том порядке, в который они отображаются в исходном коде. |
| unsetf | Отключает указанные флаги. |
| width | Задает длину потока вывода. |
| xalloc | Указывает, что переменная должна быть частью потока. |
Операторы
| Имя | Описание |
|---|---|
| operator= | Оператор присваивания для объектов ios_base . |
Требования
Заголовка: <ios>
Пространство имен: std
event
Задает типы событий.
Remarks
Тип — это перечислимый тип, описывающий объект, который может хранить событие обратного вызова, используемое в качестве аргумента функции, зарегистрированной в register_callback . Различные значения события:
copyfmt_event , чтобы определить обратный вызов, который происходит ближе к концу вызова copyfmt , непосредственно перед копированием маски исключения .
erase_event , чтобы определить обратный вызов, который происходит в начале вызова copyfmt или в начале вызова деструктора. *this
imbue_event , чтобы определить обратный вызов, который происходит в конце вызова imbue , непосредственно перед возвратом функции.
Пример
event_callback
Описывает функцию, переданную в register_call .
Параметры
_Base
Поток, в котором был вызов события.
_I
Определенное пользователем число.
Remarks
Тип описывает указатель на функцию, с помощью которую можно зарегистрировать register_callback . Функции этого типа не должны вызывать исключение.
Пример
См register_call . пример, в который используется event_callback .
failure
Класс failure определяет базовый класс для типов всех объектов, вызываемых как исключения, с помощью функций в библиотеке iostreams , для отчетов об ошибках, обнаруженных во время операций буфера потока.
Remarks
Значение, возвращаемое what() , — это копия _Message , возможно, дополненная тестом на основе _Code . Если значение _Code не указано, значение по умолчанию — make_error_code(io_errc::stream) .
Пример
flags
Задает или возвращает текущие параметры флага.
Параметры
fmtfl
Новое значение fmtflags .
Возвращаемое значение
Предыдущее или текущее значение fmtflags .
Remarks
Первая функция-член возвращает сохраненные флажки формата. Вторая функция-член сохраняет fmtfl во флажках формата и возвращает свое ранее сохраненное значение.
Пример
fmtflags
Константы для определения внешнего вида выходных данных.
Remarks
Поддерживает манипуляторы в ios .
Тип — это тип битовой маски, описывающий объект, который может хранить флаги формата. Ниже перечислены значения различных флагов (элементы).
dec , чтобы вставить или извлечь целочисленные значения в десятичном формате.
hex , чтобы вставить или извлечь целочисленные значения в шестнадцатеричном формате.
oct , чтобы вставить или извлечь целочисленные значения в восьмеричном формате.
showbase , чтобы вставить префикс, отображающий базу созданного целочисленного поля.
internal , чтобы выполнить заполнение по ширине поля, вставляя символы заполнения в точке внутри созданного числового поля. (Сведения о настройке ширины поля см. в разделе setw ).
left , чтобы выполнить заполнение по ширине поля, вставляя символы заполнения в конец созданного числового поля (выравнивание по левому краю).
right , чтобы выполнить заполнение по ширине поля, вставляя символы заполнения в начало созданного числового поля (выравнивание по правому краю).
boolalpha , чтобы вставить или извлечь объекты типа bool , например имена (такие как true и false ), а не числовые значения.
fixed , чтобы вставить значения с плавающей запятой в формате с фиксированной запятой (без поля экспоненты).
scientific , чтобы вставить значения с плавающей запятой в экспоненциальном формате (с полем экспоненты).
showpoint , чтобы выполнить безусловную вставку десятичной запятой в созданное поле с плавающей запятой.
showpos , чтобы вставить знак плюс в созданное неотрицательное числовое поле.
skipws , чтобы пропустить начальные пробелы перед определенными извлечениями.
unitbuf , чтобы записывать выходные данные на диск после каждой вставки.
uppercase , чтобы вставить эквивалентные прописные буквы для букв нижнего регистра в определенных вставках.
Кроме того, ниже приведено несколько полезных значений:
adjustfield , битовая маска, определенная как internal | left | right
basefield , определен как dec | hex | oct
floatfield , определен как fixed | scientific
Примеры функций, которые изменяют эти флаги форматирования, см. в разделе <iomanip> .
getloc
Возвращает сохраненный locale объект.
Возвращаемое значение
Сохраненный locale объект.
Пример
imbue
Изменяет языковой стандарт.
Параметры
_Loc
Новое значение языкового стандарта.
Возвращаемое значение
Предыдущий языковой стандарт.
Remarks
Функция-член сохраняется _Loc в объекте, а затем сообщает о событии locale обратного вызова и imbue_event . Она возвращает предыдущее сохраненное значение.
Пример
Создает стандартные iostream объекты при создании.
Remarks
Вложенный класс описывает объект, конструкция которого гарантирует, что стандартные iostream объекты правильно сконструированы, даже до выполнения конструктора для произвольного статического объекта.
ios_base
Создает объект ios_base .
Remarks
(Защищенный) конструктор ничего не делает. Последующий вызов инициализации basic_ios:: объекта должен инициализироваться, прежде чем его можно будет безопасно уничтожить. Таким образом, единственным безопасным вариантом использования класса ios_base является базовый класс для шаблона basic_ios класса.
iostate
Тип констант, описывающих состояние потока.
Remarks
Тип — это тип битовой маски, описывающий объект, который может хранить данные о состоянии потока. Ниже перечислены значения различных флагов (элементы).
- badbit регистрирует потерю целостности буфера потока.
- eofbit регистрирует конец файла при извлечении из потока.
- failbit регистрирует ошибку извлечения корректного поля из потока.
Кроме того, полезное значение заключается goodbit в том, что ни один из ранее упомянутых битов не задан ( goodbit гарантированно равен нулю).
iword
Присваивает значение, сохраняемое в виде iword .
Параметры
idx
Индекс значения для сохранения как iword .
Remarks
Функция-член возвращает ссылку на идентификатор элемента расширяемого массива с элементами типа long . Все элементы эффективно присутствуют и изначально хранят нулевое значение. Возвращаемая ссылка недопустима после следующего вызова iword объекта, после изменения объекта вызовом basic_ios:: copyfmt или после уничтожения объекта.
Если idx значение отрицательное или уникальное хранилище недоступно для элемента, функция вызывает setstate (badbit) и возвращает ссылку, которая может не быть уникальной.
Чтобы получить уникальный индекс, для использования во всех объектах типа ios_base , вызовите xalloc .
Пример
См xalloc . пример использования iword .
openmode
Описывает процесс взаимодействия с потоком.
Remarks
Режим открытия для нескольких iostream объектов. Значения флага:
| Константа | Действие |
|---|---|
| app | Поиск до конца потока перед каждой записью |
| ate | Поиск в конце потока сразу после открытия |
| binary | Открыть в двоичном режиме. (См fopen . описание двоичного режима.) |
| in | Открытие для чтения |
| out | Открытие для написания |
| trunc | Удаление содержимого файла после открытия |
Пример
operator=
Оператор присваивания для объектов ios_base .
Параметры
right
Объект типа ios_base .
Возвращаемое значение
Объект, которому выполняется присваивание.
Remarks
Оператор копирует сохраненные сведения о форматировании, создавая новую копию для любых расширяемых массивов. Затем оно возвращает значение *this . Обратите внимание, что стек обратных вызовов не копируется.
Этот оператор используется только классами, производными от ios_base .
precision
Задает количество цифр для отображения числа с плавающей запятой.
Параметры
_Prec
Количество значащих цифр при отображении, или количество цифр после десятичной запятой в фиксированной нотации.
Возвращаемое значение
Первая функция-член возвращает сохраненное количество цифр для отображения. Вторая функция-член сохраняет _Prec в качестве количества цифр для отображения и возвращает свое ранее сохраненное значение.
Remarks
Числа с плавающей запятой отображаются в фиксированной нотации с fixed .
Пример
pword
Присваивает значение, сохраняемое в виде pword .
Параметры
index
Индекс значения для сохранения как pword .
Remarks
Функция-член возвращает ссылку на индекс элемента расширяемого массива с элементами указателя типа void . Все элементы эффективно присутствуют и изначально хранят нулевой указатель. Возвращаемая ссылка недопустима после следующего вызова pword объекта, после изменения объекта вызовом basic_ios:: copyfmt или после уничтожения объекта.
Если индекс является отрицательным или если уникальное хранилище недоступно для элемента, функция вызывает setstate (badbit) и возвращает ссылку, которая может не быть уникальной.
Чтобы получить уникальный индекс, для использования во всех объектах типа ios_base , вызовите xalloc .
Пример
См. xalloc с примером использования pword .
register_callback
Задает функцию обратного вызова.
Параметры
pfn
Указатель на функцию обратного вызова.
idx
Определенное пользователем число.
Remarks
Функция-член отправляет пару
Пример
seekdir
Задает начальную точку для операций смещения.
Remarks
Тип — это перечислимый тип, описывающий объект, который может хранить режим поиска, используемый в качестве аргумента для функций-членов нескольких iostream классов. Ниже перечислены значения различных флагов.
beg , чтобы искать (изменить текущую позицию чтения или записи) относительно начала последовательности (массив, поток или файл).
cur , чтобы искать относительно текущей позиции в последовательности.
end , чтобы искать относительно конца последовательности.
Пример
Задает указанные флаги.
Параметры
_Mask
Флажки, которые нужно включить.
_Unset
Флаги, которые нужно отключить.
Возвращаемое значение
Предыдущие флаги формата
Remarks
Первая функция-член фактически вызывает flags(_Mask | _Flags) (задает выбранные биты), а затем возвращает предыдущие флаги формата. Вторая функция-член фактически вызывает flags(_Mask & fmtfl, flags &
_Mask) (замените выбранные биты под маской), а затем возвращает предыдущие флаги формата.
Пример
sync_with_stdio
Гарантирует, что iostream и операции библиотеки времени выполнения C выполняются в том порядке, в который они отображаются в исходном коде.
Параметры
_Sync
Синхронизированы ли все потоки. stdio
Возвращаемое значение
Предыдущий параметр для этой функции.
Remarks
Статическая функция-член сохраняет stdio флаг синхронизации, который изначально true является . Если true этот флаг гарантирует правильную синхронизацию операций с тем же файлом между функциями iostreams и теми, которые определены в стандартной библиотеке C++. В противном случае синхронизация может быть гарантирована или не гарантируется, но производительность может быть улучшена. Функция сохраняет _Sync в флаге stdio синхронизации и возвращает предыдущее сохраненное значение. Ее можно вызывать надежно только перед выполнением любых операций со стандартными потоками.
unsetf
Отключает указанные флаги.
Параметры
_Mask
Флаги, которые требуется отключить.
Remarks
Функция-член фактически вызывает flags(
Пример
См ios_base::setf . пример использования unsetf .
width
Задает длину потока вывода.
Параметры
_Wide
Нужный размер выходного потока.
Возвращаемое значение
Текущий параметр ширины.
Remarks
Первая функция-член возвращает ширину сохраненного поля. Вторая функция-член хранится _Wide в ширине поля и возвращает предыдущее сохраненное значение.
Пример
xalloc
Указывает, что переменная является частью потока.
Возвращаемое значение
Статическую функцию-член возвращает сохраненное статическое значение, которое он увеличивает при каждом вызове.
Remarks
Возвращаемое значение можно использовать в качестве уникального аргумента индекса при вызове функций-членов iword или pword .
Ios app c что это
Блог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 соответственно), все упомянутые ранее методы становятся доступными в приложении.