2009-08-25 11 views
0

私はバイナリファイルを持っています。これは4つのメッセージで構成され、それぞれのサイズは100バイトです。 最後の2つのメッセージをもう一度読んでみたいです。私はBinaryReaderオブジェクトを使用しています。 私は200の罰金を求め、次に私は次のように読みます:BinaryReaderObject.read(charBuffer、0、10000)、 ここで、charBufferは大きなenougthです。 私は読書のマウントが常に欠けている1つの時間を得る。200を得る代わりに私は199を得る。400を得る代わりに私は399を得る。 私はファイルのサイズが正しいことと私が得るデータを見た正しい場所から始まります。ファイルの読み込みC#.NET

Thnaks、

答えて

0

問題はBinaryReaderオブジェクトへのラッパーを使用していることでした。 Readメソッドを呼び出すときに、関数オーバーラップがあります。代わりにchar []の署名を使用して、私はバイト[]を使用しました。これまではutf-8しか使用されていなかったので問題なく動作しましたが、今は各メッセージの最初に実際のバイナリデータを入力したときに問題が発生しました。

1

ヒント:ゼロベースの配列インデックス、およびゼロベースの位置... 最初のバイトは位置0から始まります。

+0

右。私も同じことを考えていましたが、数字は大丈夫です(つまり、最初のレコードは0から99に、2番目のレコードは100で始まり、199に続きます...など)。 200位を目指すことは、第3の記録のスタートのための適切な場所のように思える。 –

+0

私が読んだファイルの中で、どこで0を基準にしていますか? 私が言ったように、データが正しく開始し、私が戻ってくるデータの量が足りませんonr –

+1

コンピュータはゼロから数えます。配列の最初の要素は0、2番目は1などです。これはゼロベースの配列と呼ばれます。それはゼロから始まるからです。ファイルは0から始まるバイトの配列として扱われます。したがって、位置200は、あなたが直面しているoff-by-oneエラーを説明する '通常の'カウントによって201番目のバイトです。 –

1
  1. 最後と印刷位置を探します。期待通りですか?
  2. 199を読んだ後に位置を印刷します - 期待通りですか?
  3. 199を取得した後、位置からさらに1バイトを読み取ろうとします.EOFを取得しますか?
  4. ファイルのサイズはどのように確認していますか?
  5. 予想されるものと199バイトの違い - 何が違うのですか?

2つのこと、私がチェックします

  1. CR/LFサイズは、あなたはそれが何を考えていることを
  2. を変換。
+1

"バイナリ"ファイルの場合、 'CR/LF'は違いはありません。しかし、文字列を使用していて、エンコーディングがサイズに影響を与える場合、あなたが何かになるかもしれないと私は思っています。 –

+0

ファイルはバイナリまたはテキストではありません。オープンして読む方法です。 –

+0

彼は、ファイルに追加された100バイトのレコードについて話しています。彼はそれをバイナリファイルと呼んだ。私は彼に言いました。すべてのファイルはバイナリ(アナログではなく)ですが、 "バイナリ"であるか "テキスト"であるかにかかわらず、データをどのようにデコードするかは読者の責任です。 –

5

このコードを試して、ファイルの状態を確認してください。

String message = @"Read {0} bytes into the buffer."; 

String fileName = @"TEST.DAT"; 

Int32 recordSize = 100; 

Byte[] buffer = new Byte[recordSize]; 

using (BinaryReader br = new BinaryReader(File.OpenRead(fileName))) 
{ 
    br.BaseStream.Seek(2 * recordSize, SeekOrigin.Begin); 

    Console.WriteLine(message, br.Read(buffer, 0, recordSize)); 
    Console.WriteLine(message, br.Read(buffer, 0, recordSize)); 
} 

Console.ReadLine(); 

400バイトのテストファイルで次の出力が得られます。

Read 100 bytes into the buffer. 
Read 100 bytes into the buffer. 

私は2 * recordSize + 1に求めるか、399バイトのファイルを使用している場合は、私は次の出力を取得します。

Read 100 bytes into the buffer. 
Read 99 bytes into the buffer. 

したがって、期待どおりに動作します。

関連する問題