【问题标题】:Why do I need to include both the iostream and fstream headers to open a file为什么我需要同时包含 iostream 和 fstream 标头才能打开文件
【发布时间】:2011-01-27 22:39:41
【问题描述】:
#include <iostream>
#include <fstream>
using namespace std;

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

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

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

【问题讨论】:

  • 真的有必要将所有内容都命名为“关于...的一个问题”吗?
  • 把标题改成了有意义的东西。 @skydoor:请记住,问题标题应该告诉人们您的问题是什么。只是说您的问题确实是一个问题并不能真正告诉我们任何我们不知道的事情。

标签: c++ iostream


【解决方案1】:

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

你有点倒退了:因为ofstream 派生自ostream,所以fstream 标头包含iostream 标头,所以你可以省略iostream,它仍然可以编译。但是你不能省略fstream,因为那样你就没有ofstream的定义。

这样想。如果我把它放在a.h:

class A {
  public:
    A();
    foo();
};

然后我在b.h 中创建了一个派生自A 的类:

#include <a.h>

class B : public A {
  public:
    B();
    bar();
};

然后我想写这个程序:

int main()
{
  B b;
  b.bar();

  return 0;
}

我必须包含哪个文件? b.h 显然。我怎么能只包含a.h 并期望有B 的定义?

请记住,在 C 和 C++ 中,include 是文字。它实际上将包含文件的内容粘贴到 include 语句所在的位置。这不像是“把这个类家族中的所有东西都给我”的更高级的声明。

【讨论】:

  • 在包含“fstream”时真的可以省略“iostream”吗?即使在使用“使用命名空间标准”后,我也会收到“‘cout’未在此范围内声明”错误。为什么会这样?
  • @Alby 似乎fstream 包括istreamostream 但不包括iostreamiostream 在原始示例中是不必要的,不是因为 fstream 包含它,而是因为该示例实际上没有使用来自 iostream 的任何内容。
  • @piedar 您的链接仅描述了 g++ 的行为,这不是 C++ 标准所要求的,其他实现可能会有所不同
  • "fstream 标头包含 iostream 标头,因此您可以省略 iostream,它仍然可以编译。"这是错误的 - 尝试包含 fstream 并省略 iostream 会使 cout 未声明的标识符
【解决方案2】:

std::ofstream&lt;fstream&gt; 标准库头文件中定义。

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

【讨论】:

  • 那么为什么 ofstream 是从 ostream 派生的呢?
  • 因为是输出流。
【解决方案3】:

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

对于您的实际程序,不需要#include &lt;iostream&gt;。但是您可能希望将您的 fstream 对象与在 ostreamistreams 上运行的某些功能一起使用。

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

例如这段代码:

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

myfile << 1;

需要#include &lt;ostream&gt;(或者,从C++11开始,#include &lt;iostream&gt;保证引入#include &lt;ostream&gt;)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 2014-11-23
    • 1970-01-01
    相关资源
    最近更新 更多