添加scanf使Java中的processInputStream消失
我尝试在JavaOne中运行一个C程序,JavaOne应该得到我的C程序的添加scanf使Java中的processInputStream消失,java,c,io,pipe,Java,C,Io,Pipe,我尝试在JavaOne中运行一个C程序,JavaOne应该得到我的C程序的stdin/statdout。当我向C代码添加scanf时,C似乎看不到Java的输出 当我在C中只使用printfs并告诉Java使用readLine时,它就工作了。当我在C中添加Java write to process但尚未scanfs时,它也可以工作,只是C忽略了Java的输出。当我在printf之后添加scanf(我可以在printf sleep()之前进行,将几个printf()放入行中,等等)时,我再也看不到
stdin
/statdout
。当我向C代码添加scanf
时,C似乎看不到Java的输出
当我在C中只使用printf
s并告诉Java使用readLine
时,它就工作了。当我在C中添加Java write to process但尚未scanf
s时,它也可以工作,只是C忽略了Java的输出。当我在printf
之后添加scanf
(我可以在printf sleep()
之前进行,将几个printf()
放入行中,等等)时,我再也看不到printf()
在Java内部的效果,尽管它是先执行的
C中的fflush()
允许Java查看printf()
,但C仍然看不到Java的写入。还尝试了writer.flush()代码>和Java中的多次写入,但没有任何效果。并且还尝试通过ProcessBuilder运行该流程,没有任何区别
public static void main(String[] args) throws IOException, InterruptedException {
Process process = Runtime.getRuntime().exec("Project9.exe");
InputStream processInputStream = process.getInputStream();
OutputStream processOutputStream = process.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(processOutputStream));
BufferedReader reader = new BufferedReader(new InputStreamReader(processInputStream));
String val;
int n=0;
while(true){
while((val=reader.readLine())!=null){
System.out.println(val);
}
writer.write(n);
writer.newLine();
n++;
}
和C程序:
#include <stdlib.h>
#include <stdio.h>
int main() {
int n=0;
while (1) {
printf("test %d\n", n);
printf("test %d\n", n);
printf("test %d\n", n);
printf("test %d\n",n);
fflush(stdout); //(1)
scanf("%d", &n);
}
return;
}
#包括
#包括
int main(){
int n=0;
而(1){
printf(“测试%d\n”,n);
printf(“测试%d\n”,n);
printf(“测试%d\n”,n);
printf(“测试%d\n”,n);
fflush(stdout);/(1)
scanf(“%d”和“&n”);
}
返回;
}
注释了fflush
和scanf
后,程序正确地循环。使用scanf
但不使用fflush
即使是printf
s也不会出现在输出中,尽管它们是先执行的。使用fflush
我可以到达执行scanf()
的点,但是C程序似乎没有看到Java的输出,C程序停止在scanf()
上等待输入,而Java程序在readLine()
上等待输入。因此,当我通过fflush()
解决一个问题时,我不知道为什么人工输入的C在Java执行时工作正确而错误(我也不知道为什么只有Java执行时才需要fflush()
)
问题只是scanf()
似乎看不到Java的写入。在stdin
和stdout
上尝试setvbuf
,将第二个参数设置为\u IONBF
有助于消除对fflush()的需求,并解释为什么可能需要它,但似乎仍然无法与scanf()一起工作我的Java知识有些生疏,因此我不得不问,您是否检查过您的Java程序是否在((val=reader.readLine())!=null)
循环时离开,谢谢。它起作用了。删除while后,只需将其设置为打印即可。在stdin
和stdout
上尝试setvbuf
,将第二个参数设置为\u IONBF
有助于删除对fflush()的需要,并解释为什么可能需要它,但似乎对scanf()仍不起作用我的Java知识有些生疏,因此我不得不问,您是否检查过您的Java程序是否在((val=reader.readLine())!=null)
循环时离开,谢谢。它起作用了。在删除while并将其设置为“打印”后,它可以正常工作。