2009-08-25 2 views
0

У меня есть двоичный файл. Он состоит из 4 сообщений, каждый из которых имеет размер 100 байт. Я хочу снова прочитать последние 2 сообщения. Я использую объект BinaryReader. Я стремлюсь к psosition 200, а затем читаю: BinaryReaderObject.read (charBuffer, 0, 10000), , где charBuffer большой enougth. Я получаю все время, когда гора чтения всегда отсутствует 1. Вместо того, чтобы получать 200, я получаю 199. Вместо того, чтобы получать 400, я получаю 399. Я проверил и увидел, что размер файла правильный, и данные, которые я получаю начинается в нужном месте.чтение файла C# .NET

Thnaks,

ответ

0

Проблема заключалась в том, что я использовал обертку для объекта BinaryReader. При вызове метода Read есть некоторая функция наложения. Вместо os, используя знак char [], я использовал byte []. До сих пор он работал нормально, потому что использовался только utf-8, но теперь, когда я ввел настоящие двоичные данные в начале каждого сообщения, это вызвало проблему.

1

Подсказка: нуля индексы массива, и нулевые на основе позиции ... Первый байт начнется в положении нулевой.

+0

Справа. Я думал то же самое, но я думаю, что цифры в порядке (то есть первая запись начинается с 0 и идет до 99, вторая запись начинается со 100, идет до 199 и т. Д.). Поиск позиции 200 кажется правильным местом для начала 3-й записи. –

+0

Где у означает нулевое значение, в файле в том, что я читал? Как я уже сказал, я правильно получаю данные, и количество данных, которые я получаю, отсутствует. –

+1

Компьютеры подсчитываются с нуля. Первый элемент в массиве равен 0, второй - 1 и т. Д. Это называется массивом на основе нуля; потому что он начинается с нуля. Файлы обрабатываются как байт с нулевым основанием, поэтому позиция 200 является 201-м байтом с помощью «нормального» подсчета, объясняя ошибку «один за другим», с которой вы сталкиваетесь. –

1
  1. Ищите положение конца и печати. Это так, как ожидалось?
  2. Распечатать позицию после прочтения 199 - это так, как ожидалось?
  3. Попробуйте прочитать еще 1 байт с позиции после того, как вы получите 199 - вы получаете EOF?
  4. Как вы проверяете размер файла?
  5. Diff 199 байтов с ожидаемыми - что другое?

Две вещи, которые я бы проверить

  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. 

Таким образом, он работает должным образом.