0

私は基本的に wfilebuf から派生させようとしているので、ファイルに出力し、出力をインターセプトしてコンソール/デバッグウィンドウに出力し、ここに示すようにできます: http :// Savingyoutime.wordpress.com/2009/04/ 21/および/またはここ: http :// Savingyoutime.wordpress.com/2009/04/22/40/

(古代のサポート アイデア: http://www.horstmann.com/cpp/streams.txt )

私はほとんどそれを手に入れましたが、基になるファイルへの書き込みと入力の覗き見の両方ができないようです。

2 番目の例と同様に sync() 関数を上書きしましたが、setp(...) でバッファを設定しない限り、pbase() と pptr() は常に NULL のように見えますが、これはファイル出力を壊すようです。ファイルは常に空です。

これに対する私の大雑把な試みは以下のとおりです。

class LoggerBuffer : public wfilebuf {
// Functions
    public:
        LoggerBuffer();
        ~LoggerBuffer();
        void open(const wchar_t loggerFile[]);
        void close();
        int sync();
        int_type overflow(int_type c = EOF);
        void setState(int newState);
// Variables
    private:
        int currentState;
        static const int BUFFER_SIZE = 10;
        wchar_t buffer[BUFFER_SIZE];  
};

class LoggerStream : public wostream {
// Functions
    public:
         LoggerStream();
         ~LoggerStream();
         void open(const wchar_t loggerFile[] = 0);
         void close();
         void setState(int newState);
};

LoggerBuffer::LoggerBuffer() {
    wfilebuf::open("NUL", wios::out); currentState = 1;
}
LoggerBuffer::~LoggerBuffer() {
    wcout << "Destruction of LoggerBuffer" << endl;
}
void LoggerBuffer::open(const wchar_t loggerFile[]) {
    wcout << "LoggerBuffer Opening " << loggerFile << endl;
    close();
    wfilebuf* temp = wfilebuf::open(loggerFile, wios::out); //ios::out | ios::app | ios::trunc
    setp (buffer, buffer+(BUFFER_SIZE-1));
}
void LoggerBuffer::close() {
    wfilebuf::close();
}

int LoggerBuffer::sync() {
    wcout << "  Syncing ";
    int out_waiting = pptr() - pbase();
    wcout << out_waiting << " characters!";
    wcout << endl;
    wcout << "pptr(): " << (unsigned int)pptr() << endl;
    return wfilebuf::sync();
}
LoggerBuffer::int_type LoggerBuffer::overflow(int_type c) {
    wcout << "overflow! (" << (wchar_t)c << ")" << endl;
    if (c == EOF)
        return EOF;
    if (sync() == EOF)
        return EOF;
    return wfilebuf::overflow(c);
}
void LoggerBuffer::setState(int newState) {
    wcout << "New buffer state = " << newState << endl;
    currentState = newState;
}

LoggerStream::LoggerStream() : wostream(new LoggerBuffer), wios(0) {
}
LoggerStream::~LoggerStream() {
    delete rdbuf();
}
void LoggerStream::open(const wchar_t loggerFile[]) {
    wcout << "LoggerStream Opening " << loggerFile << endl;
    ((LoggerBuffer*)rdbuf())->open(loggerFile);
}
void LoggerStream::close() {
    ((LoggerBuffer*)rdbuf())->close();
}
void LoggerStream::setState(int newState) {
    wcout << "New stream state = " << newState << endl;
    ((LoggerBuffer*)rdbuf())->setState(newState);
}

完全な開示: 以前に似たようなことについて質問しました: Simple wostream logging class (with custom stream manipulators)

私はその問題を解決したと思います。

どんな助けでも大歓迎です!ありがとう!

4

1 に答える 1

0

独自のバッファリングを行わないフィルタリングstreambufを使用します。代わりに、各宛先の実際のstreambuf(つまり、実際のバッファリングを行うもの)にデータを渡します。これにより、コードがかなり単純化され、本当に気になる部分に集中できるようになります。

于 2010-11-13T08:42:19.163 に答える