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

Зачем мне нужно включать заголовки iostream и fstream для открытия файла

#include <iostream>
#include <fstream>
using namespace std;

int main () {
  ofstream myfile;
  myfile.open ("test.txt");
  return 0;
}

fstream получен из iostream, почему мы должны включать оба кода выше?

Я удалил fstream, однако произошла ошибка с потоком. Мой вопрос isstream выводится из ostream, зачем нужен поток для его компиляции?

4b9b3361

Ответ 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>).