運算符超載
回答
通常情況下你的類提供std::ostream& operator<<(std::ostream&, const YourClass&)
和寫入文件流,如下所示:
std::ofstream ofs("out");
ofs << yourObject;
其中yourObject
是YourClass
的一個對象。
此重載已針對C++文件流完成。名稱cout表示控制檯輸出和精神是,它會輸出到控制檯。 你可以做的一件事是使用freopen()將所有輸出重定向到一個文件。
您的超載<<
運算符不應該關心它到達什麼樣的輸出流,或者它是否正在追加或覆蓋。它需要一個std::ostream&
並寫入它。如果它與cout
一起使用,則將其寫入控制檯。如果它與std::ofstream
一起使用,那麼它將寫入一個文件。如果std::ofstream
被打開覆蓋,則會覆蓋。如果它被打開以追加,則追加。
運算符應該在意的所有重載操作都是寫入輸出流。那個流代表的是無關緊要的。
如果您只是想將文本發送到文件而不是控制檯,那麼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;
}
- 1. 運算符超載[]
- 2. 運算符超載
- 3. 運算符==超載
- 4. 運算符+超載
- 5. 運算符超載
- 6. 運算符超載賦值運算符
- 7. 運算符*超載C++
- 8. 鏈接超載+運算符
- 9. 運算符+超載C++
- 10. 未能超載運算符+ =
- 11. 結構運算符超載
- 12. 類運算符*超載
- 13. 如何超載運算符+
- 14. 賦值=運算符超載
- 15. Qt超載運算符
- 16. C++超載運算符[]
- 17. Python 3運算符超載
- 18. C++超載運算符
- 19. 運算符+超載問題
- 20. 運算符超載:Ostream/Istream
- 21. 超載運算符輸出
- 22. 運算符超載懷疑
- 23. 未能超載運算符<<(C++)
- 24. 運算符在Clojure中超載
- 25. C++ 11 <<運算符specefic超載
- 26. 錯誤:運算符未超載
- 27. Scala中的超載索引運算符
- 28. 提升foreach和運算符超載
- 29. 如何超載運算符<<
- 30. C++運算符超載衝突
http://www.cplusplus.com/reference/iostream/fstream/open/ – SingleNegationElimination 2010-11-14 08:13:32
對於較小的項目(工具),它其實並不是一件壞事在運行程序(mytool> output.txt)時只寫入cout並指向文件 – stefaanv 2010-11-14 12:15:58