Подтвердить что ты не робот

Что произойдет, если я никогда не назову `close` в открытом потоке файлов?

Ниже приведен код для того же случая.

#include <iostream>
#include <fstream>

using namespace std;

int main () {
    ofstream myfile;
    myfile.open ("example.txt");
    myfile << "Writing this to a file.\n";
    //myfile.close();
    return 0;
}

Какая разница, если я раскомментирую строку myfile.close()?

4b9b3361

Ответ 1

Нет никакой разницы. Деструктор потока файлов закроет файл.

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

#include <fstream>

int main()
{
  std::ofstream myfile("example.txt");
  myfile << "Writing this to a file.\n";
}

Ответ 2

Чтобы упростить ответ juanchopanza с некоторой ссылкой из std::fstream документации

(деструктор)
[virtual] (неявно объявлено)

уничтожает basic_fstream и связанный с ним буфер, закрывает файл(функция виртуального публичного участника)

Ответ 3

В этом случае ничего не произойдет, и время выполнения кода будет меньше.

Однако, если ваши коды работают в течение длительного времени, когда вы постоянно открываете файлы и не закрываете их, через некоторое время может произойти сбой во время выполнения.

при открытии файла операционная система создает запись для представления этого файла и сохраняет информацию об этом открывшемся файле. Итак, если в вашей ОС открыто 100 файлов, то в ОС будет находиться 100 записей (где-то в ядре). Эти записи представлены целыми числами типа (... 100, 101, 102....). Этот номер записи является файловым дескриптором. Таким образом, это просто целое число, которое уникально представляет собой открытый файл в операционной системе. Если ваш процесс откроет 10 файлов, ваша таблица процессов будет содержать 10 записей для дескрипторов файлов.

Кроме того, вы можете исчерпать дескрипторы файлов, если вы сразу открываете множество файлов. Это предотвратит запуск * nix-систем, поскольку они все время открывают дескрипторы для записи в /proc.

Аналогичная ситуация должна произойти в случае всей операционной системы.

Ответ 4

В нормальных условиях разницы нет.

НО в исключительных условиях (с небольшими изменениями) вызов закрытия может вызвать утечку.

int main()
{
    try
    {
        ofstream myfile;
        myfile.exceptions(std::ios::failbit | std::ios::badbit);
        myfile.open("example.txt");

        myfile << "Writing this to a file.\n";


        // If you call close this could potentially cause an exception
        myfile.close();


        // On the other hand. If you let the destructor call the close()
        // method. Then the destructor will catch and discard (eat) the
        // exception.
    }
    catch(...)
    {
        // If you call close(). There is a potential to get here.
        // If you let the destructor call close then the there is
        // no chance of getting here.
    }
}