Quelques questions sur mon fichier à accès direct

daviddubois Messages postés 92 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 6 janvier 2012 - 8 juil. 2007 à 20:10
daviddubois Messages postés 92 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 6 janvier 2012 - 9 juil. 2007 à 19:05
Bonjour tout le monde,

J'ai un exercice qui consiste à remplir un fichier à accès direct avec 20 nombres aléatoires (de 1 à 10).

J'ai codé ce bout de code mais j'ai plusieurs problèmes :

import java.io.*;
public class Jean
{
 public static void main (String [] args)throws IOException
 {
  File f = new File("c:\\fichier.dat");
  RandomAccessFile raf = new RandomAccessFile(f,"rw");
  
  int tailleRec =4;
  long nbRec = raf.length()/tailleRec;
  System.out.println("raf.length vaut " + raf.length());
  System.out.println("la valeur de nbRec vaut " + nbRec);
  int nbreAleatoire;
  raf.seek(0);
  int nb;
  
  for (int i=0; i<nbRec;i++)
  {
   nbreAleatoire = (int) ((Math.random()*10)+1);
   raf.writeInt(nbreAleatoire);
  }
  
  raf.seek(0);
  
  for (long i=0; i<nbRec;i++)
  {
   nb = raf.readInt();
   System.out.println(nb);
  }
  
 
  
  //nbRec-=4;
  
  
  System.out.println(raf.length());
 }
}

Ce qui m'inquiête c'est que la longueur de raf vaut 87, je ne sais pas où il va chercher ce nombre.

Un entier (int) vaut 4 octets, j'ai 20 nombres, ça devrait être 80 ?

nbRec correspond au nombre d'enregistrement, je faisais raf.length/nbRec, ce qui devrait me donner 20 mais il me donne 21.

Voici le résultat de la console DOS quand j'exécute le code :

Merci d'avance pour votre aide.

raf.length vaut 87
la valeur de nbRec vaut 21
1
10
8
5
8
1
8
4
10
10
4
1
9
5
9
1
4
3
6
7
8
Press any key to continue...

10 réponses

cs_Kysic Messages postés 332 Date d'inscription mardi 12 juillet 2005 Statut Membre Dernière intervention 17 juillet 2010
8 juil. 2007 à 20:39
Salut,
en fait quand vous faites :
 raf.writeInt(nbreAleatoire);
c'est les caractères "ascii" des nombres qui sont inscrits dans le fichier et non pas leur valeur en bianire (ouvrer le avec un editeur de texte vous verrez).
la taille (en octets) correspond donc au nombre  total de chiffres écrit (le nombre 10 contient deux chiffres, il est écrit avec sur octets, l'un code le cartère 1, et l'autre le caractère 0).
Il faut en plus rajouter le codage des fins de lignes (deux caractères \r\n sous windows, un seul \n sous linux).
En gros je crois que ce n'est pas ce que vous chercher, je penses que ce que vous voulez savoir c'est le nombre de ligne contenu dans le fichier.
En fait même pas je crois que le code ne fait pas du tout ce que vous voulez.
0
cs_Kysic Messages postés 332 Date d'inscription mardi 12 juillet 2005 Statut Membre Dernière intervention 17 juillet 2010
8 juil. 2007 à 20:41
ok j'ai rien dit, je crois je me suis planter sur ce coup là désolés.
0
cs_Kysic Messages postés 332 Date d'inscription mardi 12 juillet 2005 Statut Membre Dernière intervention 17 juillet 2010
8 juil. 2007 à 20:42
essayez d'ouvrir le fichier avec un éditeur héxa pour voir ce qu'il contient.
http://kysicurl.free.fr/
0
cs_Kysic Messages postés 332 Date d'inscription mardi 12 juillet 2005 Statut Membre Dernière intervention 17 juillet 2010
8 juil. 2007 à 22:20
Bon j'ai tester, j'ai pas de problème chez moi, en créant un fichier avec la bonne taille au départ, ça marche bien:
raf.length vaut 40
la valeur de nbRec vaut 10
2
9
3
9
2
1
5
7
9
6
raf.length: 40
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
daviddubois Messages postés 92 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 6 janvier 2012
9 juil. 2007 à 08:26
Salut,

Merci pour votre dernier message.

Sauriez-vous me montrer votre code svp ?

Avez-vous fait comme moi ?

Je suis obligé d'utiliser ce que l'on a appris à l'école.

Merci encore.

David
0
cs_Kysic Messages postés 332 Date d'inscription mardi 12 juillet 2005 Statut Membre Dernière intervention 17 juillet 2010
9 juil. 2007 à 10:19
Re,
je l'ai fait avec votre code (en enlevant le c:\\ car je suis sous linux), mais essayez avec ce fichier dat:
http://dl.free.fr/bTr0FOHFn/fichier.dat

http://kysicurl.free.fr/
0
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 12
9 juil. 2007 à 10:35
en executant ton code j obtient bien le bon resultat 10 entier dans un fichier de 40 octets

par contre il te faut changer une ligne dans ton code :

long nbRec = raf.length()/tailleRec;
ecrire
long nbRec = 10;

car c est bien 10 enregistrement que tu veux ;o) et c est en changeant cette valeur que tu peux en faire varrier le nombre ;o)...
avec ton init à la premiere execution le fichier n existe pas et sera donc vide  nbRec=0 .... ;o) pas top ....

GodConan ;o)
0
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 12
9 juil. 2007 à 10:37
A vi ;o) je suis sous windows.. ;o) et j ai remplacer ;o) C par D ;o) dans le chemin absolut car java n avai pas les droit sur C ;o) hihi

GodConan ;o)
0
daviddubois Messages postés 92 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 6 janvier 2012
9 juil. 2007 à 19:03
Bonjour Kysic,

Merci pour votre réponse et votre fichier .dat

Je pense que vous avez raison, c'était bien le fichier .dat qui posait problème.

J'ai sans doute dû utiliser un fichier qui existait déjà et ça faussait donc les résultats.

Merci encore pour votre aide.
0
daviddubois Messages postés 92 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 6 janvier 2012
9 juil. 2007 à 19:05
Bonjour GodConan,

Merci pour ta réponse.

Tu confirmes certains doutes.

Merci encore.
0
Rejoignez-nous