2010-05-14 7 views
2

J'essaie de lire le contenu d'un fichier avec un StreamReader, qui reçoit un FileStream. Le fichier a quelques espaces à l'intérieur (char 32) et StreamReader les lit comme 0 (char 48). La capture d'écran montre le tampon FileStream et le tampon StreamReader. Les deux ont la valeur 32, mais quand j'appelle Read(), elle renvoie 48. Suis-je manquant quelque chose ici? En passant, le code fonctionne sous .NET Compact Framework.StreamReader retournant un autre caractère

alt text http://www.freeimagehosting.net/uploads/9f72b61bbe.png

Le code qui lit les données:

public void Read() { 
using (StreamReader reader = new StreamReader(InputStream, Encoding.UTF8)) { 
    foreach (var property in DataObject.EnumerateProperties()) { 
    OffsetInfo offset = property.GetTextOffset(); 
    reader.BaseStream.Position = offset.Start - 1; 
    StringBuilder builder = new StringBuilder(offset.Size); 
    int count = 0; 
    while (reader.Peek() >= 0 && count < offset.Size) { 
    char c = (char)reader.Read(); 
    if ((int)c != 32 && c != '\r' && c != '\n') { 
    builder.Append(c); 
    count++; 
    } else { 
    reader.BaseStream.Position++; 
    } 
    } 
    property.SetValue(DataObject, 
    Convert.ChangeType(builder.ToString(), property.PropertyType, CultureInfo.CurrentCulture), 
    null 
    ); 
    } 
} 
} 

EDIT: Modification du codage ne pas travaillé (ni Unicode, ni par défaut)

EDIT: Le l'entrée ressemble à ceci:

000636920000000532000404100100000001041000000001041000000001031000000000000000000000000000000000000000001730173017301730203020302030203021302130213021300027900267841515150000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280010000000280010000000280010000020 
11009005621011010041621011010041821011013574026011013574226011014564729011014564929011018343318021018343618021020035418021020035618021022583818021022584018021005474302031005474502031010311305031010311505031011265308031011265508031011265508031011274108031021524009 
0310215242090310060151130310063110130310160022210310160024210310022837280310022839280310                                                      
                                                             00206377740002484841000029844400181529330003034081000000000000000000 

Le problème se produit avec les espaces qui commencent dans la troisième ligne et va au quatrième.

Répondre

2

OK, je viens de faire un petit test. Le repositionnement de BaseStream ne fonctionne pas pour un TextReader, donc vous lisez simplement à partir d'une autre position que vous ne le pensez (et vérifiez dans la fenêtre Watch). Pour le résoudre, vous devrez créer un nouveau StreamReader pour chaque propriété, et faites attention à pas à pour le fermer (n'utilisez pas un bloc using).

Mais je voudrais aller à la lecture tout à la fois (c'est tout le texte, non?) Et opérer sur la chaîne (s).

+0

Bien que je n'ai pas utilisé votre solution, votre test m'a fait penser à appeler lecteur.DiscardBufferedData(), et cela a fait l'affaire. Merci! – Fernando

5

Je suppose que votre problème est le . Etes-vous certain que votre fichier est encodé de cette façon? Je parie que votre fichier est effectivement codé avec Encoding.Unicode, ce qui explique pourquoi vous rencontrez des zéros.

Dans ce cas, vous dites que votre encodage est UTF-8, réglez votre encodage sur Encoding.UTF8 et voyez ce qui se passe.

+0

Ou utilisez 'Encoding.Default' qui est le codage par défaut sur votre système Windows (pas la valeur par défaut pour' StreamReader' comme on pourrait facilement le penser ...) – awe

+0

Cela n'a pas fonctionné. Le fichier est UTF-8. Mais changer cela ne résout pas le problème. – Fernando

1

Je ne sais pas si c'est le problème principal, mais votre boucle de lecture semble défectueuse.

Essayez de changer à:

while (reader.Peek() >= 0 && count < offset.Size) 
    { 
     char c = (char)reader.Read(); 
     if (c != ' ' && c != '\r' && c != '\n') 
     { 
      builder.Append(c); 
      count++; 
     } 
     //else 
     //{ 
     // reader.BaseStream.Position++; 
     //} 
    } 

Et dans votre fenêtre Debugger Watch, j'utiliser reader.Peek() plutôt que reader.Read()

Et: Est-il possible qu'il y ait « 0 » à la suite de l'espace dans votre contribution?

+0

Belle prise Henk. – Doug

+0

Il ne frappe jamais les lignes que vous avez commentées, car c ne reçoit jamais '' (seulement 0). Et reader.Peek() renvoie également 48. – Fernando

+0

Voir ma dernière mise à jour. Tous les espaces dans les troisième et quatrième lignes deviennent 0 dans le StreamReader – Fernando

Questions connexes