2011-05-11 7 views
0

파일 스트림을 일반적으로 작업하고 싶습니다. 즉, '구현이 아닌 인터페이스에 프로그램하십시오'. 다음과 같이 입력하십시오 :일반적으로 파일 스트림 작업

ios * genericFileIO = new ifstream("src.txt"); 
    getline(genericFileIO, someStringObject);//from the string library; dont want to use C strings 
    genericFileIO = new ofstream("dest.txt"); 
    genericFileIO -> operator<<(someStringObject); 

가능합니까? 나는 유산으로 위대하지 못합니다. io 클래스 계층을 감안할 때, 내가 원하는 것을 구현하려면 어떻게해야합니까?

+0

자신 만의 스트림 클래스를 구현하고 싶거나 C++ 스트림 클래스를 사용하는 방법을 알고 싶습니까? –

+0

둘 중 더 간단합니다. – badmaash

+1

C++ 스트림 클래스가 인터페이스 였지만. –

답변

2

당신은 의미합니까 : 이것은 당신의 예는 어떤 기능을 수행합니까

// from a file to cout 
// no need to new 
std::ifstream in("src.txt"); 
pass_a_line(in, std::cout); 

// from a stringstream to a file 
std::istringstream stream("Hi"); 
std::ofstream out("dest.txt"); 
pass_a_line(stream, out); 

하고 std::istream에 대해 프로그램되어있다 :

void 
pass_a_line(std::istream& in, std::ostream& out) 
{ 
    // error handling left as an exercise 
    std::string line; 
    std::getline(in, line); 
    out << line; 
} 

이 지금과 같은 std::istreamstd::ostream이며, 그 어떤 작업 할 수 있습니다 및 std::ostream 인터페이스. 그러나 그것은 일반적인 프로그래밍이 아닙니다. 그것은 객체 지향 프로그래밍입니다.

Boost.Iostreams는 클래스를 std::[i|o|io]stream으로 변경할 수 있으며 일반 프로그래밍을 사용합니다.

+0

그게 전부입니다. 제네릭 함수를 영리하게 사용합니다. 하지만 내가 정말로하고 싶은 것은 그 질문과 같습니다. 인터페이스에 프로그램하십시오. io 클래스 계층 구조가 주어진다면 그렇게 할 수 없습니까? – badmaash

+1

@Abhi 그것은 일반적인 함수가 아니며'std :: istream'과'std :: ostream'을 사용하는 것은 기본 클래스입니다. 내 기능에서는 인터페이스로 간주됩니다. –

1

ostream 또는 istream 인터페이스에 대해 ostream 또는 istream 개념의 다양한 전문화를 사용할 수 있습니다.

void Write(std::ostream& os, const std::string& s) 
{ 
    os << "Write: " << s; 
} 

std::string Read(std::istream& is) 
{ 
    std::string s; 
    is >> s; 
    return s; 
} 

int main() 
{ 
    Write(std::cout, "Hello World"); 

    std::ofstream ofs("file.txt"); 
    if (ofs.good()) 
     Write(ofs, "Hello World"); 

    std::stringstream ss; 
    Write(ss, "StringStream"); 
    Write(std::cout, ss.str()); 


    std::string s = Read(std::cin); 
    Write(std::cout, s); 

    return 0; 
}