2013-04-05 69 views
-1

如何實現ostream-like類從零開始使用printf只?
對我來說貌似問題是在選擇格式字符串,這實際上等於確定input`s型和治療精度ostream實現使用printf

回答

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_FILEstreambuf_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; 
}