Зачем мне нужно включать заголовки iostream и fstream для открытия файла
#include <iostream>
#include <fstream>
using namespace std;
int main () {
ofstream myfile;
myfile.open ("test.txt");
return 0;
}
fstream получен из iostream, почему мы должны включать оба кода выше?
Я удалил fstream, однако произошла ошибка с потоком. Мой вопрос isstream выводится из ostream, зачем нужен поток для его компиляции?
Ответы
Ответ 1
Вам нужно включить fstream
, потому что это определение класса ofstream
.
Вы как-то получили это назад: поскольку ofstream
происходит от ostream
, заголовок fstream
включает заголовок iostream
, поэтому вы можете оставить iostream
, и он все равно будет компилироваться. Но вы не можете оставить fstream
, потому что тогда у вас нет определения для ofstream
.
Подумайте об этом так. Если я поставлю это в a.h
:
class A {
public:
A();
foo();
};
И затем я создаю класс, который происходит от A
в b.h
:
#include <a.h>
class B : public A {
public:
B();
bar();
};
И затем я хочу написать эту программу:
int main()
{
B b;
b.bar();
return 0;
}
Какой файл мне нужно включить? b.h
очевидно. Как включить только a.h
и ожидать определения для B
?
Помните, что в C и С++ include
является литералом. Он буквально вставляет содержимое включенного файла, где был оператор include
. Это не похоже на высказывание более высокого уровня "дайте мне все в этом семействе классов".
Ответ 2
std::ofstream
определяется в заголовке стандартной библиотеки <fstream>
.
Вам нужно включить этот заголовок для его определения, чтобы вы могли его создать.
Ответ 3
typedef ofstream
и связанный с ним шаблон класса определяются #include <fstream>
, поэтому вам нужен этот заголовок.
Для вашей реальной программы #include <iostream>
не требуется. Но вы можете использовать свой объект fstream
с некоторыми функциями, которые работают с ostream
или istream
.
Эти функции не определены #include <fstream>
, и вам нужно включить правый заголовок для любых функций, которые вы используете. Некоторые реализации могут привести к тому, что #include <fstream>
также будет включать <iostream>
, но это не гарантируется стандартом С++.
Например, этот код:
ofstream myfile;
myfile.open ("test.txt");
myfile << 1;
требует #include <ostream>
(или, поскольку С++ 11, #include <iostream>
, который гарантированно принесет #include <ostream>
).