2016-01-16 4 views
-2

Я работаю с файлами потоков, но произошла ошибка «из памяти». Кажется, я должен читать поток, байт за байт. Затем я загрузить файл с помощью этого метода:Delphi - как читать байк байта байта?

fs := TFileStream.Create("c:\a\a.avi", fmOpenRead or fmShareDenyWrite) ; 

Далее я сбросить позицию потока:

fs.positon:=0; 

Тогда я пытаюсь прочитать первые байты потока:

var 
oneByte:byte; 
begin 
fs.Read(oneByte,2); 

но не работает должным образом. Где моя ошибка?

+0

Байт по байту не будет намного лучше, чем чтение всего файла за один раз. Потребуется навсегда чтение байта байтом. Вам нужна средняя почва. Читайте куски большего размера. Несколько МБ за раз. –

+0

@DavidHeffernan AFAIK 'TFileStream' использует буферный доступ к файлу. Все еще чтение байта в байт может быть не самым подходящим вариантом, но это зависит от того, что должно быть сделано с данными чтения. –

+1

@Dalija Вы совершенно ошибаетесь. У него нет буфера. Каждый вызов Read - это вызов win32 ReadFile. Очень неэффективен. Следовательно, необходимость в таких вещах: http://stackoverflow.com/a/5639712/505088 –

ответ

5

размер Байт 1 не 2

fs.Read(oneByte, 1); 

Такие ошибки можно легко предотвратить с помощью функции

fs.Read(oneByte, SizeOf(oneByte)); 

SizeOf() На другой ноте, Read возвращает количество считанных байтов, чтобы указать, является ли или не все чтение было выполнено. Вы должны были бы проверить это возвращаемое значение для устранения ошибок.

Предпочитаемая идиома заключается в использовании ReadBuffer. Это вызовет Read и в случае возникновения ошибки вызовет исключение.

Как @David Хеффернан указал, что чтение байта потока файлов байтом не является наиболее эффективным способом. Взгляните на Buffered files (for faster disk access)

Смежные вопросы