Java et System.in.read

Résolu/Fermé
keurdange Messages postés 720 Date d'inscription lundi 8 novembre 2010 Statut Membre Dernière intervention 13 juillet 2016 - Modifié par keurdange le 5/11/2011 à 15:39
keurdange Messages postés 720 Date d'inscription lundi 8 novembre 2010 Statut Membre Dernière intervention 13 juillet 2016 - 6 nov. 2011 à 00:01
Bonjour,

J'aimerais faire un programme qui demande la taille d'un tableau puis procède à la saisie des éléments de ce tableau avec System.in.read. Voici mon code:

import java.io.IOException;
public class exo1 {
public static void main (String args[]) throws IOException
{
int tab[];
System.out.println("Entrez la taille du tableau");
char m= (char) System.in.read();
int n = Character.digit(m, 10);
n=-n; //car tous les caractères que j'entre sont négatifs.
tab= new int [n];
for(int i=0; i<n;i++)
{
System.out.println("Entrez le nombre n° "+i+1);
char v= (char) System.in.read();
int n1= Character.digit(v, 10);
tab[i]=n1;
}
for(int i=0; i<n;i++)
{
System.out.println(tab[i]);
}
}

}


N.B: je sais le faire avec BufferedReader et Scanner. J'aimerais le faire avec System.in.read aussi.

Merci d'avance pour votre aide pécieuse.



Dieu n'a fait qu'ébaucher l'homme, c'est sur terre que chacun se crèe
A voir également:

2 réponses

keurdange Messages postés 720 Date d'inscription lundi 8 novembre 2010 Statut Membre Dernière intervention 13 juillet 2016 231
5 nov. 2011 à 15:50
ca renvoie toujours 1 lors de la conversion.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié par KX le 5/11/2011 à 15:52
Si tu sais utiliser Scanner il n'y a aucun intérêt à utiliser read() sur System.in.
Avec ton code tu t'obliges à avoir un seul caractère à chaque fois, c'est à dire que par exemple n sera uniquement compris entre 0 et 9, c'est très réducteur !
Le mieux serait de faire une boucle pour lire toute la ligne, c'est à dire while((m=System.in.read())!=-1).
De plus tu oublies de prendre en compte le '\n' qui est ajouté à System.in lorsque tu appuies sur la touche entrée... il ne faut pas oublier de le supprimer...La confiance n'exclut pas le contrôle
0
keurdange Messages postés 720 Date d'inscription lundi 8 novembre 2010 Statut Membre Dernière intervention 13 juillet 2016 231
5 nov. 2011 à 16:27
Ok, merci. Mais, c'est un exo qui nous oblige à utiliser System.in.read() pour faire le programme. En plus, le programme saute la première boucle for.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié par KX le 5/11/2011 à 16:47
Si n est un nombre négatif ça veut dire que tu entres m avec un signe '-' or puisque tu ne lis qu'un seul caractère à la fois ça veut dire que tu n'as lu que le caractère '-' et pas la suite. dans ce cas digit renvoie n=-1 que tu inverses en faisant n=-n; c'est pour ça que tu as toujours 1.
Mais la boucle for n'est pas sauté, c'est juste que n vaut 1, et qu'il reste en mémoire le reste de ce que tu as entré (par exemple -5, il reste le 5) donc ton v prend directement la valeur '5' et tu as tab[0]=5, la boucle s'arrete avant même de t'avoir demandé quoi que ce soit, et la deuxième boucle t'affichera 5.

En revanche si tu entres m sans signe '-', digit va bien fonctionner sauf qu'avec n=-n tu vas avoir n qui va être négatif au moment de rentrer dans la boucle, auquel cas ta condition i<n ne va jamais être vérifié et la boucle for sera fini avant même d'avoir commencé !
Dans cas la deuxième boucle ne devrait rien afficher non plus.
0
keurdange Messages postés 720 Date d'inscription lundi 8 novembre 2010 Statut Membre Dernière intervention 13 juillet 2016 231
5 nov. 2011 à 22:08
Ok. Alors comment faire pour lire le '-' et la suite?
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
5 nov. 2011 à 22:27
Comme je l'ai expliqué plus haut, tu dois prendre toute la ligne, c'est à dire faire une boucle while((m=System.in.read())!=-1) et construire ta ligne au fur et à mesure en ajoutant les caractères un à un (avec un StringBuilder par exemple)
Evidemment, en plus de lire le cas m==-1 il faut aussi traiter le cas fin de ligne, et c'est un peu plus compliqué, car selon le système d'exploitation on va lire \n (m=10), \r (m=13), ou les deux à la suite.

En fait il y aurait plus simple, ce serait d'utiliser read(byte[]), mais je ne sais pas si tu peux, au vu de tes contraintes scolaires ^^
0
keurdange Messages postés 720 Date d'inscription lundi 8 novembre 2010 Statut Membre Dernière intervention 13 juillet 2016 231
6 nov. 2011 à 00:01
Ok, cool alors. Je jeterais un coup d'oeil sur l'API pour voir le read(byte[]).
0