如何實現ostream
-like類從零開始使用printf
只?
對我來說貌似問題是在選擇格式字符串,這實際上等於確定input`s型和治療精度ostream實現使用printf
-1
A
回答
1
我假定你的意思是,通過「一個ostream
般的類」重載operator<<
。僅通過重載就可以很容易地識別函數的參數類型。例如,您可能有:
ostreamlike& ostreamlike::operator<<(int x)
{
printf("%d", x);
return *this;
}
ostreamlike& ostreamlike::operator<<(float x)
{
printf("%f", x);
return *this;
}
輸出的格式取決於選擇哪個超載。
0
這取決於你想要接近真實的ostream
。假設你想正確地做到這一點,你還需要一個streambuf
派生類。 ostream
只做格式化,實際的I/O由內部的streambuf
派生類完成。由於streambuf
沒有格式化的I/O,因此您需要使用fwrite
而不是printf
。
如果您的目標只是在已有的FILE*
指針上進行I/O操作,那麼這就是要走的路。你從streambuf
派生出一個班級,說streambuf_with_FILE
,然後你從ostream
派生出另一個班級,說ostream_with_FILE
。 streambuf_with_FILE
將覆蓋相應的方法來執行實際的I/O並且ostream_with_FILE
有一個內部的streambuf_with_FILE
對象。實際上只需要很少的代碼。
1
認爲,這可能是類似的東西
#include <stdio.h>
class ostreamlike {
public:
ostreamlike(FILE* f_): f(f_) {}
ostreamlike& write(int n) {
fprintf(f, "%d", n);
return *this;
}
ostreamlike& write(const char* n) {
fprintf(f, "%s", n);
return *this;
}
private:
FILE* f;
};
// operator for types that is supported ostreamlike internally
template <typename type>
ostreamlike& operator<<(ostreamlike& stream, const type& data) {
return stream.write(data);
}
// external implementations to write using ostreamlike
ostreamlike& operator<<(ostreamlike& stream, bool data) {
return stream.write(data ? "true" : "false");
}
int main() {
ostreamlike s(stdout);
s << "hello " << 1 << " : " << true << "\n";
return 0;
}
相關問題
- 1. 如何實現'虛擬ostream&print(ostream&out)const;'
- 2. 如何將C++ std :: ostream與printf-like格式一起使用?
- 3. OCJP - 在java中實現printf
- 4. Printf和Scanf C++的實現
- 5. 如何查看printf的實現源?
- 6. 有.net的printf的免費實現嗎?
- 7. 如何在printf中實現'include'?
- 8. sprintf或printf的最小實現
- 9. 有沒有辦法使用「ostream」來寫入std :: string的現有實例
- 10. 使用%。 in printf
- 11. 在C++或庫中是否存在null std :: ostream實現?
- 12. Printf出現負數
- 13. 放棄現有的printf語句,使新加入的printf語句
- 14. C++ ostream引用
- 15. printf使用堆棧?
- 16. 的printf使用%d
- 17. 不使用printf()的
- 18. 使用printf函數
- 19. 使用。*在printf中
- 20. 「&」使用printf()和scanf()
- 21. 爲什麼`std :: common_type_t <std :: ostream&,std :: ostream&>`等於`std :: ostream`而不是`std :: ostream&`?
- 22. rfind實現使用發現
- 23. 使用ServiceStack實現多個ICacheClient實現
- 24. JMS使用Scala實現隊列實現
- 25. 使用Subversion實現SCM實現ClearCase
- 26. C++ ostream的最佳實踐(tostring)
- 27. 實現(使用HTML)
- 28. 實現使用BNF
- 29. 實現使用jQuery
- 30. 使用RESTClient實現