Lire des lignes avec line feed avec binary reader

olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 - 4 avril 2008 à 14:15
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 - 5 avril 2008 à 11:27
Bonjour,

J'utilise un binary reader pour lire un fichier, ca marche tres bien pour les info de type binaire. Mais dans mon fichier, j'ai aussi des chaines terminées par line feed
Comment puis-je facilement les lire aussi ?

<!-- / message -->

6 réponses

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
4 avril 2008 à 18:22
Salut,
Tu mélanges du texte et du binaire dans un même fichier

<hr />
-My Blog-
0
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 6
4 avril 2008 à 18:51
Oui et alors ?

Dans une classique Table de DB que vas tu trouver tu crois ?

MAIS !!
J'ai trouvé le truc super et tout seul

Regarde
J'associe un streamreader au basestream de mon binaryreader

      BinaryReader binReader = new BinaryReader(File.Open("d:/ta/tmpbld/bel01/aa", FileMode.Open));
      StreamReader strReader = new StreamReader (binReader.BaseStream, Encoding.Default);

Je peux meme naviguer dans mon fichier

binReader.BaseStream.Position = 4096 + icp.posData + (xx.nbIdx*13);

Et lire du binaire ou du string !!

      icp.sCP = binReader.ReadBytes(5);
      icp.nbIdx = binReader.ReadInt32();
      icp.posData=binReader.ReadInt32();
      binReader.BaseStream.Position = 4096 + icp.posData + (xx.nbIdx*13);


      for (int i = 0; i < icp.nbIdx; i++)
      {
        Rue r = new Rue();
        r.Id = i;
        r.Nom = strReader.ReadLine();
        Rues.Add(r);
      }
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
4 avril 2008 à 19:08
Je dois t'avouer que j'ai un peu de peine à comprendre le mélanage binaire/text, mais soit.
En supposant que tu veuilles faire comme ça, je dirais que StreamReader est de trop :

Tu peux instancier ton BinaryReader avec un StreamReader, et ensuite faire ((StreamReader)myBinaryReader.BaseStream).ReadLine ou quelques choses dans ce genre...
Mais encore une fois, je ne suis pas tout à fait convaicu par ce mélange

<hr />
-My Blog-
0
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 6
4 avril 2008 à 19:21
Ok,

Ce que tu dis revient +/- a la meme chose, je ne sais pas si c'est plus lisible.

Mais je t'assure que la réalité des fichiers mixtes est beaucoup plus présente que tu ne le pense
Il n'y a pas une base de donnée qui n'exploite pas ce type de fichier

Mais généralement c'est ecrit en C qui digere ca tres facilement
Et je trouve que l'astuce que j'ai trouvé avec la possibilité de changer la position offre la meme souplesse
0

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

Posez votre question
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 6
4 avril 2008 à 21:51
Petit Bemol

Je viens de constater que comme dab les choses ne sont pas si simple

En fait tout va tres bien si la zone texte pour le streamreader se trouve apres la zone binaire du binaryreader
Mais je viens de faire l'expérience d'un vrai melange composite :
int
chaine1 \LF
int
chaine2 \LF
int
etc..

le premier int est bien lu par binaryreader.ReadInt32
le BaseStreamPosition est incrémenté de 4 : ok
la chaine 1 de 18 bytes + LF est bien lues par streamReader.ReadLine
le BaseStreamPosition est incrémenté de 1024 : AIE !
Le binaryreader.ReadInt32 me donne caca MEME si je change le BaseStreamPosition
Le streamreader me donne la euxieme chaine mais avec mon int devant

DONC : tout se passe comme si le StreamReader lisait un bloc en memoire et le gere tout seul en bousculant tout le monde sur son passage
J'investigue pour parvenir a controler ca !
0
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 6
5 avril 2008 à 11:27
Bon
il doit sans doute avoir moyen de combiner un streamreader et un binaryreader mais pour le moment j'ai pas eu le temps d'investiguer cette histoire de bufferisation

Donc je fais tout en binaryreader et ca m'a amené a convertir dans le fichier mes chaines terminéées par \LF en string prefixée par le fameux 7 bits lenght integer

pour ceux que ca intéresse, voici comment fabriquer et utiliser cet animal !

protected void Write7BitEncodedInt(int value) {
// Write out an int 7 bits at a time. The high bit of the byte,
// when on, tells reader to continue reading more bytes.
uint v = (uint) value; // support negative numbers
while (v >= 0x80) {
Write((byte) (v | 0x80));
v >>= 7;
}
Write((byte)v);
}


protected int Read7BitEncodedInt() {
// Read out an int 7 bits at a time. The high bit
// of the byte when on means to continue reading more bytes.
int count = 0;
int shift = 0;
byte b;
do {
b = ReadByte();
count |= (b & 0x7F) << shift;
shift += 7;
} while ((b & 0x80) != 0);
return count;
}




 
0
Rejoignez-nous