2016-09-05 2 views
1

Я использую утилиту java (antlr) на cygwin, java - это версия Windows, и я запускаю javac/java из cygwin bash.чтение до EOF в java на cygwin на windows-10

Следующий код Java используется для работы на Cygwin на win8.1, чтобы прочитать ряд цифр от стандартного ввода до EOF (адаптировано из reading input till EOF in java):

import java.util.Scanner; 
public class Hello { 
    public static void main(String[] args) { 
     System.out.println("Hello, World"); 
     Scanner in = new Scanner(System.in); 
     int num; 
     while (in.hasNextInt()) { 
      num = in.nextInt(); 
      System.out.printf("%d\n",num); 
     } 
    } 
} 

Недавно я получил новый win10 ноутбук, установленный cygwin на нем, и он больше не работает. Когда я нажимаю Ctrl-D, программа продолжает ждать ввода, она не воспринимается как EOF.

После некоторой отладки (см. Комментарии в what is EOF in cygwin in windows 10), «stty -a» сообщает «eof =^D; susp =^Z», поэтому ожидается, что Ctrl-D будет рассматриваться как EOF. Следующий эквивалентный код в C++ работает так, как ожидалось, возможно потому, что этот код скомпилирован с самим cygwin и, следовательно, рассматривает^D как 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; 
    } 
} 

Так что что-то кажется сломанным в комбинации cygwin-win10. Любые намеки, на что можно сломать и как это исправить?

Примечание: Я использую Java JDK-7u72

При использовании Cygwin, я использую установку Java сам по себе окон. Ниже приводятся данные об использовании:

В cygwin: javac Hello.java; Java Привет

Затем дайте входы, с последующим^D в новой строке (т.е. сразу после ввода Return

В окнах:. Я также попытался запустить ту же программу в окнах, просто чтобы убедиться, является ли это проблема windows или cygwin, поэтому я также запускаю: javac Hello.java; java Hello

Затем введите входы, а затем^D (или^Z) в новой строке (т.е. сразу после ввода Return) И программа заканчивается правильно, когда я нажимаю^D или^Z.

+0

Как вы скомпилируете и запустите программу Java? Используете ли вы команду 'java' для ее запуска?Является ли команда 'java' исполняемой программой Cygwin? Что говорят 'type java' и' file $ (type -p Java) 'say? –

+0

Нет Cygwin Java. Итак, это взаимодействие с Windows Java с cywin – matzeri

+0

@Keith: см. Дополнительные примечания выше. Я использую установку java в самих окнах, включая CLASSPATH. «type java» дает «java hashed (/ cygdrive/c/sw/jdk7u72/bin/java)». Вторая команда дает: «/ cygdrive/c/sw/jdk7u72/bin/Java: PE32 + исполняемый (консольный) x86-64, для MS Windows» – R71

ответ

0

В не-Cygwin Windows программа, Ctrl-Z на входе запускает условие конца файла.

В программе Cygwin, в которой используется Cygwin DLL, Ctrl-D на входных триггерах и состоянии конца файла. (Это можно переконфигурировать с помощью команды stty, но вы этого не сделали.)

Не имеет значения, как выполняется программа. Это имеет значение только, как оно было построено.

Программа, которую вы запускаете, представляет собой команду java, которая является исполняемым файлом не Cygwin Windows. (Команда java запускает вашу программу Java.) Так как java - это не-Cygwin Windows-программа, она обрабатывает Ctrl-Z как символ конца файла.

Насколько я могу судить, все поведение, которое вы описываете, согласуется с этим.

Если вы хотите, чтобы Java-программы действовали как программы Cygwin, вам нужно будет использовать систему Java, созданную для использования Cygwin. Я не уверен, насколько это возможно, но это выходит за рамки этого вопроса, поэтому я оставлю это вам и поиск Google.

+0

Ваш четвертый пункт хранит ключ, так как java - это не-кингвинская программа Windows, она рассматривает ctrl-z как EOF. Однако cygwin настроен на обработку ctrl-z как suspend (как сообщал «stty -a»), возможно, это проблема. (Не знаю, как ctrl-z работал как EOF в моей предыдущей установке 8.1.) Могу ли я настроить это с помощью stty? Если да, то как? – R71

+0

Вы используете не Cygwin-программу из оболочки Cygwin. Я не знаю, перехватывает ли Cygwin Ctrl-Z (как приостановление), прежде чем он увидит программу Windows (как конец файла) или нет, и у меня нет системы Cygwin для ее проверки. Вы можете поэкспериментировать с помощью своей программы на С ++, скомпилированной компилятором не Cygwin. –

 Смежные вопросы

  • Нет связанных вопросов^_^