gpt4 book ai didi

c++ - 使用 stdio 和 C++/Python 处理 EOF 问题

转载 作者:行者123 更新时间:2023-11-28 08:30:14 26 4
gpt4 key购买 nike

我在 python 进程和 C++ 程序之间的通信管道中遇到了 EOF 和 stdio 的一些问题。我不知道我做错了什么。当我在我的程序中看到 EOF 时,我清除了标准输入,并在下一轮尝试换行读取。问题是:出于某种原因,getline 函数立即(从第二次运行开始,第一次运行就按预期运行)返回一个 EOF,而不是等待来自 python 进程的新输入……有什么想法吗?

好的,这是代码:

#include <string>
#include <iostream>
#include <iomanip>
#include <limits>

using namespace std;

int main(int argc, char **argv) {
for (;;) {
string buf;
if (getline(cin,buf)) {
if (buf=="q") break;
/*****///do some stuff with input //my actual filter program
cout<<buf;
/*****/
} else {
if ((cin.rdstate() & istream::eofbit)!=0)cout<<"eofbit"<<endl;
if ((cin.rdstate() & istream::failbit)!=0)cout<<"failbit"<<endl;
if ((cin.rdstate() & istream::badbit)!=0)cout<<"badbit"<<endl;
if ((cin.rdstate() & istream::goodbit)!=0)cout<<"goodbit"<<endl;
cin.clear();
cin.ignore(numeric_limits<streamsize>::max());

//break;//I am not using break, because I
//want more input when the parent
//process puts data into stdin;
}
}

return 0;
}

在 python 中:

from subprocess import Popen, PIPE
import os
from time import sleep

proc=Popen(os.getcwd()+"/Pipingtest",stdout=PIPE,stdin=PIPE,stderr=PIPE);

while(1):
sleep(0.5)

print proc.communicate("1 1 1")
print "running"

最佳答案

python 中的

communicate 是一次性函数。它将给定的输入发送到进程,关闭输入流,并读取输出流,等待进程终止。

在“通信”之后,您无法使用相同的进程“重新启动”管道。

相反,在管道的另一边,当你读到EOF时,就没有更多的数据可以读了。任何读取尝试都会立即返回 EOF; python 关闭了管道。

如果你想继续与同一个管道进行通信,你需要使用子进程的 stdinstdout 成员,而不是 communicate (但要小心死锁的可能性)并使用流结束以外的其他东西来表示 C++ 端应该进行另一“批处理”处理。

关于c++ - 使用 stdio 和 C++/Python 处理 EOF 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2443701/

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