Java C printf无法从终端正常工作
我已经尽可能地将问题简化为以下最小的代码片段。如果需要更多信息,请询问 假设我有一个名为a的Java类,其主要方法如下:Java C printf无法从终端正常工作,java,c++,c,command-line,terminal,Java,C++,C,Command Line,Terminal,我已经尽可能地将问题简化为以下最小的代码片段。如果需要更多信息,请询问 假设我有一个名为a的Java类,其主要方法如下: public static void main (String args[])throws Exception{ Process p = new ProcessBuilder(args).redirectErrorStream(true).start(); Scanner in = new Scanner(new InputStreamReader(p.get
public static void main (String args[])throws Exception{
Process p = new ProcessBuilder(args).redirectErrorStream(true).start();
Scanner in = new Scanner(new InputStreamReader(p.getInputStream()));
System.out.println(in.nextLine());
}
基本上,它从终端运行一个程序,从该程序中读入一行,并进行响应。很简单
现在我有第二个C++程序,像这样:
int main()
{
string s;
cout << "example2 in c++"<<endl;;
cin >> s;
return 0;
}
int main()
{
printf("example1 in c\n");
return 0;
}
程序按预期运行,输出从cpp程序发送的字符串并终止
我有一个c语言的等效程序:
int main()
{
char s[10];
printf("example1 in c\n");
fgets(s,10,stdin);
return 0;
}
当我调用:
java A pathToC++Program
java A pathToCprogram
程序停止,没有打印任何内容
当我从c程序中删除fgets行时,它如下所示:
int main()
{
string s;
cout << "example2 in c++"<<endl;;
cin >> s;
return 0;
}
int main()
{
printf("example1 in c\n");
return 0;
}
然后,Java程序能够识别该行并将其打印出来。因此,fgets似乎是一条有问题的线路,但当fgets被包括在内时,甚至之前的线路也不起作用
这是怎么回事
(我不知道这是java还是C++的特性,所以我把两个标签都包括进去了)
传递<代码>:STD::EntL//C> > <代码> STD::CUT/<代码>将刷新输出缓冲区。要在C中刷新输出缓冲区,应该添加
fflush(stdout)默认情况下,printf
行后的code>。写入stdout
(这是printf
将写入其输出的地方)是缓冲行,这意味着缓冲区将在换行时刷新
但是这是直接从终端运行时的默认设置。如果输出不是终端,则stdout
将被完全缓冲,这意味着只有在填充缓冲区时才会刷新。或者到显式的fflush(stdout)
调用
<>在C++程序中,你可以通过使用<代码> STD::EntL< /Cube >(输出一个换行并刷新缓冲输出)来显式刷新输出。在C程序中,输出缓冲区没有这种刷新
这确实是非常特定于平台的,但对于POSIX平台(如Linux或macOS),它与上面描述的一样。我认为这与Windows非常相似
至于为什么删除fgets
语句时它会起作用,可能是因为fgets
将阻止执行,直到文件结束或读取了某些(换行终止的)输入。如果没有fgets
,程序将在printf
之后立即退出,这将导致stdout
缓冲区被刷新。您调用fgets
的意图是什么?您没有对已读入的字符串执行任何操作。执行的是gets works而不是FGET。我知道我们不应该使用gets,但我想确保缓冲区在这里不起作用either@AshraffAliWahab:永远不要使用获取!自7年以来,它就不是标准库的一部分,20多年来,即使是思维迟钝的人也不赞成它。它也无法改变输入方面的行为,因为它在引擎盖下使用与fgets
相同的机制,只是不安全。再次重申:这不是“你不应该使用它”,而是“你不应该使用它”。忘了它曾经存在过。谢谢。我已经在我的评论中提到过。如果格式字符串中存在换行符(\n
),输出将被刷新。输出缓冲与fgets
)有什么关系?@user1810087有问题的代码是用C编写的,网站上有很多问题都提到了与换行符刷新相关的问题。啊,谢谢我感觉缓冲区没有被冲走,但我不明白为什么newline没有这么做。是的,我使用的是windows,你也被纠正了,即使你没有使用std::endl
(或者std::flush
,或者std::cout.flush()
),默认情况下,std::cin
和std::cout
是绑定在一起的,所以调用std::cin>>…
会自动刷新std::cout
,如果它还没有刷新的话