2016-04-30 10 views
5

Mam problem z odczytaniem ciągu i podwójnego z pliku txt. Oto mój plik txt:Należy odczytać ciąg i podwójne z pliku

Mike 300.50 
John 260 
Lisa 425.33 

A oto kod używam je czytać:

reader = new Scanner(); 
while(reader.hasNext()){ 
    name= reader.next(); 
    salary = reader.nextDouble(); 
    System.out.println(name + " " + salary + "\r\n"); 
} 

Ilekroć uruchomić ten kod, Exception in thread "main" java.util.InputMismatchException wydaje mi powiedzieć, że problem jest w nextDouble().

Czy ktoś wie, jak rozwiązać ten problem?

+0

'nextDouble()' opuszcza znak nowej linii, więc twoje drugie wywołanie 'next()' zużywa znak nowej linii, a następnie próbujesz parsować następne imię jako podwójne. Sugeruję przeczytanie całej linii naraz. –

+0

W ten sposób nie będę w stanie zapisać obu rzeczy w różnych atrybutach. Czy mogę? – Tom

Odpowiedz

0

można spróbować w ten sposób:

while(reader.hasNextLine()){ 
    String[] values = reader.nextLine().split("\\s+"); 
    name= values[0]; 
    salary = Double.valueOf(values[1]); 
    System.out.println(name + " " + salary + "\r\n"); 
} 
+0

Przepraszam, że przeszkadzam, ale co robią te linie? Dzięki. – Tom

+0

Chciałem poznać te linie: nazwa = wartości [0]; wynagrodzenie = Double.valueOf (wartości [1]); – Tom

+0

'' reader.nextLine(). Split ("\\ s +"); '' podzielił pojedynczą linię na raz za pomocą spacji i zapisał ją w tablicy String. Otrzymuję więc nazwę String przez '' values ​​[0] '' first element of array i '' Double.valueOf (values ​​[1]) '' parsing second element to double – mmuzahid

-1

można użyć java.io.StreamTokenizer czytać ciąg i podwójne. StreamTokenizer dzieli plik na tokeny o odpowiednim typie danych. i za pomocą niektórych stałych można zidentyfikować typ tokena. jak TT_NUMBER, TT_WORD

File f=new File("path of file"); 
StreamTokenizer st=new StreamTokenizer(new FileInputStream(file)); 
while(st.nextToken()!=StreamTokenizer.TT_EOF) //getting contents of file{ 
    switch(st.ttype) 
    { 
     case StreamTokenizer.TT_EOF: break; 
     case StreamTokenizer.TT_NUMBER://it will read number always in double data type 
      no=st.nval; 
     break; 
     case StreamTokenizer.TT_WORD: 
      name=st.nval; 
     break; 
    }} 
+0

Dlaczego zostało to odrzucone? – Basilevs

3
reader = new Scanner(); 
while(reader.hasNext()){ 
    name= reader.next();  
    salary = reader.nextDouble(); 
    System.out.println(name + " " + salary + "\r\n"); 
    reader.nextLine(); 
} 

Spróbuj tego. Co się dzieje, to że skaner czyta pustą linię po każdym podwójnym, więc nazwa będzie pustą linią, i będzie czytać (na przykład) Johna jako wynagrodzenie i da ci ten wyjątek. Więc dodałem tę małą linię kodu: reader.nextLine();, aby pominąć ten pusty wiersz. Mam nadzieję że to pomoże.

Powiązane problemy