2010-11-14 186 views
0

如何重載< <運算符(cout)以便它可以寫入文件。每當發生< <它應該被附加到文件,而不是顯示在屏幕上它應該被寫入文件。運算符超載

我可以得到這個代碼...我新的C++和我寫的代碼不工作..

+1

http://www.cplusplus.com/reference/iostream/fstream/open/ – SingleNegationElimination 2010-11-14 08:13:32

+1

對於較小的項目(工具),它其實並不是一件壞事在運行程序(mytool> output.txt)時只寫入cout並指向文件 – stefaanv 2010-11-14 12:15:58

回答

3

通常情況下你的類提供std::ostream& operator<<(std::ostream&, const YourClass&)和寫入文件流,如下所示:

std::ofstream ofs("out"); 
ofs << yourObject; 

其中yourObjectYourClass的一個對象。

1

此重載已針對C++文件流完成。名稱cout表示控制檯輸出和精神是,它會輸出到控制檯。 你可以做的一件事是使用freopen()將所有輸出重定向到一個文件。

3

您的超載<<運算符不應該關心它到達什麼樣的輸出流,或者它是否正在追加或覆蓋。它需要一個std::ostream&並寫入它。如果它與cout一起使用,則將其寫入控制檯。如果它與std::ofstream一起使用,那麼它將寫入一個文件。如果std::ofstream被打開覆蓋,則會覆蓋。如果它被打開以追加,則追加。

運算符應該在意的所有重載操作都是寫入輸出流。那個流代表的是無關緊要的。

1

如果您只是想將文本發送到文件而不是控制檯,那麼std::ofstream是您的朋友。與cout類似,您的ofstream的實例共享ostream的行爲,該行爲對字符串已具有合適的<<operator,並且可以完全按照cout使用。這裏有一個例子:

#include <fstream> 

int main() 
{ 
    std::ofstream fout("somefile.txt"); 

    fout << "Some text" << std::endl; 

    return EXIT_SUCCESS; 
} 

編譯並運行,你會發現,你在當前工作目錄的新文件:

% cat somefile.txt 
Some text 

如果您需要流那並不是一個對象「T已經operator <<重載std::ostream,那麼你就需要重載運營商,像這樣:

std::ostream& operator <<(std::ostream& os, const SomeClass& instance) 
{ 
    instance.print(os); 
    return os; 
} 

您將需要void SomeClass::print(std::ostream& os)定義爲將其私人數據發送到os(這樣可以節省您製作班級的<< a friend)。


是你說的純粹是cout,那麼這是不是「運算符重載」,這是流重定向。但是,是的,通過使用std::basic_ios::rdbuf()來設置關聯的流緩衝區也是可能的。

這裏是 「Redirecting in C++my solution

#include <iostream> 
#include <fstream> 

class scoped_cout_redirector 
{ 
public: 
    scoped_cout_redirector(const std::string& filename) 
     :backup_(std::cout.rdbuf()) 
     ,filestr_(filename.c_str()) 
     ,sbuf_(filestr_.rdbuf()) 
    { 
     std::cout.rdbuf(sbuf_); 
    } 

    ~scoped_cout_redirector() 
    { 
     std::cout.rdbuf(backup_); 
    } 

private: 
    scoped_cout_redirector(); 
    scoped_cout_redirector(const scoped_cout_redirector& copy); 
    scoped_cout_redirector& operator =(const scoped_cout_redirector& assign); 

    std::streambuf* backup_; 
    std::ofstream filestr_; 
    std::streambuf* sbuf_; 
}; 


int main() 
{ 
    { 
     scoped_cout_redirector file1("file1.txt"); 
     std::cout << "This is written to the first file." << std::endl; 
    } 

    std::cout << "This is written to stdout." << std::endl; 

    { 
     scoped_cout_redirector file2("file2.txt"); 
     std::cout << "This is written to the second file." << std::endl; 
    } 

    return 0; 
} 
+0

它不是cout它是重載<<運算符 – rakesh 2010-11-14 08:44:17

+0

感謝您的澄清。我已經相應地更新了我的答案。 – Johnsyweb 2010-11-14 09:12:14