使用printf实现ostream

时间:2013-04-05 11:28:32

标签: c++ printf ostream

如何实施ostream - 仅使用printf从头开始上课? 对我来说,看起来问题在于选择格式字符串,它实际上等于识别输入的类型和处理精度

3 个答案:

答案 0 :(得分:1)

我认为你的意思是通过“operator<< - 类”重载ostream。只需通过重载就可以很容易地识别函数的参数类型。例如,您可能有:

ostreamlike& ostreamlike::operator<<(int x)
{
  printf("%d", x);
  return *this;
}

ostreamlike& ostreamlike::operator<<(float x)
{
  printf("%f", x);
  return *this;
}

输出的格式取决于选择的过载。

答案 1 :(得分: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;
}

答案 2 :(得分:0)

这取决于你想要的真实ostream的接近程度。假设你想要正确地做,你还需要一个streambuf派生类。 ostream只进行格式化,实际的I / O由内部streambuf派生类完成。由于streambuf执行未格式化的I / O,您需要使用fwrite而不是printf

如果你的目标只是在已经存在的FILE*指针上进行I / O,那么这就是你要走的路。您从streambuf派生了一个类,比如streambuf_with_FILE,然后从ostreamostream_with_FILE派生另一个类。 streambuf_with_FILE会覆盖执行实际I / O的适当方法,ostream_with_FILE会有一个内部streambuf_with_FILE对象。实际上只需要很少的代码。