2014-09-15 2 views
0

Я хотел бы написать текстовый файл из класса, в котором есть элемент из потока. Как это делается? Почему не работает ниже?Запись в файл с потоком, который является членом класса

#include <fstream> 

class A { 
public: 

A(char const* file); 
A(A&); 
void operator = (A&); 
void writeTofile(); 
std::ofstream stream; 
}; 

A::A(char const* file): stream(file) 
{ 
stream.open(file); 
stream << "Hello World!" << std::endl; 
stream.close(); 
} 
void A::writeTofile() 
{ 
stream << "Hello Again!" << std::endl; 
} 

int main() 
{ 
char const* file = "foo.txt"; 
A a = A(file); 
a.writeTofile(); 
return 0; 
} 

ответ

0

Вы закрыли поток в застройщик А, поэтому он не принимает больше входной

A::A(char const* file): stream(file) 
{ 
    ... 
    stream.close(); 
} 

Попробуйте перенести его в деструкторе:

A::~A() 
{ 
    stream.close(); 
} 
+0

К сожалению, я не знал об этом. Однако даже «Hello World!» так что есть дальнейшие проблемы .. – Frysen

0

Ваша проблема заключается в том, что вы закрываете поток в конструкторе A, поэтому, когда он обращается к writeToFile(), поток закрывается и больше не принимает вход.

Try перемещение stream.close(); деструктор, и вы должны быть хорошо:

A::~A() 
{ 
    stream.close(); 
} 
+0

Извините, я не знал об этом. Однако даже «Hello World!» является серьезным, поэтому возникают и другие проблемы. – Frysen

1

У вас есть две проблемы:

  1. Вы призывающую close() на файловом потоке, который необходим для дальнейший ввод.

    Конструктор класса A открывает файл, записывает "Hello, World" в стандартный вывод, а затем закрывает файл. Когда вы вызываете writeToFile() после этого, текст не может быть записан в файл, потому что он уже закрыт.

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

  2. Потоки не могут быть скопированы.

    Этот код здесь:

    A a = A(file); 
    

    Выполняет копирования инициализацию. Это отличается от прямой инициализации (A a(file)) тем, что он инициализирует объект, копируя правую часть его инициализатора. Конструктор, выбранный для выполнения этой копии, зависит от типа правой стороны и доступности жизнеспособных конструкторов.

    Обычно для такой копии используется копировальный конструктор (компилятор предоставляет по умолчанию один из них), но поскольку вы предоставили свой собственный конструктор A::A(A&), он отключил создание созданного компилятором-конструктора-копии. Временный экземпляр A (A(file)) не может быть преобразован в ссылку на A (справочные ссылки на C++). То же самое касается другого конструктора, который вы предоставили, нет конверсии от A до const char*.

    Если вы удалите пользовательский конструктор, вы все равно найдете ошибку. Это связано с тем, что объекты C++ IOStream не могут быть скопированы (у них есть «удаленный» экземпляр-конструктор). Поэтому, поскольку std::ofstream является членом класса, этот класс также имеет удаленный экземпляр-конструктор.

    Есть два решения:

    • Предоставлять свой собственный экземпляр-конструктор, который просто ничего не делает.
    • Используйте прямой инициализации (т.е. A a(file))
Смежные вопросы