Программист может писать программу, которая обращается к файлам с разными целями: прочитать файл, записать файл, дописывать что-то в конец файла и др. Для самых популярных случаев предусмотрены режимы открытия файлов.
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
C++
1
2
3
4
5
6
7
8
//Файл усекается в каждом из следующих случаев
ofstreamout1("file1");//out и trunc установлены неявно
ofstreamout2("file1",ofstream::out);//trunc установлены неявно
//для сохранения файла следует явно задать режим app
ofstreamapp1("file1",ofstream::app);//ofstream::out установлен неявно
ofstreamapp1("file1",ofstream::app|ofstream::out);//явное открытие файла для дозаписи или изменения
Единственный способ сохранить существующие данные в открытом потоком ofstream файле — явно установить режим app или in
При каждом вызове open, для открытия файла, устанавливается или режим по умолчанию, или режим, выбираемый вами. Если вы не указываете режим, то тогда режим как бы сбрасывается в режим по умолчанию.
Пример использования режима:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//clang Использование режима работы с файлом Листинг #1
#include <fstream>
#include <iostream>
usingnamespacestd;
intmain()
{
constchar*FName="C:\\FromC\\myfile.txt";
constintN=256;//число символов в массивах
ofstreamapp(FName,ofstream::app);//то же, что ofstream app(FName, ofstream::app | ofstream::out);
app<<777;//777 уходит в конец файла FName
app.close();
cin.get();
}
/*
Вся информация внутри файла если была, то сохранилась, а к концу приписалось число 777.
Если файла не было, то создался новый файл, в который записалось число 777.
Это произошло, если путь правильный и каких-то ограничений для записи в указанное место нет.
*/
Не думаю, что имеет смысл описывать каждую ситуацию. Здесь лучше вам самими поэкспериментировать, посмотреть, что и когда получается. Пытаться отгдадать, что произойдёт в том или том случае и проверять самого себя, периодически поглядывая на приведённую информацию. Несколько режимов можно объединять между собой, об ограничениях было написано выше. Объединение режимов достигается путём использования операции |.
В обычном случае файл открывается для работы с текстом. В таком случае говорят и пишут о форматированном вводе/выводе в файл и из файла. Чтобы открыть файл для неформатированного ввода/вывода, следует использовать режим binary. Например, вам нужно сохранять в файл только цифры, зачем вам в таком файле нужны переносы строк? Логично будет сохранять только цифры, тогда файл открывается в режиме binary и в этом режиме происходит вся работа с файлом. Говорят, что такие файлы — бинарные файлы. Бинарные файлы хранят файлы в том виде, в каком они представляются памяти компьютера, и потому неудобны для чтения человеку. Такой файл нельзя взять, открыть и просто что-то исправить или прочитать в нём, как мы привыкли исправлять или читать что-то в текстовых файлах. Работа с бинарными файлами происходит быстрее, чем с файлами текстовыми. Кроме того, размер бинарных файлов меньше, чем размер текстовых файлов. Но поскольку эта статья о режимах, то описываться здесь бинарные файлы не будут.
Режим trunc может быть не очень понятным. Отдельно trunc не используется, этот режим имеет смысл только в комбинациях с другими режимами.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//Один из способов использования trunc
#include <fstream>
#include <iostream>
intmain(){
{
fstream inOut("1.txt",std::ios::in|std::ios::out);//Открыли для чтения и записи
if(inOut){//Если файл существует, то
inOut<<'x';//Вписать в файл символ 'x'
}
}
{
std::fstream inOut("2.txt",std::ios::in|std::ios::out|std::ios::trunc);//Открыли и для чтения, и для записи,
//предварительно очистив содержимое файла
if(inOut){//Если файл существует, то
inOut<<'x';//вписать в файл символ 'x'
}
}
cin.get();
}
Перед запуском последнего листинга создайте файлы, напишите в них несколько строчек текста, скомпилируйте и запустите программу. По завершению программы посмотрите, что оказалось в файлах. В одном случае вписываемый символ встанет на место первого символа внутри файла, в другом случае он просто окажется первым символом.
Также для вас может быть полезна следующая табличка:
ios::in | ios::in Открыть для чтения и записи с разрешением записи с произвольного места файла
Если в этой строке нет ошибки, то поясните её, пожалуйста. Как новичок понимаю её: два раза открыть для чтения.
Автор сайта отвечает:
похоже, что это у меня опечатка. я обязательно позже посмотрю.
сейчас, пока что, я на других вещах сосредоточен просто
(не с++).
скорее всего имелось ввиду ios::in | ios::out
исправил. это была моя ошибка.
Есть ещё несколько полезных режимов открытия файлов, пригодится: ios::nocreate задает такой режим, при котором функция open() может открыть только существующий файл. ios::noreplace не позволяет открыть файл функции ореn(), если файл уже существует, но не указаны атрибуты ios::ate или ios::app.
ios::in | ios::in Открыть для чтения и записи с разрешением записи с произвольного места файла
Если в этой строке нет ошибки, то поясните её, пожалуйста. Как новичок понимаю её: два раза открыть для чтения.
Есть ещё несколько полезных режимов открытия файлов, пригодится:
ios::nocreate задает такой режим, при котором функция open() может открыть только существующий файл.
ios::noreplace не позволяет открыть файл функции ореn(), если файл уже существует, но не указаны атрибуты ios::ate или ios::app.
Ваш сайт просто ценный для нас,ОЧЕНЬ ПОМОГ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!11111111111111
что за новые объекты ios?
Это обобщение ifstream, ofstream, fstream
Можно не выбирать, а использовать ios
ios — Это базовый тип для всех потоковых типов:
fstream, ifstream, ofstream, stringstream и других типов, где в названии типа очевидно слово stream.
ios можно подставлять вместо любого из этих типов.