使用istream从命名管道读取

问题描述:

是否有可能使用C++(stl) 使用流从命名管道(mkfifo)读取 - 因此不会事先为读取操作定义char *buffer[MAX_SIZE]使用istream从命名管道读取

我想读直到缓冲区结束并将结果放入std::string

(现在的方法:bytes = read(fd, buffer, sizeof(buffer));分配需要提前某种缓冲的。)

+0

固定它:-) 10X – Dani

mkfifo的行为很像普通的文件创建命名管道。因此,他们可以使用std::ifstreamstd::ofstream访问:

#include <fstream> 
#include <iostream> 

int main(int, char** argv) { 
    std::ifstream file{argv[1]}; 
    std::string line; 
    std::getline(file, line); 
    std::cout << line << '\n'; 
} 

运行:

mkfifo foobar 
./main foobar 

和其他地方:

echo 'Hello world!' > foobar 

...这将导致./main打印到“世界,你好!”标准输出。

+1

谢谢,我可以把它读,直到缓冲区结束?如果有人在阅读时填充缓冲区会发生什么情况? – Dani

+1

@WhozCraig呃,失败。修复。 –

+2

@Dani您可以像读取任何其他流一样阅读它(请参阅[其他](http://*.com/q/116038/1968))。如果你的程序正在运行,而其他进程正在填充它,程序将读取,直到另一个进程关闭管道。 –

有什么魔力管道到你的程序,它只是把你的cin阅读从流而不是从控制台用户的输入:Linux terminal pipe to my C++ program

在这个问题的编辑历史中一个简单的一瞥将表明,这个问题具有极大的从它的原始版本感谢提高到Konrad Rudolph(其他回答者在这个问题上)在进一步dastardliness的举动我要凑他的解决方案2啜流进string

istreambuf_iterator method:

const string mkfifo{ istreambuf_iterator<char>(cin), istreambuf_iterator<char>() }; 

stringbuf copy method:

istringstream temp; 
temp << cin.rdbuf(); 
const auto mkfifo = temp.str(); 

您可以了解每个对各自岗位的优劣。要使用此代码,说你的编译程序被命名为main你会管这样的:

mkfifo named_pipe 
echo "lorem ipsum" > named_pipe 
./main named_pipe 
+0

由于'EOF'类型错误('int'),因此这会产生“调用getline没有匹配的函数”。 –

+2

关于您的编辑:如果某些其他进程将'static_cast (EOF)'写入管道,然后是更多内容(真正的问题:我不知道会发生什么情况以及行为是否有保证,但是我怀疑流将被过早截断,我不认为将'EOF'转换为'char'是一个通用的解决方案)。 –

+1

@KonradRudolph哇,我总是使用'EOF'。在研究你的评论之后,我显然不像我想象的那么聪明:( –