gpt4 book ai didi

c++ - ifstream 管道和多个(顺序)编写器

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:22:55 25 4
gpt4 key购买 nike

我正在使用 std::ifstream 从 Linux 上的命名管道读取数据。如果文件的写入端关闭,我将无法继续通过流从管道读取。出于某种原因,我必须再次clear()close()open() 流才能继续阅读。这是预期的吗?当编写者随意close()open() 管道时,如何避免管道上的close() open()

背景:我相信我必须做的 close() open() 会导致作者有时收到我想避免的 SIGPIPE

更多细节——我正在使用这段代码来读取流

// read single line
stream_("/tmp/delme", std::ios::in|std::ios::binary);
std::getline(stream_, output_filename_);
std::cout << "got filename: " << output_filename_ << std::endl;
#if 0
// this fixes the problem
stream_.clear();
stream_.close();
stream_.open("/tmp/delme", std::ios::in|std::ios::binary);
// now the read blocks until data is available
#endif

// read more binary data
const int hsize = 4096+4;
std::array<char, hsize> b;
stream_.read(&b[0], hsize);
std::string tmp(std::begin(b), std::begin(b)+hsize);
std::cout << "got header: " << tmp << std::endl;

/tmp/delme 是我的管道。我执行了 echo "foo">/tmp/delme 并且在 output_filename_ 中得到了 foo 但流没有阻塞在那里,(它应该,没有更多数据),它继续读取垃圾。如果我在 ifdef 中启用代码,它就可以工作。为什么?

谢谢,塞巴斯蒂安

最佳答案

因为你使用了 std::getLine(),也许你需要使用一个额外的“\n”来表示一行的结束:

echo -e "foo\n" > /tmp/delme

不仅仅是

echo "foo" > /tmp/delme

这至少应该摆脱垃圾阅读。

关于c++ - ifstream 管道和多个(顺序)编写器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25329377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com