Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在windows-10上的cygwin上读取java中的EOF_Java_Cygwin - Fatal编程技术网

在windows-10上的cygwin上读取java中的EOF

在windows-10上的cygwin上读取java中的EOF,java,cygwin,Java,Cygwin,我在cygwin上使用java实用程序(antlr),java是windows版本,我从cygwin bash运行javac/java 以下java代码用于在win8.1上处理cygwin,从stdin到EOF(改编自)读取一系列数字: 最近,我买了一台新的win10笔记本电脑,在上面安装了cygwin,它不再工作了。当我按下Ctrl-D时,程序继续等待输入,它不会被视为EOF 经过一些调试(请参见中的注释),“stty-a”报告“eof=^D;susp=^Z”,因此Ctrl-D应被视为eof。

我在cygwin上使用java实用程序(antlr),java是windows版本,我从cygwin bash运行javac/java

以下java代码用于在win8.1上处理cygwin,从stdin到EOF(改编自)读取一系列数字:

最近,我买了一台新的win10笔记本电脑,在上面安装了cygwin,它不再工作了。当我按下Ctrl-D时,程序继续等待输入,它不会被视为EOF

经过一些调试(请参见中的注释),“stty-a”报告“eof=^D;susp=^Z”,因此Ctrl-D应被视为eof。C++中的下面的等效代码如预期的那样工作,可能是因为该代码是用CygWin本身编译的,因此把^作为EOF。
#include <stdio.h>
int main() {
    int i=0, status;
    for(;;) {
      printf("Enter a value %d:\n", i);
      status = scanf("%d", &i);
      if(status!=1) break;
    }
}
#包括
int main(){
int i=0,状态;
对于(;;){
printf(“输入值%d:\n”,i);
状态=扫描频率(“%d”、&i);
如果(状态!=1)中断;
}
}
因此,在cygwin-win10的组合中似乎出现了一些问题。有什么提示,关于什么可能被破坏以及如何修复它吗

注意:我使用的是JavaJDK-7u72

在使用cygwin时,我使用windows本身的java安装。以下是用法:

在cygwin中:javac Hello.java;java你好

然后在新的一行中输入^D(即输入Return后立即输入)

在windows中:我还尝试在windows中运行相同的程序,只是为了确定这是windows问题还是cygwin问题


然后在新的一行中输入^D(或^Z)(即输入Return后立即输入)。当我在Windows程序中按^D或^Z时,程序将正确终止。

在非Cygwin程序中,输入时按Ctrl-Z将触发文件结束条件

在Cygwin程序中,使用Cygwin DLL、输入触发器上的Ctrl-D和文件结束条件的程序。(这可以用
stty
命令重新配置,但您还没有这样做。)

程序如何执行并不重要,重要的是它是如何构建的

您正在运行的程序是
java
命令,这是一个非Cygwin Windows可执行文件。
java
命令正好运行您的java程序。
java
是一个非Cygwin Windows程序,它将Ctrl-Z视为文件结尾字符

据我所知,你描述的所有行为都与此相符


如果你想让Java程序像Cygwin程序一样运行,你必须使用一个为Cygwin而构建的Java系统。我不确定这是否可行,但这超出了这个问题的范围,所以我将把这留给你和谷歌搜索。

你如何编译和运行Java程序?你是否使用
Java
命令来运行它?是
java
命令一个Cygwin可执行文件?那么
type java
file$(type-p java)
会说什么?没有Cygwin java。因此它是一个Windows java与cywin@Keith:请参阅上面的附加说明,我正在windows中使用java安装,包括它的类路径(/cygdrive/c/sw/jdk7u72/bin/java)”,第二个命令给出:“/cygdrive/c/sw/jdk7u72/bin/java:PE32+可执行(控制台)x86-64,用于MS Windows”@matzeri:是的,这是一个windows java与cygwin的交互。但是在windows中,它工作得很好,正如我前面提到的。但在cygwin中不工作。你能更新这个问题以明确你在做什么和发生什么吗?事实上,你在windows中使用java安装本身需要成为问题的一部分。在gwin部分,请说明键入Ctrl-D后会发生什么。在windows部分中,您会说“^D(或^Z)”;这两者是否都会导致程序终止?您的第四段掌握着关键点,因为java是非cygwin windows程序,它将Ctrl-Z视为EOF。但是,cygwin被配置为将Ctrl-Z视为挂起(正如“stty-a”所报告的),所以这可能就是问题所在。(不确定在我之前的8.1安装中ctrl-z是如何作为EOF工作的。)我可以使用stty配置它吗?如果是,如何配置?您正在从Cygwin shell运行一个非Cygwin程序。我不知道Cygwin是否在Windows程序看到ctrl-z(作为挂起)之前拦截它(作为文件结尾)或者没有,我没有CygWin系统来测试它。你可以用非CygWin编译器编译的C++程序来进行实验。
#include <stdio.h>
int main() {
    int i=0, status;
    for(;;) {
      printf("Enter a value %d:\n", i);
      status = scanf("%d", &i);
      if(status!=1) break;
    }
}