J'essaie de lire un fichier contenant un dossier d'étudiant (prénom, nom et note). J'ai écrit un code simple pour accomplir cette tâche mais le code échoue après avoir lu deux lignes du fichier texte. Voici mon code:

public class Student {
private final  String first,last;
final int MAXGRADE = 100; 
final int LOWGRADE = 0; 
private final int grade;

public Student(String firstname,String lastname, int grade){
    this.first = firstname;
    this.last = lastname;
    this.grade = grade;

}
@Override
public String toString(){
    return first + " " + last + "\t" + grade;
}
}

Et le conducteur a ce code

public class driver {
public static void main(String[] args) throws FileNotFoundException {
   String first_name ,last_name;
    int grade;
    Scanner fileInput = new Scanner(new File("data1.txt"));
    while (fileInput.hasNextLine())
    {
        first_name = fileInput.next();
        last_name = fileInput.next();
        grade = fileInput.nextInt();

        Student st = new Student(first_name, last_name,grade);

      System.out.println(st);

    }
}
}

Le compilateur pointe vers ceci

grade = fileInput.nextInt();

Comme source de l'erreur.

0
user5723057 4 mai 2017 à 08:19

3 réponses

Meilleure réponse

Si vous utilisez Java 8 , la manière fonctionnelle de le faire serait:

String filePath = "C:/downloads/stud_records.txt"; // your file path
        /*
         * Gives you a list of all students form the file
         */
        List<Student> allStudentsFromFile = Files.lines(Paths.get(filePath)).map(line -> {
            String[] data = line.split("\\s+"); //Split on your delimiter
            Student stud = new Student(data[0], data[1], Integer.parseInt(data[2]));
            return stud;
        }).collect(Collectors.toList());

Remarque: j'ai émis l'hypothèse que ceci:

FirstName LastName Grade

Est le format du fichier d'entrée.

0
Shyam Baitmangalkar 4 mai 2017 à 06:17

Ce code fonctionne pour moi. Assure-toi

  1. L'emplacement du fichier texte correctement donné,
  2. Valeur entière donnée en 3ème position dans chaque ligne (comme: - steve smith 22)
1
AxelH 4 mai 2017 à 07:17

D'après le commentaire que vous publiez " @AxelH, chaque ligne représente un seul étudiant, prénom, nom et note" , nous pouvons voir le problème.

Votre boucle réelle pour lire une ligne

while (fileInput.hasNextLine())
{
    first_name = fileInput.next();
    last_name = fileInput.next();
    grade = fileInput.nextInt();

    Student st = new Student(first_name, last_name,grade);

  System.out.println(st);

}

Lit 3 lignes, une par fileInput.nextXXX();. Ce que vous devez faire est

  • Lire une ligne sous forme de String: `String line = fileInput.nextLine ();
  • Divisez cette ligne de base sur le délimiteur: `String [] data = line.split (" "); // Ou votre délimiteur sinon espace (attention à certains noms ...)
  • Définissez la valeur de ce tableau (l'analyse nécessite un entier)

ÉDITER :

J'ai fait une erreur car j'ai l'habitude d'utiliser nextline et non next, je ne peux pas supprimer la réponse car elle est acceptée donc je la mettrai à jour pour qu'elle soit plus correcte sans changer le contenu.

Le code est en effet correct, next prendra l'entrée suivante jusqu'au prochain délimiteur, \\p{}javaWhitespace}+, mais utiliser la solution donnée vous donnerait plus de solution pour gérer les noms composés comme cela pourrait être Katrina Del Rio 3 .

0
AxelH 4 mai 2017 à 07:17