web-dev-qa-db-fra.com

Java: Lecture des entiers d'un fichier dans un tableau

File fil = new File("Tall.txt");
FileReader inputFil = new FileReader(fil);
BufferedReader in = new BufferedReader(inputFil);

int [] tall = new int [100];

String s =in.readLine();

while(s!=null)
{
    int i = 0;
    tall[i] = Integer.parseInt(s); //this is line 19
    System.out.println(tall[i]);
    s = in.readLine();
}

in.close();

J'essaie d'utiliser le fichier "Tall.txt" pour écrire les entiers contenus dans le tableau nommé "tall". Il le fait dans une certaine mesure, mais lorsque je l’exécute, il lève l’exception suivante (:

Exception in thread "main" Java.lang.NumberFormatException: For input string: ""
    at Java.lang.NumberFormatException.forInputString(Unknown Source)
    at Java.lang.Integer.parseInt(Unknown Source)
    at Java.lang.Integer.parseInt(Unknown Source)
    at BinarySok.main(BinarySok.Java:19)

Pourquoi exactement fait-il cela et comment puis-je l'enlever? Comme je le vois, je lis le fichier sous forme de chaînes, puis le convertis en ints, ce qui n’est pas illégal.

13
Northener

Vous voudrez peut-être faire quelque chose comme ça (si vous utilisez Java 5 et plus)

Scanner scanner = new Scanner(new File("tall.txt"));
int [] tall = new int [100];
int i = 0;
while(scanner.hasNextInt()){
   tall[i++] = scanner.nextInt();
}
42
Julien Grenier

Vous devez avoir une ligne vide dans votre fichier.

Vous voudrez peut-être envelopper vos appels parseInt dans un bloc "try":

try {
  tall[i++] = Integer.parseInt(s);
}
catch (NumberFormatException ex) {
  continue;
}

Ou tout simplement vérifier les chaînes vides avant d'analyser:

if (s.length() == 0) 
  continue;

Notez qu'en initialisant votre variable d'indexation i dans la boucle, elle est toujours égale à 0. Vous devez déplacer la déclaration avant la boucle while. (Ou faites-en une partie d'une boucle for.)

9
erickson

Pour comparaison, voici une autre façon de lire le fichier. Il y a un avantage que vous n'avez pas besoin de savoir combien il y a d'entiers dans le fichier.

File file = new File("Tall.txt");
byte[] bytes = new byte[(int) file.length()];
FileInputStream fis = new FileInputStream(file);
fis.read(bytes);
fis.close();
String[] valueStr = new String(bytes).trim().split("\\s+");
int[] tall = new int[valueStr.length];
for (int i = 0; i < valueStr.length; i++) 
    tall[i] = Integer.parseInt(valueStr[i]);
System.out.println(Arrays.asList(tall));
3
Peter Lawrey

Il semble que Java tente de convertir une chaîne vide en nombre. Avez-vous une ligne vide à la fin de la série de nombres?

Vous pourriez probablement corriger le code comme ceci

String s = in.readLine();
int i = 0;

while (s != null) {
    // Skip empty lines.
    s = s.trim();
    if (s.length() == 0) {
        continue;
    }

    tall[i] = Integer.parseInt(s); // This is line 19.
    System.out.println(tall[i]);
    s = in.readLine();
    i++;
}

in.close();
2
Jan Aagaard

Vous pourriez avoir des confusions entre les différentes fins de ligne. Un fichier Windows se terminera par un retour à la ligne et un saut de ligne. Certains programmes sous Unix liront ce fichier comme s’il disposait d’une ligne vierge supplémentaire entre chaque ligne, car le retour chariot serait considéré comme une fin de ligne, puis le saut de ligne comme une autre extrémité.

1
Paul Tomblin
File file = new File("E:/Responsibility.txt");  
    Scanner scanner = new Scanner(file);
    List<Integer> integers = new ArrayList<>();
    while (scanner.hasNext()) {
        if (scanner.hasNextInt()) {
            integers.add(scanner.nextInt());
        } else {
            scanner.next();
        }
    }
    System.out.println(integers);
0
Ban