![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Требуется открыть бинарный файл и заполнить массив переменных типа word. Вот мой код:
Код:
var
OpenDialog :TOpenDialog;
kt:Cardinal;
filehandle: THandle;
file_inf: TOFStruct;
buf: array of word;
begin
openDialog := TOpenDialog.Create(self);
openDialog := TOpenDialog.Create(self);
if openDialog.Execute
then begin
filehandle := OpenFile(PChar(openDialog.FileName),file_inf,OF_READWRITE);
size := GetFileSize(filehandle,nil);
SetLength(buf,size div 2 + 1 );
ReadFile(filehandle,buf,size,kt,nil);
CloseHandle(FileHandle);
end;
end;Вопрос: почему массив остается незаполненным? Последний раз редактировалось Admin, 31.03.2012 в 17:15. |
|
#2
|
|||
|
|||
|
Нужно использовать WriteFile вместо ReadFile.
|
|
#3
|
|||
|
|||
|
не, нужно передавать указатель на нулевой элемент @buf[0]
|
| Этот пользователь сказал Спасибо Pyro за это полезное сообщение: | ||
eastwoodknight (03.04.2012)
| ||
|
#4
|
||||
|
||||
|
Лучше использовать CreateFile(...)
Цитата:
|
| Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
eastwoodknight (03.04.2012)
| ||
|
#5
|
||||
|
||||
|
Весь прикол кода ТС в том, что ему вообще не нужны API-ные команды. После применения:
Код:
openDialog := TOpenDialog.Create(self); их ценность падает до нуля. |
|
#6
|
||||
|
||||
|
Код:
var
OpenDialog :TOpenDialog;
kt:Cardinal;
filehandle: THandle;
buf: array of word;
begin
openDialog := TOpenDialog.Create(self);
if openDialog.Execute
then begin
filehandle :=CreateFile(pChar(openDialog.FileName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
size := (GetFileSize(filehandle,nil) div SizeOf(word))+1;
SetLength(buf,size);
ReadFile(filehandle,buf[0],size,kt,nil);
CloseHandle(FileHandle);
end;
openDialog.Free;
end;и для помощи Последний раз редактировалось cotseec, 31.03.2012 в 21:43. |
| Этот пользователь сказал Спасибо cotseec за это полезное сообщение: | ||
eastwoodknight (03.04.2012)
| ||
|
#7
|
||||
|
||||
|
Цитата:
|
|
#8
|
|||
|
|||
|
Спасибо большое всем за помощь, заработало!
Ранее я это выполнил с помощью TFileStream но столкнулся со следующей проблемой - моя программа прерывала работу другой программы, записывающей бинарные данные с детекторного комплекса. Так что идея была - перейти на win api, потому что он дозволяет синхронную работу с файлом двух приложений. Правда теперь возникла другая проблема. С помощью метода seek filestrem'а можно было отслеживать и выводить последние записанные данные, а не заполнять по новой все массивы. А теперь как-то непонятно. Ни у block read, ни у fileread вроде нет возможности читать файл с избранной точки. Что делать? |
|
#9
|
|||
|
|||
|
Для TFileStream надо просто передавать в последнем параметре режим открытия, что то типа fmOpenRead Or fsShareWrite (посмиотри в справке). Тогда не будет блокировать.
|
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
eastwoodknight (03.04.2012)
| ||
|
#10
|
||||
|
||||
|
Seek (для делфовых файлов и BlockRead), SetFilePointer (WinAPI).
|
| Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
eastwoodknight (03.04.2012)
| ||
|
#11
|
|||
|
|||
|
Еще раз большое спасибо))
|