2016-11-07 3 views
0

Ich versuche, ein Java-Programm zu schreiben, in dem der Benutzer angibt, wie viele "Studenten Aufzeichnungen" sie möchten, gefolgt von dem Namen des Schülers, Alter und GPA eingeben wird dann als Text gespeichert. Jedoch habe ich ein Problem mit meinem Text, der nicht alle eingegebenen Daten und eine mysteriöse neue Zeile enthält, die ich nicht loswerden kann. Hier ist mein Programm:FileWriter nicht alle Eingabe und mysteriöse baumelnde Newline Ausgabe

import java.io.*; 
import java.util.Scanner; 

public class CreateFile { 
    public static void main(String[] args) throws IOException { 
     Scanner input = new Scanner(System.in); 
     FileWriter fwriter = new FileWriter("c:\\Students.dat"); 
     PrintWriter StudentFile = new PrintWriter(fwriter); 
     String name = " "; 
     String next = " "; 
     int age = 0; 
     int hm = 0; 
     double gpa = 0.0; 
     System.out.print("How many student records would you like to enter: "); 
     hm = input.nextInt(); 
     for (int x = 1; x <= hm; x++) { 
      System.out.print("Enter Name: "); 
      name = input.nextLine(); 
      input.nextLine(); 
      System.out.print("Enter Age: "); 
      age = input.nextInt(); 
      System.out.print("Enter GPA: "); 
      gpa = input.nextDouble(); 
      next = input.nextLine(); 
      StudentFile.println(name); 
      StudentFile.println(age); 
      StudentFile.println(gpa); 
     } 
     StudentFile.close(); 
     System.exit(0); 
    } 
} 

Hier wird die Probe Eingangs- und Ausgangs meine Probleme zu veranschaulichen:

run: 
How many student records would you like to enter: 3 
Enter Name: Jon 
Enter Age: 20 
Enter GPA: 3.4 
Enter Name: Bill 

Enter Age: 24 
Enter GPA: 3.6 
Enter Name: Ted 

Enter Age: 34 
Enter GPA: 3.9 

This is the produced text file: 
20 
3.4 
Bill 
24 
3.6 
Ted 
34 
3.9 

Warum es den Vornamen nicht speichern eingegeben? Warum gibt es im ersten Eintrag keine neue Zeile, aber in den anderen?

for (int x = 1; x <= hm; x++) 
{ 
    System.out.print("Enter Name: "); 
    name = input.next(); 
    input.nextLine(); 
    System.out.print("Enter Age: "); 
    age = input.nextInt(); 
    input.nextLine(); 
    System.out.print("Enter GPA: "); 
    gpa = input.nextDouble(); 
    next = input.nextLine(); 
    StudentFile.println(name); 
    StudentFile.println(age); 
    StudentFile.println(gpa); 
} 

Einige Dinge, die Sie betrachten wünschen können:

Antwort

1

Dies ist die for-Schleife korrigiert

  • Griff der IOException - es sollte nicht außer Acht gelassen werden !!
  • Verwenden Sie die Methoden hasNextXXX() der Scanner, um zu überprüfen, ob etwas verfügbar ist.
  • Refactor Ihre Verwendung der Variablen next, es wird nie wirklich verwendet.
  • Es ist nicht notwendig, System.exit(0) von der Hauptmethode aufzurufen - verwenden Sie lieber die return-Anweisung mit einem aussagekräftigen Wert.
+0

Thank you! Würdest du mir bitte erklären, warum das funktioniert und warum meins nicht? Warum verwenden Sie name = input.next(); anstelle von input.nextLine() ;? –

+0

Mit 'nextLine()' nach dem "Enter Name:" ging es zweimal zur nächsten Zeile. Aber eigentlich möchten Sie nur die nächste Zeichenfolge haben, deshalb müssen Sie 'next()' aufrufen. Danach können Sie jede weitere Eingabe überspringen und in die nächste Zeile fortfahren, die ganze Zahl lesen und so weiter. –

+0

@MarkusL Sie sollten den 'Scanner' nicht schließen, da er auch 'System.in' schließt, was ** Sie ** nicht zugewiesen hat, sondern die JVM. Sie sollten stattdessen eine '@SuppressWarnings (" Ressource ")' hinzufügen. Ich habe diesen Fehler auch gemacht, weil der Java-Compiler Sie warnt, aber nicht wie erwähnt auf den 'Scanner'. – thatguy

1

Das Problem ist, dass Sie nextLine() verwenden, wenn Sie next() verwendet werden müssen. Ich gehe davon aus, dass Sie die zweite input.nextLine() dort einbringen, weil Sie zunächst ein Problem hatten, wo es "Name eingeben:" ausdrucken und dann sofort "Alter eingeben:". nextLine() sagt Ihrem Programm, dass es alles überspringen soll, was da ist, und nicht darauf warten soll. Der Grund, dass dieses Paradigma überhaupt für irgendeinen Ihrer Einträge funktioniert, ist, dass Sie next = input.nextLine() am Ende Ihrer Schleife setzen. Hier ist ein fix:

package createfile; 
import java.io.*; 
import java.util.Scanner; 
public class CreateFile { 
    public static void main(String[] args) throws IOException { 
     Scanner input = new Scanner(System.in); 
     FileWriter fwriter = new FileWriter("c:Students.dat"); 
     PrintWriter StudentFile = new PrintWriter(fwriter); 
     String name = " "; 
     String next = " "; 
     int age = 0; 
     int hm = 0; 
     double gpa = 0.0; 
     System.out.print("How many student records would you like to enter: "); 
     hm = input.nextInt(); 
     for (int x = 1; x <= hm; x++) { 
      System.out.print("Enter Name: "); 
      name = input.next(); 
      System.out.print("Enter Age: "); 
      age = input.nextInt(); 
      System.out.print("Enter GPA: "); 
      gpa = input.nextDouble(); 
      StudentFile.println(name); 
      StudentFile.println(age); 
      StudentFile.println(gpa); 
     } 
     StudentFile.close(); 
     System.exit(0); 
    } 
} 

Sie könnten auch nur Ihre input.nextLine() oben name=input.nextLine() bewegen, und es würde die gleiche Wirkung haben.

1

Die anderen Beispiele funktionieren nur, wenn Sie keine Namen wie "James Peter" haben - in ihren Codebeispielen wäre nur James als Name gespeichert.

Ich würde dies bevorzugen:

System.out.print("How many student records would you like to enter: "); 
    hm = input.nextInt(); 
    input.nextLine(); 
    for (int x = 1; x <= hm; x++) { 
     System.out.print("Enter Name: "); 
     name = input.nextLine(); 
     System.out.print("Enter Age: "); 
     age = input.nextInt(); 
     input.nextLine(); 
     System.out.print("Enter GPA: "); 
     gpa = input.nextDouble(); 
     input.nextLine(); 
     StudentFile.println(name); 
     StudentFile.println(age); 
     StudentFile.println(gpa); 
    } 
+0

Wie funktioniert das?Ich habe versucht, einen Vor- und Nachnamen einzugeben, aber er hat sie nicht gespeichert. –

+0

Können Sie Ihren Ein- und Ausgabe- und Dateieingang im Detail drucken? Ich lief das oben gezeigte Programm und alles funktionierte so, wie ich es erwartet hatte. –