为什么我需要包含iostream和fstream标头来打开文件

时间:2010-03-16 02:03:46

标签: c++ iostream

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

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

fstream是从iostream派生的,为什么我们应该在上面的代码中包含两者?

我删除了fstream但是,ofstream存在错误。我的问题是ofstream是从ostream派生出来的,为什么需要fstream才能编译?

3 个答案:

答案 0 :(得分:22)

您需要包含fstream,因为这是ofstream类的定义所在。

你有点反过来:因为ofstream来自ostreamfstream标题包含iostream标题,所以你可以省略{{1}它仍然会编译。但是你不能遗漏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的定义?

请记住,在C和C ++中,B是文字的。它实际上粘贴了include语句所在的包含文件的内容。这不像是一个更高级别的声明,“在这个班级中给我一切。”

答案 1 :(得分:5)

std::ofstream<fstream>标准库标头中定义。

您需要为其定义包含该标头,以便您可以实例化它。

答案 2 :(得分:0)

typedef ofstream及其关联的类模板由#include <fstream>定义,因此您需要该标头。

对于您的实际计划,不需要#include <iostream>。但是,您可能希望将fstream对象与某些在ostreamistream s上运行的函数一起使用。

这些函数不是由#include <fstream>定义的,您需要为您使用的任何函数包含正确的标题。某些实现可能会导致#include <fstream>也包含<iostream>,但C ++标准无法保证这一点。

例如,此代码:

ofstream myfile;
myfile.open ("test.txt");

myfile << 1;

需要#include <ostream>(或者,自C ++ 11起,#include <iostream>保证会引入#include <ostream>)。