Aynı verileri konsolda ve bir dosyada yazdırmam gereken bir kod yazıyorum. Ortak bir çıkış akışı nesnesini doldurmanın ve ardından cout'u kullanarak konsolda görüntülemenin ve fstream ve iostream kitaplıklarını kullanarak bir dosyaya vermenin bir yolu var mı?Konsolda ve C++ içindeki bir dosyada yazdırmak için ortak bir çıkış akışı nesnesi oluşturmanın bir yolu var mı?
cevap
Elbette. Yalnızca dahili olarak yazdığı diğer akış arabelleklerini depolayan uygun bir akış arabelleği oluşturursunuz. Bu akış arabelleğini kullanarak, yazdığınız bir std::ostream
oluşturursunuz.
#include <streambuf>
#include <ostream>
class teebuf
: public std::streambuf
{
std::streambuf* sb1_;
std::streambuf* sb2_;
int overflow(int c) {
typedef std::streambuf::traits_type traits;
bool rc(true);
if (!traits::eq_int_type(traits::eof(), c)) {
traits::eq_int_type(this->sb1_->sputc(c), traits::eof())
&& (rc = false);
traits::eq_int_type(this->sb2_->sputc(c), traits::eof())
&& (rc = false);
}
return rc? traits::not_eof(c): traits::eof();
}
int sync() {
bool rc(false);
this->sb1_->pubsync() != -1 || (rc = false);
this->sb2_->pubsync() != -1 || (rc = false);
return rc? -1: 0;
}
public:
teebuf(std::streambuf* sb1, std::streambuf* sb2)
: sb1_(sb1), sb2_(sb2) {
}
};
class oteestream
: private virtual teebuf
, public std::ostream {
public:
oteestream(std::ostream& out1, std::ostream& out2)
: teebuf(out1.rdbuf(), out2.rdbuf())
, std::ostream(this) {
this->init(this);
}
};
#include <fstream>
#include <iostream>
int main()
{
std::ofstream fout("tee.txt");
oteestream tee(fout, std::cout);
tee << "hello, world!\n";
}
Özel bir akış arabelleği burada olsa çok fazla olabilir. Bir "stringstream" e kaydetme ve bunu iki kez çıkarmanız yeterli olabilir. Her neyse, iyi biri. (BTW: Bu kodun etrafta yattığını mu düşünüyorsun?) – Deduplicator
@Deduplicator: Evet, kullanması uygun bir çözüm ve uygun bir çözüm olan bir çözüm var. Akış arabelleğini bir "std :: ostream" haline getirerek tee akışı arabelleğini kullanmak oldukça güzel hale getirir. ... ve evet, bu kodun etrafında yalan söyledim: _that_ fast :-) yazmam. –
- 1. Bir Arabirimi destekleyen bir DynamicObject oluşturmanın bir yolu var mı?
- 2. AWS CLI kullanarak S3 nesnesi için önceden tasarlanmış bir url oluşturmanın bir yolu var mı?
- 3. C++ özel niteleyiciler oluşturmanın bir yolu var mı?
- 4. Titreyen çizgi çekmeden bir çizgi oluşturmanın bir yolu var mı?
- 5. Bir değişkene NodeJs Express görünümü oluşturmanın bir yolu var mı?
- 6. Trigger.io için yerel eklentiler oluşturmanın bir yolu var mı?
- 7. Linux'ta kullanıcı tanımlı bir sinyal oluşturmanın bir yolu var mı?
- 8. Test verilerinin bulunduğu bir örnek oluşturmanın bir yolu var mı?
- 9. jQuery: özyinelemeli bir çocuk seçici oluşturmanın bir yolu var mı?
- 10. Div Scrollbar - Stil oluşturmanın herhangi bir yolu var mı?
- 11. JavaFX'te yol gradyanı oluşturmanın herhangi bir yolu var mı?
- 12. Powershell'de özel türler oluşturmanın basit bir yolu var mı?
- 13. Tkinter ile şeffaf pencereler oluşturmanın bir yolu var mı?
- 14. Paketli Eklentiler listesini otomatik olarak oluşturmanın bir yolu var mı?
- 15. MySQL sonuç kümesinde "sahte" satır oluşturmanın bir yolu var mı?
- 16. Julia-lang'de paket bağımlılık ağacı oluşturmanın bir yolu var mı?
- 17. TSQL değişken sabitini oluşturmanın bir yolu var mı?
- 18. Uygulama motorunda GUID oluşturmanın iyi bir yolu var mı?
- 19. Python'da sınıf özelliği oluşturmanın bir yolu var mı?
- 20. Git otomatik bir --version seçeneği için bir sürüm numarası dosyası oluşturmanın bir yolu var mı?
- 21. c ve C++ prototiplerini karıştırmanın bir yolu var mı?
- 22. Python modülünden C benzeri bir DLL oluşturmanın bir yolu var mı?
- 23. C harflerini saymanın bir yolu var mı?
- 24. Excel tabloları oluşturmak için ortak bir lisp kütüphanesi var mı?
- 25. Özniteliklere sahip bir jQuery nesnesi oluşturmanın tercih edilen yolu nedir?
- 26. django.db.connection.queries öğesini temizlemenin bir yolu var mı?
- 27. Önce boş bir çözüm (.sln) dosyası oluşturmanın ve sonra da proje eklemenin bir yolu var mı?
- 28. iOS ve Android'de yerel olarak çağrılabilen haxe'de bir kitaplık oluşturmanın bir yolu var mı?
- 29. Her çalışan jvm için bir jstack oluşturmanın basit bir yolu var mı?
- 30. C# içindeki bir dizgede char'i değiştirmenin kolay bir yolu var mı?
kullanın [ 'artırmak :: iostreams :: tee_device'] (http://www.boost.org/doc/libs/: Örneğin
, burada bu yaklaşımın basit bir uygulamasıdır 1_39_0/libs/iostreams/doc/işlevleri/tee.html). – 0x499602D2
Bunu arama ortamında yapmanızı öneririm. –