2

FileStreamを受信するStreamReaderを使用してファイルのコンテンツを読み取ろうとしています。ファイルの内部にはいくつかのスペースがあり(char 32)、StreamReaderはそれらを0(char 48)として読み取っています。スクリーンショットは、FileStreamバッファーとStreamReaderバッファーを示しています。どちらも値32ですが、Read()を呼び出すと、48が返されます。ここで何かが足りませんか?ちなみに、コードは.NETCompactFrameworkで実行されています。

代替テキストhttp://www.freeimagehosting.net/uploads/9f72b61bbe.png

データを読み取るコード:

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
   );
  }
 }
}

編集:エンコーディングの変更は機能しませんでした(Unicodeでもデフォルトでもありません)

編集:入力は次のようになります:

000636920000000532000404100100000001041000000001041000000001031000000000000000000000000000000000000000001730173017301730203020302030203021302130213021300027900267841515150000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280010000000280010000000280010000020
260007464616011007464816011009005321011009005621011010041621011010041821011013574026011013574226011014564729011014564929011018343318021018343618021020035418021020035618021022583818021022584018021005474302031005474502031010311305031010311505031011265308031011265508031011265508031011274108031021524009
0310215242090310060151130310063110130310160022210310160024210310022837280310022839280310                                                                                                                                                                                                                    
                                                                                                                                                                                                                                        00206377740002484841000029844400181529330003034081000000000000000000

問題は、3行目から4行目までのスペースで発生します。

4

2 に答える 2

5

あなたの問題はEncoding.ASCII。ファイルがこのようにエンコードされていることを確認しますか?私はあなたのファイルが実際にでエンコードされていると賭けますEncoding.Unicode、それがあなたがゼロに遭遇している理由です。

この場合、エンコーディングはUTF-8であると言うので、エンコーディングをに設定して、Encoding.UTF8何が起こるかを確認します。

于 2010-05-14T14:16:07.967 に答える
2

OK、ちょっとしたテストを実行しました。BaseStreamの再配置は、TextReaderでは機能しないため、自分が思っているのとは別の位置から読んでいるだけです(そして、[ウォッチ]ウィンドウでチェックしています)。

これを解決するには、プロパティごとに新しいStreamReaderを作成する必要があり、閉じないように注意してください(usingブロックは使用しないでください)。

しかし、私はそれを一度に読みに行き(それはすべてテキストですよね?)、文字列を操作します。

于 2010-05-14T14:48:18.760 に答える