2011-05-11 23 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

你的意思是:

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,像這樣:

// 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::istreamstd::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; 
}