2010-03-16 4 views
16
#include <iostream> 
#include <fstream> 
using namespace std; 

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

fstream이 iostream에서 파생 된 이유는 무엇입니까?파일을 여는 데 iostream 및 fstream 헤더를 모두 포함해야하는 이유

fstream을 삭제했지만 ofstream에 오류가 있습니다. 내 질문에 ofstream ostream에서 파생 된, 왜 fstream 컴파일하는 데 필요한?

+4

"한 가지 질문에 대해 ..."라는 제목을 모두 지정해야합니까? – dmckee

+5

제목을 의미있는 것으로 변경했습니다. @skydoor : 질문 제목이 당신의 질문이 * 무엇인지 사람들에게 말하기로되어 있음을 기억하십시오. 단지 당신의 질문이 참으로 질문이라고 말하는 것은 우리가 모르는 것을 우리에게 정말로 말하지 않습니다. – jalf

답변

19

fstream을 포함해야합니다. ofstream 클래스의 정의가 여기에 포함되어 있기 때문입니다.

당신은 종류의 뒤쪽이있어 : ofstreamostream에서 유래 한 이후 iostream을 떠날 수와 여전히 컴파일 것이다 있도록 fstream 헤더는 iostream 헤더가 포함되어 있습니다. 그러나 fstream을 생략 할 수 없습니다. ofstream에 대한 정의가 없기 때문입니다.

이렇게 생각하십시오. 내가 a.h에 넣고 경우

#include <a.h> 

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

을 그리고 나는이 프로그램을 쓰고 싶은 : 다음

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

을 그리고 b.hA에서 파생되는 클래스를 만들

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

    return 0; 
} 

을 어떤 파일을 포함시켜야합니까? 분명히 b.h. a.h 만 포함하고 B에 대한 정의가 있습니까?

C 및 C++에서 include은 리터럴입니다. 문자 그대로 include 문이 포함 된 포함 된 파일의 내용을 붙여 넣습니다. 그것은 "이 계열의 가족에서 모든 것을 나에게"주는 높은 수준의 성명과는 다릅니다.

+0

"fstream"을 포함 할 때 "iostream"을 정말로 생략 할 수 있습니까? 나는 " '이'범위에서 선언되지 않은"cout '을 "네임 스페이스 표준을 사용하여"사용 한 후에도 오류가 발생합니다. 이게 왜 그렇게? – Alby

+1

@Alby''fstream' (http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.0/fstream-source.html)에는'istream'과'ostream'이 포함되어 있지만' iostream'. 'fost'가 포함하고 있기 때문에가 아니라 'iostream'에서 실제로 아무것도 사용하지 않기 때문에'iostream'은 원래 예제에서 불필요합니다. – piedar

+0

@piedar 링크는 g ++의 동작만을 설명하며 C++ 표준에서는 필요하지 않으며 다른 구현은 다를 수 있습니다. –

5

std::ofstream은 표준 라이브러리 헤더 <fstream>에 정의되어 있습니다.

인스턴스를 만들 수 있도록 해당 헤더를 포함시켜야합니다.

+0

왜 ofstream은 ostream에서 파생 되었습니까? – skydoor

+0

출력 스트림이기 때문에. –

0

typedef ofstream 및 관련 클래스 템플릿은 #include <fstream>으로 정의되므로 해당 헤더가 필요합니다.

실제 프로그램의 경우 #include <iostream>은 필요하지 않습니다. 그러나 fstream 객체를 ostream 또는 istream에서 작동하는 일부 함수와 함께 사용할 수 있습니다.

이러한 기능은 #include <fstream>으로 정의되지 않으며 사용하는 모든 기능에 맞는 헤더를 포함해야합니다. 일부 구현에서는 #include <fstream><iostream>도 포함될 수 있지만 이는 C++ 표준에서 보장하지 않습니다. 예를 들어

,이 코드 :

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

myfile << 1; 

는 (C++ 11 #include <ostream>에 가져다 보장 #include <iostream> 때문에, 또는) #include <ostream>이 필요합니다.

관련 문제