2012-03-20 91 views
1

我打开了一个管道以读取文本输入的程序。将文本发送到C++中的管道的正确方法

这就是我目前在做

FILE* p = popen("myprogram", "w"); 
string myBuff; 
//write something to myBuff 
fprintf(p, "%s\n", myBuff.c_str()); 

这就是我想要做的

p = popen("myprogram", "w"); 
p << "my text" << endl; 

升压的确有东西要给这个?我会认为这是一个经常遇到的问题,它通常如何解决?

+1

什么是文件?我认为GCC附带一个包含C'FILE *'的流类型对象,这可能很有用,但它不是标准库的一部分。 – 2012-03-20 20:32:34

+1

[stdio文件中的构造ofstream]的可能的重复(http://stackoverflow.com/questions/8073846/construct-ofstream-from-stdio-file) – 2012-03-20 20:32:45

+0

它为什么这是一个重复并不明显。我的问题的解决方案可能是管道特定的;例如我正在研究使用Boost.Process – Mikhail 2012-03-20 20:43:42

回答

0

boost有促进进程间通信的进程间库。他们还在他们的沙盒中作为非官方图书馆使用标准管道来促进进程间通信。

4

一个快速和肮脏的解决方案,不会涉及Boost将简单地过载operator<<FILE*类型。

FILE* operator<<(FILE* fptr, const std::string& input_string) 
{ 
    fprintf(fptr, "%s\n", input_string.c_str()); 
    return fptr; 
} 

这不会与流修饰符像std::endl等方面的工作,但如前所述,它得到一个快速和肮脏的方式来完成工作。 Boost本身没有任何问题,但我认为只是为了获得使用operator<<语法的能力,这有点沉重。

+0

这样做是否有一些大规模的性能打击?或者,这种性能与使用流的情况相同吗? – Mikhail 2012-03-20 20:38:23

+1

为什么会有大规模的表现? C++流和用于I/O的libc函数都必须经历相同的内核调用,因此最终两个接口的性能应该非常相似。 – Jason 2012-03-20 20:39:42

相关问题