Ваш код никогда не создает объект std::ofstream
. Вы не можете вызвать open
для std::ofstream
объекта до его создания.
Вы создаете переменную типа для хранения указателя на std::ofstream
объект, но на самом деле вы не делаете это указывает на что-нибудь. Поэтому, когда вы вызываете open
для объекта, на который он указывает, вы вообще не вызываете open
для какого-либо действительного объекта.
Но что я не понимаю, так это почему ofstream объекту требуется пространство для выделения, если память, которая ему требуется для обработки (file.txt), уже существует?
Дело не только в том, что вы не выделяли пространство. Даже если у вас есть место для объекта, он все равно должен быть инициализирован для допустимого содержимого для объекта этого типа. Пространство необходимо для хранения информации о состоянии, например, открыт файл или нет. И он должен содержать действительное содержимое, а не мусор, или он может сказать, что файл открыт, когда его нет.
Разве это не должно быть похоже на способ обработки файлового ввода-вывода в C язык, на котором указатель FILE используется для открытия, а затем операции выполняются без выделения памяти?
Функция fopen
выделяет память, делает ее содержимое действительным и возвращает указатель на нее тебе. Затем вы должны быть уверены, что позвоните fclose
, чтобы покончить с этим, когда вы закончите. Вы можете написать эквивалентные функции для std::ofstream
, если хотите, но тогда вы потеряете преимущества многих функций C ++, таких как RAII.