Закрытие файлов
Как обычно в операциях ввода-вывода, после завершения работы с файлом необходимо закрыть его.
Закрытие файла
- Используйте функцию «Закрыть член». Эта функция закрывает файл файловой системы и при необходимости очищает буферы.
Если объект CFile выделен на кадре (как показано в примере открытия файлов), объект будет автоматически закрыт, а затем уничтожен при выходе из область. Обратите внимание, что удаление CFile объекта не удаляет физический файл в файловой системе.
Как правильно закрыть файл?
Для fopen() fclose(), для popen() pclose(), для opendir() closedir(), для open() и socket() close().
Вообще, внимательно смотрите на типы результатов функций и SEE ALSO в man.
Отслеживать
ответ дан 18 авг 2011 в 21:36
45.9k 6 6 золотых знаков 47 47 серебряных знаков 115 115 бронзовых знаков
лучше используйте std::ifstream, std::ofstream. с ними как-то проще всё..
Отслеживать
ответ дан 18 авг 2011 в 20:45
490 3 3 серебряных знака 14 14 бронзовых знаков
Нужно использовать файловую переменную, т.е.
FILE *fh; //И потом так: fh = fopen("d:\1.txt", "rt");
Нас в универе учили так 🙂
Отслеживать
ответ дан 18 авг 2011 в 20:57
2,778 2 2 золотых знака 17 17 серебряных знаков 27 27 бронзовых знаков
Ну и учителя .
18 авг 2011 в 21:38
А что не так-то?
19 авг 2011 в 6:16
- c++
- файлы
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.3.2953
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Как закрыть файл в c
Для работы с файлами в стандартной библиотеке определен заголовочный файл fstream , который определяет базовые типы для чтения и записи файлов. В частности, это:
- ifstream : для чтения с файла
- ofstream : для записи в файл
- fstream : совмещает запись и чтение
Для работы с данными типа wchar_t для этих потоков определены двойники:
- wifstream
- wofstream
- wfstream
Открытие файла
При операциях с файлом вначале необходимо открыть файл с помощью функции open() . Данная функция имеет две версии:
- open(путь)
- open(путь, режим)
Для открытия файла в функцию необходимо передать путь к файлу в виде строки. И также можно указать режим открытия. Список доступных режимов открытия файла:
- ios::in : файл открывается для ввода (чтения). Может быть установлен только для объекта ifstream или fstream
- ios::out : файл открывается для вывода (записи). При этом старые данные удаляются. Может быть установлен только для объекта ofstream или fstream
- ios::app : файл открывается для дозаписи. Старые данные не удаляются.
- ios::ate : после открытия файла перемещает указатель в конец файла
- ios::trunc : файл усекается при открытии. Может быть установлен, если также установлен режим out
- ios::binary : файл открывается в бинарном режиме
Если при открытии режим не указан, то по умолчанию для объектов ofstream применяется режим ios::out , а для объектов ifstream — режим ios::in . Для объектов fstream совмещаются режимы ios::out и ios::in .
std::ofstream out; // поток для записи out.open("hello1.txt"); // окрываем файл для записи std::ofstream out2; out2.open("hello2.txt", std::ios::app); // окрываем файл для дозаписи std::ofstream out3; out2.open("hello3.txt", std::ios::out | std::ios::trunc); // установка нескольких режимов std::ifstream in; // поток для чтения in.open("hello4.txt"); // окрываем файл для чтения std::fstream fs; // поток для чтения-записи fs.open("hello5.txt"); // окрываем файл для чтения-записи
Однако в принципе необязательно использовать функцию open для открытия файла. В качестве альтернативы можно также использовать конструктор объектов-потоков и передавать в них путь к файлу и режим открытия:
fstream(путь) fstream(путь, режим)
При вызове конструктора, в который передан путь к файлу, данный файл будет автоматически открываться:
std::ofstream out("hello.txt"); std::ifstream in("hello.txt"); std::fstream fs("hello.txt", std::ios::app);
В данном случае предполагается, что файл «hello.txt» располагается в той же папке, где и файл программы.
Вообще использование конструкторов для открытия потока является более предпочтительным, так как определение переменной, представляющей файловой поток, уже преполагает, что этот поток будет открыт для чтения или записи. А использование конструктора избавит от ситуации, когда мы забудем открыть поток, но при этом начнем его использовать.
В процессе работы мы можем проверить, окрыт ли файл с помощью функции is_open() . Если файл открыт, то она возвращает true:
std::ifstream in; // поток для чтения in.open(«hello.txt»); // окрываем файл для чтения // если файл открыт if (in.is_open())
Закрытие файла
После завершения работы с файлом его следует закрыть с помощью функции close() . Также стоит отметить, то при выходе объекта потока из области видимости, он удаляется, и у него автоматически вызывается функция close.
#include #include int main() < std::ofstream out; // поток для записи out.open("hello.txt"); // окрываем файл для записи out.close(); // закрываем файл std::ifstream in; // поток для чтения in.open("hello.txt"); // окрываем файл для чтения in.close(); // закрываем файл std::fstream fs; // поток для чтения-записи fs.open("hello.txt"); // окрываем файл для чтения-записи fs.close(); // закрываем файл >
Открытие и закрытие файлов
В C++ файл открывается путем стыковки его с потоком. Имеется три типа потоков: ввода, вывода и ввода/вывода. Для открытия потока ввода необходимо объявить поток как объект класса ifstream. Для открытия потока вывода необходимо объявить его как объект класса ofstream. Потоки, которые выполняют как ввод, так и вывод, должны быть объявлены как объекты класса fstream. Например, следующий фрагмент программы создает один поток ввода, один поток вывода и один поток, способный выполнять как ввод, так и вывод:
ifstream in; // ввод
ofstream out; // вывод
fstream both; // ввод и вывод
После создания потока единственным способом ассоциировать его с файлом является использование функции ореn(). Эта функция является членом каждого из трех классов потока. Она имеет следующий прототип:
void open(const char «filename, int mode, int access=filebuf::openprot);
Здесь filename является именем файла и может включать указание пути. Величина mode определяет, каким способом открывается файл. Mode может принимать одно или более из следующих значений, (определенных в заголовочном файле fstream.h):
Можно комбинировать два и более из этих значений, используя побитовое ИЛИ.
ios::app указывает на то, что выводимые данные будут добавляться в конец файла. Это значение может быть использовано только для файлов, для которых возможен вывод. Использование ios::ate вызывает поиск конца файла в момент открытия файла.
ios::in задает возможность ввода из файла. ios::out указывает, что файл предназначен для вывода. Однако создание потока с использованием ifstream задает режим ввода, а создание потока с использованием ofstream задает режим вывода, и в этих случаях нет необходимости задавать указанные выше величины.
ios::nocreate задает такой режим, при котором функция open() может открыть только существующий файл. ios::noreplace не позволяет открыть файл функции ореn(), если файл уже существует, но не указаны атрибуты ios::ate или ios::app.
ios::trunc обусловливает уничтожение содержимого файла с заданным именем и усечение длины файла до нуля.
Режим ios::binary обусловливает открытие файла для двоичных операций. Это означает, что не будет никаких преобразований символов.
Величина access определяет, каким образом осуществляется доступ к файлу. Значения атрибута файлов определяются следующим образом:
| Атрибут | Значение |
|---|---|
| 0 | Нормальный файл, отрытый доступ |
| 1 | Файл только для чтения |
| 2 | Скрытый файл |
| 4 | Системный файл |
| 8 | Архивный файл |
С помощью операций побитового ИЛИ можно задать одновременно несколько атрибутов. Обычно эти атрибуты оставляются по умолчанию, что соответствует filebuf::openprot и соответствует нормальному файлу.
В следующем фрагменте открывается нормальный файл для вывода:
ofstream out;
out.open ( «test», ios::out, 0);
Тем не менее, практически никогда не бывает подобного вызова функции ореn(), поскольку оба параметра имеют значения по умолчанию: для ifstream значением по умолчанию mode служит ios::in; а для ofstream значение по умолчанию равно ios::out. Параметр доступа access по умолчанию соответствует нормальному файлу, как это уже отмечалось выше. Поэтому предыдущая инструкция будет выглядеть следующим образом:
out.open(«test»); // значения по умолчанию для вывода и нормального файла
Для того, чтобы открыть поток одновременно для ввода и вывода, необходимо задать обе величины ios::in и ios::out для режима mode, как показано в следующем примере:
fstream mystream;
mystream.open(«test», ios::in | ios::out);
Если функции open() не удается открыть поток, то поток остается равным NULL.
Хотя открытие файла с использованием функции ореn() является вполне допустимым, в большинстве случаев так не делается, потому что классы ifstream, ofstream и fstream содержат конструкторы, автоматически открывающие файл. Конструкторы имеют те же параметры и значения по умолчанию, что и функция ореn(). Поэтому наиболее типичный способ открытия файла выглядит следующим образом:
ifstream mystream(«myfile»); // открытие файла для чтения
Если по каким-либо причинам файл не может быть открыт, значение ассоциированного потока будет равно NULL. Можно использовать следующий код для того, чтобы убедиться, что файл действительно открыт:
ifstream mystream(«myfile»); // открытие файла для чтения
if (!mystream) cout >
Для того, чтобы закрыть файл, следует использовать функцию-член close(). Например, чтобы закрыть файл, пристыкованный к потоку mystream, используется следующая инструкция:
Функция close() не имеет ни параметров, ни возвращаемого значения.