使用istream从命名管道读取
是否有可能使用C++(stl) 使用流从命名管道(mkfifo)读取 - 因此不会事先为读取操作定义char *buffer[MAX_SIZE]
?使用istream从命名管道读取
我想读直到缓冲区结束并将结果放入std::string
。
(现在的方法:bytes = read(fd, buffer, sizeof(buffer));
分配需要提前某种缓冲的。)
与mkfifo
的行为很像普通的文件创建命名管道。因此,他们可以使用std::ifstream
和std::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
打印到“世界,你好!”标准输出。
谢谢,我可以把它读,直到缓冲区结束?如果有人在阅读时填充缓冲区会发生什么情况? – Dani
@WhozCraig呃,失败。修复。 –
@Dani您可以像读取任何其他流一样阅读它(请参阅[其他](http://*.com/q/116038/1968))。如果你的程序正在运行,而其他进程正在填充它,程序将读取,直到另一个进程关闭管道。 –
有什么魔力管道到你的程序,它只是把你的cin
阅读从流而不是从控制台用户的输入:Linux terminal pipe to my C++ program
在这个问题的编辑历史中一个简单的一瞥将表明,这个问题具有极大的从它的原始版本感谢提高到Konrad Rudolph(其他回答者在这个问题上)在进一步dastardliness的举动我要凑他的解决方案2啜流进string
:
const string mkfifo{ istreambuf_iterator<char>(cin), istreambuf_iterator<char>() };
istringstream temp;
temp << cin.rdbuf();
const auto mkfifo = temp.str();
您可以了解每个对各自岗位的优劣。要使用此代码,说你的编译程序被命名为main
你会管这样的:
mkfifo named_pipe
echo "lorem ipsum" > named_pipe
./main named_pipe
由于'EOF'类型错误('int'),因此这会产生“调用getline没有匹配的函数”。 –
关于您的编辑:如果某些其他进程将'static_cast
@KonradRudolph哇,我总是使用'EOF'。在研究你的评论之后,我显然不像我想象的那么聪明:( –
固定它:-) 10X – Dani