C++ для начинающих. Как открыть файл в нужном режиме

Программист может писать программу, которая обращается к файлам с разными целями: прочитать файл, записать файл, дописывать что-то в конец файла и др. Для самых популярных случаев предусмотрены режимы открытия файлов.
in
Режим чтения файла
out
Режим записи в файл
app
Режим для строгой записи в конец файла, т. е. только приписать в конец файла.
ate
Режим для записи в конец файла, но с возможностью записи в любом месте файла.
trunc
Режим для усечения файла.
binary
Режим для работы с двоичными файлами.
Режим, нужный вам для файла, можно указывать при каждой привязке переменной, выполняющей роль файла, к файлу.
У режимов есть ряд ограничений.
  • Режим out может быть установлен только для объектов типа ofstream или fstream
  • Режим in может быть установлен только для объектов типа ifstream или fstream
  • Режим trunc может быть установлен только совместно с out
  • Режим app может быть установлен только если не установлен режим trunc. Если установлен режим app, то файл всегда открывается в режиме вывода, даже если эт не указано явно.
  • Для каждого типа файлового потока установлен свой режим по умолчанию.
  • Режим ate и binary могут быть установлены для объектов файлового потока любого типа и умеют комбинировать с любым другим режимом.
Когда вы создаёте переменную-объект, связываемую с файлом по имени или полному пути файла, вы задаёте этой переменной-объекту тип, который может быть или ifstream, или ofstream, или fstream. Вот этот тип называют файловым потоком. В каком режиме окажется файл (если вы режим не указывали явно), зависит от выбранного типа, если тип чтение файла, то по умолчанию файл будет открываться для чтения, если тип запись в файл, то по умолчанию файл будет открываться для записи в файл. Есть ещё режим, который получается при комбинации двух режимов, режим чтения и записи в файл, в таком режиме файл по умолчанию будет открыт и для чтения, и для записи сразу.
Поток
Предназначение
Открывается в режиме

ifstream
чтение файла
in

ofstream
запись в файл
out

fstream
и чтение, и запись
out | in

Если файл открывается в режиме записи, out, то по умолчанию файл уничтожается и на его место создаётся новый файл. Единственный способ оставить файл подразумевает app

  • Единственный способ сохранить существующие данные в открытом потоком ofstream файле — явно установить режим app или in
При каждом вызове open, для открытия файла, устанавливается или режим по умолчанию, или режим, выбираемый вами. Если вы не указываете режим, то тогда режим как бы сбрасывается в режим по умолчанию.
Пример использования режима:

Не думаю, что имеет смысл описывать каждую ситуацию. Здесь лучше вам самими поэкспериментировать, посмотреть, что и когда получается. Пытаться отгдадать, что произойдёт в том или том случае и проверять самого себя, периодически поглядывая на приведённую информацию. Несколько режимов можно объединять между собой, об ограничениях было написано выше. Объединение режимов достигается путём использования операции |.
В обычном случае файл открывается для работы с текстом. В таком случае говорят и пишут о форматированном вводе/выводе в файл и из файла. Чтобы открыть файл для неформатированного ввода/вывода, следует использовать режим binary. Например, вам нужно сохранять в файл только цифры, зачем вам в таком файле нужны переносы строк? Логично будет сохранять только цифры, тогда файл открывается в режиме binary и в этом режиме происходит вся работа с файлом. Говорят, что такие файлы — бинарные файлы. Бинарные файлы хранят файлы в том виде, в каком они представляются памяти компьютера, и потому неудобны для чтения человеку. Такой файл нельзя взять, открыть и просто что-то исправить или прочитать в нём, как мы привыкли исправлять или читать что-то в текстовых файлах. Работа с бинарными файлами происходит быстрее, чем с файлами текстовыми. Кроме того, размер бинарных файлов меньше, чем размер текстовых файлов. Но поскольку эта статья о режимах, то описываться здесь бинарные файлы не будут.
Режим trunc может быть не очень понятным. Отдельно trunc не используется, этот режим имеет смысл только в комбинациях с другими режимами.

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

in
Чтение с начала файла
Отказ от открытия

out, либо out | trunc
Очищает файл
Создание нового файла

app, либо out | app
Дописывает в конец файла
Создание нового файла

out, либо out | in
Чтение с начала файла
Ошибка

out | in | trunc
Очищает файл
Создание нового файла

out | in | app или in | app
Запись в конец файла
Создание нового файла

binary | in
Чтение с начала файла
Отказ от открытия

binary | out или binary | out | trunc
Очищает файл
Создание нового файла

binary | app или binari | out | app
Запись в конец файла
Создание нового файла

binary | out | in
Чтение с начала файла
Ошибка

binary | out | in | trunc
Очищает файл
Создание нового файла

binary | out | in | app или binary | in | app
Запись в конец файла
Создание нового файла

Для этой статьи использовались материалы из книги:

И таблица, приведённая на сайте http://en.cppreference.com/w/cpp/io/basic_filebuf/open

Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

2 комментария: C++ для начинающих. Как открыть файл в нужном режиме

  • Sergio говорит:

    ios::in | ios::in Открыть для чтения и записи с разрешением записи с произвольного места файла
    Если в этой строке нет ошибки, то поясните её, пожалуйста. Как новичок понимаю её: два раза открыть для чтения.

    Автор сайта отвечает:
    похоже, что это у меня опечатка. я обязательно позже посмотрю.
    сейчас, пока что, я на других вещах сосредоточен просто
    (не с++).

    скорее всего имелось ввиду ios::in | ios::out

    исправил. это была моя ошибка.

    Есть ещё несколько полезных режимов открытия файлов, пригодится:
    ios::nocreate задает такой режим, при котором функция open() может открыть только существующий файл.
    ios::noreplace не позволяет открыть файл функции ореn(), если файл уже существует, но не указаны атрибуты ios::ate или ios::app.




    0



    0
  • Знаток С++ говорит:

    Ваш сайт просто ценный для нас,ОЧЕНЬ ПОМОГ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!11111111111111




    0



    0

Добавить комментарий

Ваш e-mail не будет опубликован.

Поиск

 
     

Случайная книга в электронном формате

Яндекс.Метрика
НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

- Сынок, сходи в магазин? - А волшебное слово? - Отключу интернет! - Уже бегу!

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок