2017-02-07 8 views
0
package addlinenumbers; 

import java.util.Scanner; 
import java.io.PrintWriter; 
import java.io.FileOutputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 

public class AddLineNumbers { 

    public static void main(String[] args) 
    { 
    Scanner input = new Scanner(System.in); 
    String sentinel = new String(); 
    int i=0; 
     try 
     { 
      FileOutputStream fos = new FileOutputStream 
        ("dataInput.txt", true); //true means we will be appending to dataInput.txt 

      PrintWriter pw = new PrintWriter (fos); 

      //write data to the file 
      while(!(sentinel.equals("-1"))) 
      { 
       System.out.println("Please enter strings to prepend to 'dataInput.txt'; -1 to EXIT: "); 
       pw.print(input.nextLine()); 
       i++; 
      } 
     } 

     catch (FileNotFoundException fnfe) 
     { 
      System.out.println("Unable to find dataInput.txt..."); 
     } 
     catch (IOException ioe) 
     { 
      ioe.printStackTrace(System.out); 
     } 
     finally 
     { 
       System.out.println("# of objects: " + i); 
       System.out.println("Closing file..."); 
       input.close(); 
     } 
    } 
} 

현재 내 출력은 끝없이 (해당 프로젝트 폴더에) 'dataInput.txt'에 문자열을 입력달라고 것이지만 그것은 것 적절한와 while 루프에서 종료하지 자바 문자열의 센티널. 내가 여기서 뭔가를 놓치고 있니? ==을 사용하고 있지 않습니다. "-1"은 루프 백을 제외한 아무것도하지 않습니다. 이면을 걷어 내고 텍스트 파일에 입력을 앞쪽으로 쓰고 파일을 닫습니다.Java while-loop에서 Sentinel이 작동하지 않습니다. 텍스트 파일에 기록하지의 PrintWriter

또한! 결과적으로 while 루프 입력에서 가져온 것이 없으며 'dataInput.txt'파일로 전송됩니다. 이유가 확실하지 않습니다.

도움이 될 것입니다.

EDIT : FYI와 마찬가지로, 나는 센티넬과 함께 while 루프를 사용해야합니다. 이 문제에 대해 저에게 많은 도움을 주신 모든 분들께 감사드립니다.

# 2

편집 : 계정 MadProgrammer의 훌륭한 조언으로 촬영, 내 출력에 남아있는 하나의 작은 문제가 남아있어 : 당신이 볼 수 있듯이

run: 
Please enter strings to prepend to 'dataInput.txt'; -1 to EXIT: 
David 
Goliath 
Please enter strings to prepend to 'dataInput.txt'; -1 to EXIT: 
Delilah 
Samson 
Please enter strings to prepend to 'dataInput.txt'; -1 to EXIT: 
-1 
# of objects prepended: 2 
Closing file... 
BUILD SUCCESSFUL (total time: 18 seconds) 

, 그것은 단지 두 물체에 걸리는 그들이 "골리앗 "및"Samson "이며 텍스트 파일에 기록 된 유일한 문자열입니다. 기술적으로 그것은 4 개의 객체를 가져야하며 "David"과 "Delilah"이어야합니다. 그러나 텍스트 파일에 포함되어야합니다.

도움을 주시면 감사하겠습니다. sentinel가 변경되지 않기 때문에

+2

루프에서'센티넬 '을 업데이트하지 않으므로 절대로 변경되지 않습니다. – MadProgrammer

+0

* "또한! 결과적으로 while 루프 입력에서 가져온 것이 없으며 'dataInput.txt'파일로 전송됩니다. 이유는 확실하지 않습니다. "* 아마도 증기가 닫히지 않기 때문일 것입니다. – MadProgrammer

+0

[try-with-resources] (https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html)를보십시오.), 당신의 삶을 편하게 해줄 것입니다 – MadProgrammer

답변

1

while(!(sentinel.equals("-1")))은 개념적으로, 당신은 사용자의 입력을 읽고 그것으로, 당신은이 값을 사용하는 것이 무엇인지를 결정해야 항상 ""

의, false (루프 조건)이 될 수 없다 당신은 루프 그래서

을 종료해야하는지 결정하기 위해,이 ... 참고로

Scanner input = new Scanner(System.in); 
int i = 0; 
try (FileOutputStream fos = new FileOutputStream("dataInput.txt", true)) { 
    try (PrintWriter pw = new PrintWriter(fos)) { 
     String userInput = ""; 
     do { 
      userInput = input.nextLine(); 
      if (!userInput.equals("-1")) { 
       pw.print(input.nextLine()); 
       i++; 
      } 
     } while (!userInput.equals("-1")); 
    } 
} catch (FileNotFoundException fnfe) { 
    System.out.println("Unable to find dataInput.txt..."); 
} catch (IOException ioe) { 
    ioe.printStackTrace(System.out); 
} finally { 
    System.out.println("# of objects: " + i); 
} 

당신이 무엇을 할 수 있는지의 "정말 빠른"예 (테스트하지)이다 : input.close(); 그것은 좋은 생각이 결코 표준 입력을 닫는 것, "파일을"폐쇄되지

NB : 배합 try-with 블록은 과잉, 당신은 그것을 모든 걸 포기하고 포장하는 하나의 문을 사용할 수 있지만 내가 원 비슷한 코드 구조에 대한 개념을 보여주기 위해

+0

나는 두 번째 try 블록 안에 뭔가있는 것처럼 출력이 한 줄에 두 줄을 받아 들일 때 - 대신 한 줄을 쓰고 두 번째 줄만 텍스트 파일에 붙이는 것으로 생각한다. . 첫 번째 빈 줄을 제거하는 방법을 찾으려고합니다. 아무것도 입력하지 않고 Enter 키를 누르면 아무 것도하지 않고 다음 줄로 가서 줄 정보로 가져옵니다. – SarahSanchez

+0

첫 번째 nextLine을 next로 변경하면 순차적으로 입력하게되지만 정보는 텍스트 파일에 쓰지 않습니다. – SarahSanchez

+0

테스트 결과에 따르면 정상적으로 작동합니다. 흰 공간에서 '다음'이 깨지다는 사실을 이해하십시오. 또한'pw.println' 사용을 고려할 것입니다. – MadProgrammer