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

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

  1. Sergio:

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

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

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

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

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

  2. Знаток С++:

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

  3. Игорь:

    что за новые объекты ios?

    • Это обобщение ifstream, ofstream, fstream
      Можно не выбирать, а использовать ios

      ios — Это базовый тип для всех потоковых типов:
      fstream, ifstream, ofstream, stringstream и других типов, где в названии типа очевидно слово stream.

      ios можно подставлять вместо любого из этих типов.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Поиск

 
     

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

https://www.litres.ru/aleksandr-pobegaylo/c-c-dlya-studenta/?lfrom=15589587
Яндекс.Метрика