2017-01-20 9 views
2

これは数日間に行われたもので、私は単純なものが欠けていると思います。入力は何も、文字列、int型などの代わりに、私はログを使用するCOUTのこと、およびデータのすべてをキャッチし、ファイルに書き込むことができますファイルにデータを書き込むC++のような関数(ログ)

cout << "Testing" << 5; 

注: は、これはどのようにcoutの作品です。これが欲しい:

log << "Testing" << 5; 

私は得ている。 ヘッダー:

class LogFile { 
public: 
    void write(std::string input); 
    int operator<<(const char u[100]); 
    int operator<<(const int u); 
}; 

C++

実行されるコード(書かれているだけで、 "テスト"、int型は無視されます)
int LogFile::operator<<(const char u[100]) { 
    std::string s; 
    std::stringstream ss; 
    ss << u; 
    s = ss.str(); 
    this->write(s); 
    return 0; 
}; 
int LogFile::operator<<(const int u) { 
    std::string s; 
    std::stringstream ss; 
    ss << u; 
    s = ss.str(); 
    this->write(s); 
    return 0; 
}; 

LogFile log; 
log << "Testing" << 5; 

目標はどの模倣関数を記述することですcoutとなりますが、印刷する代わりに、データがファイルに書き込まれます。アドバイスや助けをいただければ幸いです!

+3

すでに 'std :: clog'があります。出力をリダイレクトすることができます。 – chris

+1

@chris、またはcoutをリダイレクトすることもできます。 – SergeyA

+0

'operator <<'が呼び出されたオブジェクトへの参照( 'LogFile'オブジェクト)を返すだけで、戻り値の型を適切に変更し、' cout'のような出力操作を連鎖させることができます。一方、必要なものすべてがすでに提供されているときに、独自のログユーティリティを作成することに悩むのはなぜですか? – Paul

答えて

2

あなたはテンプレートoperator<<を持つことができます:

#include <sstream> 
struct Log 
{ 
    void write(std::string const& s); 

    template<class T> 
    Log& operator<<(T const& msg) 
    { 
     std::stringstream ss; 
     ss << msg; 
     write(ss.str()); 
     return *this; 
    } 
}; 

この可能用法次のようになります。

int main(int argc, char **argv) 
{ 
    Log log; 
    log << 8; 
    log << "Hello, " << "World!"; 
    std::string msg("plop"); 
    log << msg; 
} 

Demo

+0

ありがとうございます。これは確かに正しい方向に私を押し込んだ。 いくつかの入力を収集し、ファイルに書き込む方法に関するアイデア。今、このログ( "ログ" "こんにちは、" "世界!";)は2行に書きます.1行に書き込む必要があります。 –

1

尋ねとして(目標は、より良い別のアプローチを使用して提供されるだろうが)の質問に答えるために:

あなたoperator <<リターン0 - 整数型。戻り値にoperator<<を呼び出すと、ビット単位のシフト演算子が呼び出されます。この演算子はビット単位で0を5だけシフトして結果を破棄します。タイプLogFileのオブジェクト - あなたは、コードを修正するにはlog << "Testing" << "Testing";

に試してみた場合は、コンパイルエラーを見ることが

、あなたのoperator<<*thisへの参照を返す必要があります。

1

"模倣はCOUT機能" - coutですいいえ関数です。 オブジェクトです。あなたは、オブジェクトを作成し、ストリームインサータで使用したり、ログファイルに書き込んだりすることができます。 std::ofstreamがここで使用できます。

関連する問題