Remplir un tableau à partir d'un fichier texte
Résolu/Fermé
guypaul2
Messages postés
23
Date d'inscription
samedi 9 mai 2015
Statut
Membre
Dernière intervention
20 mai 2015
-
9 mai 2015 à 20:23
guypaul2 Messages postés 23 Date d'inscription samedi 9 mai 2015 Statut Membre Dernière intervention 20 mai 2015 - 20 mai 2015 à 18:36
guypaul2 Messages postés 23 Date d'inscription samedi 9 mai 2015 Statut Membre Dernière intervention 20 mai 2015 - 20 mai 2015 à 18:36
A voir également:
- Remplir un tableau à partir d'un fichier texte
- Tableau croisé dynamique - Guide
- Comment ouvrir un fichier epub ? - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier rar - Guide
- Ouvrir un fichier .bin - Guide
2 réponses
greg6614
Messages postés
592
Date d'inscription
vendredi 7 août 2009
Statut
Membre
Dernière intervention
3 juin 2017
107
10 mai 2015 à 01:52
10 mai 2015 à 01:52
Salut, tu peux détailler un peu plus ton soucis ?
KX
Messages postés
16752
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 août 2024
3 019
15 mai 2015 à 05:03
15 mai 2015 à 05:03
"Je voudrais juste savoir comment avoir un tableau de int avec les binaires de mon fichier"
Ok, mais comment est organisé ton fichier ?
Est-ce que tu as un chiffre décimal (entre 0 et 9) écrit en binaire par ligne ou est-ce que c'est plusieurs chiffres qui se suivent ? Si tu as plus de 31 bits par ligne les int ne peuvent pas représenter ces valeurs (pas plus que les long si tu as plus de 63 bits par ligne), d'où les NumberFormatException...
Et que veux tu dans ton tableau ?
La valeur de chaque ligne dans une case ? Ou est-ce que dans une ligne du fichier il faut extraire plusieurs cases pour le tableau ? (voire, cumuler plusieurs lignes du fichier pour obtenir une seule case)
Un exemple serait le bienvenu : imaginons qu'au lieu d'avoir 3000 bits dans ton fichier tu n'en est que 100 (par exemple), quelles seraient les premières lignes de ton fichier et la valeur du tableau correspondant que tu voudrais ?
Ok, mais comment est organisé ton fichier ?
Est-ce que tu as un chiffre décimal (entre 0 et 9) écrit en binaire par ligne ou est-ce que c'est plusieurs chiffres qui se suivent ? Si tu as plus de 31 bits par ligne les int ne peuvent pas représenter ces valeurs (pas plus que les long si tu as plus de 63 bits par ligne), d'où les NumberFormatException...
Et que veux tu dans ton tableau ?
La valeur de chaque ligne dans une case ? Ou est-ce que dans une ligne du fichier il faut extraire plusieurs cases pour le tableau ? (voire, cumuler plusieurs lignes du fichier pour obtenir une seule case)
Un exemple serait le bienvenu : imaginons qu'au lieu d'avoir 3000 bits dans ton fichier tu n'en est que 100 (par exemple), quelles seraient les premières lignes de ton fichier et la valeur du tableau correspondant que tu voudrais ?
guypaul2
Messages postés
23
Date d'inscription
samedi 9 mai 2015
Statut
Membre
Dernière intervention
20 mai 2015
Modifié par KX le 15/05/2015 à 21:51
Modifié par KX le 15/05/2015 à 21:51
00100100 00111111 01101010 10001000 10000101 10100011 00001000 11010011
00010011 00011001 10001010 00101110 00000011 01110000 01110011 01000100
10100100 00001001 00111000 00100010 00101001 10011111 00110001 11010000
00001000 00101110 11111010 10011000 11101100 01001110 01101100 10001001
<256>
01000101 00101000 00100001 11100110 00111000 11010000 00010011 01110111
10111110 01010100 01100110 11001111 00110100 11101001 00001100 01101100
11000000 10101100 00101001 10110111 11001001 01111100 01010000 11011101
00111111 10000100 11010101 10110101 10110101 01000111 00001001 00010111
<512>
10010010 00010110 11010101 11011001 10001001 01111001 11111011 00011011
11010001 00110001 00001011 10100110 10011000 11011111 10110101 10101100
00101111 11111101 01110010 11011011 11010000 00011010 11011111 10110111
10111000 11100001 10101111 11101101 01101010 00100110 01111110 10010110
Voila ce que j'ai dans mon fichier. Notre professeur nous à conseillé de faire un tableau pour chaque décimale et pour chaque lettre du message à coder (cela reste un conseille) donc notre premiers tableau serait composé de 8 cases avec dedans 00100100 (pour pi ) et dans un autre tab 01000001 (par exemple si la première lettre du message est A). Ensuite nous devons additionner ces 2 tab pour obtenir la première lettre du message mais codé, puis il faut la décoder et faire cela pour toutes les lettres de notre message.
Je met ce que nous avons déjà (même si tout ne fonctionne pas )
Avec cela on transforme des mots en binaire (on n'obtient malheureusement pas 8 bytes pour chaque lettre et pour l'instant tout est dans un seul tableau)
int z =0; int r; void main() { String mot = readString("Entrez votre message"); int k = mot.length(); for (int i = 0; i < mot.length(); i ++) { int q = (int)mot.charAt(i); while (q > 0) { q = q /2; //tant que q>0 : q se divise par 2 r = q %2; z = z +1; //permet de remplir le tableau case par case (a chaque fois que while se fait) int [] tableau = new int[k *8]; tableau [ z ] = r; print(tableau[z]); // le rang z du tableau prend la valeur r a chaque while print(mot[z]); //affiche le tableau } } }
guypaul2
Messages postés
23
Date d'inscription
samedi 9 mai 2015
Statut
Membre
Dernière intervention
20 mai 2015
Modifié par KX le 15/05/2015 à 21:52
Modifié par KX le 15/05/2015 à 21:52
Ce programme permet d'additionner 2 tab (de les codés puis décoder) (ici encore nous n'avons que un grand tableau).
//permet de sauter des lignes en mettant print(""+newLine+""); String newLine = System.getProperty("line.separator"); void main() { //valeurs de pi int [] cle = new int[1000]; for (int i = 0; i < 1000; i = i +1) { cle [ i ] = random(0, 2); } // valeurs du message à coder int [] tab = new int[1000]; for (int i = 0; i < 1000; i = i +1) { tab [ i ] = random(0, 2); } //tableau du message codé int [] messagecrypte = new int [1000]; for (int i =0; i <1000; i = i +1) { messagecrypte [i] = cle[i] ^ tab[i]; } println("votre message codé est : "); for (int i = 0; i < 1000; i = i +1) { print(messagecrypte[i]); } print("" + newLine+""); //permet de mettre la réponse à la ligne boolean x = readBoolean("voulez vous le decoder? "); if (x) { //décodation du message for (int i = 0; i < 1000; i = i +1) { print(messagecrypte[i] ^ cle[i]); } } else { print("tant pis"); } }
guypaul2
Messages postés
23
Date d'inscription
samedi 9 mai 2015
Statut
Membre
Dernière intervention
20 mai 2015
15 mai 2015 à 16:25
15 mai 2015 à 16:25
Après la manière dont cela est fait importe peu tant que le programme n'est pas trop compliqué et qu'il respecte le cahier des chagres (passer un message en ascii puis binaire, additionner ce message (Xor) avec les décimales de pi en binaire issue d'un fichier test puis décoder ce message).
guypaul2
Messages postés
23
Date d'inscription
samedi 9 mai 2015
Statut
Membre
Dernière intervention
20 mai 2015
>
guypaul2
Messages postés
23
Date d'inscription
samedi 9 mai 2015
Statut
Membre
Dernière intervention
20 mai 2015
Modifié par KX le 15/05/2015 à 21:51
Modifié par KX le 15/05/2015 à 21:51
int z = 0, r; void main() { String mot = readString("Entrez votre message"); //On demande le mot println(mot); //On affiche le mot int k = mot.length(); //k est la longeur du mot. //on crée un tableu de byte d'une longeur 8 fois plus grande que le mot car un octet contient 8 bits. byte[] messagebinaire = new byte[k*8]; for (int i = 0; i < mot.length(); i ++) { int q = (int)mot.charAt(i); //q est le nombre correspondant à la lettre dans le code ASCII for(int j = 0; j < 8; j++) { if(q-Math.pow(2, 7-j) >= 0) { //Si lorsqu'on soustrait 2^(7-j) à q, q est >= 0 q -= Math.pow(2, 7-j); //Alors on diminue q de cette valeur messagebinaire[i*8 + j] = 1; //Et on rempli la case du tableau par 1. } else messagebinaire[i*8 + j] = 0; //Sinon par 0. print(messagebinaire[i*8 + j]); } print(" "); } }
je me suis trompé c'est ce code la qui permet de passer un message en binaire, il faudrait que j'ai pareille avec les binaires de pi.
KX
Messages postés
16752
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 août 2024
3 019
15 mai 2015 à 22:30
15 mai 2015 à 22:30
Pour la lecture de ton fichier, ce qui est un peu pénible ce sont les <256> <512> si le fichier avait été uniforme ça se serait bien passé, là il faut jongler un peu pour passer outre ces cas particuliers (NB. je n'ai pas testé sous Java's Cool)
Remarque : quelques écritures alternatives :
On peut même se passer de la variable loop, avec des labels (plus technique) :
Bref, dans tous les cas tu lis tes bits blocs par blocs et tu les rajoutes à la liste en passant par une conversion des BigInteger en base 2 vers les int.
Ton tableau devrait donc correspondre à ce que tu veux...
import java.io.File; import java.util.ArrayList; import java.util.Scanner; void main() throws Exception { ArrayList<Integer> list = new ArrayList<Integer>(); Scanner sc = new Scanner(new File("C:/pi.txt")); boolean loop = true; while (loop) { // lecture des bits while (sc.hasNextBigInteger(2)) list.add(sc.nextBigInteger(2).intValue()); // gestion des lignes sans bits while (!sc.hasNextBigInteger(2) && loop) { if (sc.hasNextLine()) println("Ignore ligne : "+sc.nextLine()); else loop = false; } } sc.close(); println(list); int[] tab = new int[list.size()]; for (int i=0; i<tab.length; i++) tab[i] = list.get(i); }
Remarque : quelques écritures alternatives :
boolean loop = true; while (loop) {Peut être remplacé par
for (boolean loop = true; loop; ) {Ce qui évite d'exposer la variable loop en dehors du scope de la boucle.
On peut même se passer de la variable loop, avec des labels (plus technique) :
x: while (true) // x est un label pour identifier la boucle { // lecture des bits while (sc.hasNextBigInteger(2)) list.add(sc.nextBigInteger(2).intValue()); // gestion des lignes sans bits while (!sc.hasNextBigInteger(2) && loop) { if (sc.hasNextLine()) println("Ignore ligne : "+sc.nextLine()); else break x; // arrête la boucle identifiée par le label x } }
Bref, dans tous les cas tu lis tes bits blocs par blocs et tu les rajoutes à la liste en passant par une conversion des BigInteger en base 2 vers les int.
Ton tableau devrait donc correspondre à ce que tu veux...
Modifié par KX le 14/05/2015 à 17:18
Je me demande si le probleme ne vient pas de la manière dont j'indique le chemin de mon fichier
voici se que j'ai deja trouvé (javascool m'indique une erreur à la ligne ou il y à bufferedreader):
Modifié par greg6614 le 10/05/2015 à 23:33
Si c'est le cas vu je passera plutôt par un ArrayList<Integer> pour avoir un taille dynamique.
Aprés à premiére vu ton code semble correct, seule question, pourquoi un des répertoires commence par un point ?
Et au passage les double simples slash (//) fonctionne aussi pour indiquer un chemin d'accés en java sous windows :)
EDIT: Autant pour moi j'avais pas bien lu ton code. Sauf erreur de ma part il ne faut pas passer par un FileReader pour ton fichier mais un FileInputReader qui appel ton fichier et que tu passes en paramétre dans un InputStreamReader
Voici un expemple simple :
Donc si on adapte pour toi il suffit de déclarer ton ArrayList<Integer> puis d'ajouter la ligne dans le while à chaque fois.
EDIT 2 : D'ailleurs en faisant ta méthode ton nombre binaire ne sera pas considéré comme tel mais comme un entier. Je ne connais pas la suite de ton programme mais autrement dit si ta décimale est 1000 en base 2 = 8 en base 10 mais ton programme l'interprétera comme un entier donc 1000 en base 10. En fonction de ce que tu veux faire il serait peut être plus référable pour toi de récupérer des Strings dans le tableau et de te faire une petite méthode de conversion String to Binary :)
11 mai 2015 à 19:04
Le point dans le dossier est normal (mon dossier s'appelle bien .travail ts ^^)
Cependant mon fichier texte comprend plusieurs nombres (en binaire) par ligne.
Mon programme à pour but de demander un message à l'utilisateur, ce message sera converti d'abord en ASCII puis en binaire (par exemple un A sera 01000001)
Nous devons additionner, avec un Xor, chaque nombre binaire de ce message avec les décimales de pi elles mêmes en binaire pour finalement avoir un message codé qui devra être décodé par la suite. (je t'explique cela car je ne suis pas sur d'avoir bien compris ton EDIT 2).
Je pense avoir compris ton programme bien qu'il y ai un problème avec le "public class ReadFile" (cela doit être un problème en rapport avec javascool car j'ai déjà eu ce problème avec d'autres programmes qui utilisaient aussi "public class ReadFile" ou n'importe quel "public ........"
Merci encore de ton aide qui nous avance fortement :)
11 mai 2015 à 21:06
public static void main(String[] args){
par void main (){
je ne sais pas si cela impact sur le programme (en javascool il n'y a qu'une seul class qui est void main).
Cependant quand j'exécute le programme il m'affiche cela : java.lang.NumberFormatException: For input string: ""
Cela viendrait du fait que le string soit "null" à un moment donné.
11 mai 2015 à 23:33
En java la méthode main est la méthode exécuté par convention lors du lancement du programme. Autrement dit tu peux copier le contenu de la méthode et la mettre dans ton code qui lui contient déjà une classe main (d'où les erreurs).
Pour ton message d'erreur, c'est qu'a un moment la méthode parseInt est appellée pour un String null ou valant "". Donc pas d'entier d'où l'exception qui est levé. Il faut que tu vérifies que ton fichier texte ne contient pas de ligne vide.