我正在编写一个框架,以跟踪人们如何使用我的实用程序,例如示例实用程序'结果' 所以我想把一段代码放入result.cxx main()中,它会记录像
这样的东西1. what arguments were given to result = argc, argv
2. what other programs were used to process stuff and pipe to my utility 'result'
例如: 我试图运行程序'结果',这是从像
这样的管道输入abc -e earg -t targ | process_stuff_out_data | result -s sarg
现在在result.cxx我用来捕获管道输入
std::string piped_data;
std::getline(std::cin, piped_data);
这适用于像
这样的情况 echo "1 2 3 " | result -i in_number
// here the piped input is just "1 2 3" so i am able to log it from result
但不适用于前一个程序的输出是二进制数据流的情况
abc -e earg -t targ | out_bin_data | result -s sarg
在这种情况下我只想
LOG_PIPED_STUFF: abc -e earg -t targ | process_stuff_out_data
答案 0 :(得分:1)
std :: getline将不会返回,直到它读取换行符,请参见此处:http://www.cplusplus.com/reference/string/string/getline 在数据变得可用时,使用另一个分隔符标记或仅使用另一个函数从标准输入读取。 你可以使用例如feof(stdin)检查stdin是否有可用的字节然后fread()它们。 如果您使用的是linux,则可以使用select(2)等待文件描述符0的输入。
答案 1 :(得分:0)
您没有获取数据的可能原因
process_stuff_out_data
的标准输出,或者等到abc
和process_stuff_out_data
退出。process_stuff_out_data
写给stderr,而不是stdout。或者它正在写入控制台(呃),即/ dev / console。