![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с WriteFile ReadFile [D7, WinXP]
Alik © (2010-11-04 20:12:00)Добрый вечер!
У меня такая проблема - пишу и читаю строки типа String через API:
h: Thandle;
tmp: integer;
Buffer: PAnsiChar;
S: AnsiString;
S := '12345abcdefgls;dkddfskf';
WriteFile(h, PChar(S)^, 10, tmp, nil);
Buffer := PAsniChar(AllocMem(10))
ReadFile(h, Buffer^, 10, tmp, nil);
S := Buffer;
FreeMem(Buffer);
Иногда строка пишется целиком, иногда пишется обрубок.
И когда читаю дефектную запись получаю соответственно обрубок! Тоже самое присходит для PChar. Сбивает с толку то, что то нормально, то дефект! )
RWolf (2010-11-04 23:54:00) [21]
> Alik (04.11.10 23:48) [11]
string, разумеется. Родной для Delphi тип, с автоматическим управлением памятью.
array тоже годится.
Alik (2010-11-04 23:48:00) [22]
> RWolf © (04.11.10 23:43) [10]
> зачем вообще париться с ручным выделением памяти и какими-
> то PChar?
А как без них? с применением TFileStream?
Какой вообще самый быстрый способ чтения и записи? Мои файлы состоят из большого кол-ва типизированных переменных и строк.
RWolf (2010-11-04 23:43:00) [23]зачем вообще париться с ручным выделением памяти и какими-то PChar?
Alik (2010-11-04 23:25:00) [24]
> clickmaker © (04.11.10 23:18) [8]
> WriteFile вообще-то сдвигает указатель внутри файла на число
> записанных байт.
> чтобы прочитать сначала, надо его отмотать перед ReadFile.
> см. SetFilePointer()
При формировании файла я только пишу в него, чтение я осуществляю из другой процедуры после полного формирования файла, так что методы записи и чтения разнесены.
clickmaker (2010-11-04 23:18:00) [25]WriteFile вообще-то сдвигает указатель внутри файла на число записанных байт.
чтобы прочитать сначала, надо его отмотать перед ReadFile. см. SetFilePointer()
Alik (2010-11-04 22:20:00) [26]
> Palladin © (04.11.10 21:00) [3]
> ты записал 10 символов, и читаешь 10 символов - это и есть
> обрубок
> Palladin © (04.11.10 21:01) [4]
>
> > Buffer := PAsniChar(AllocMem(10))
>
> обрубок разума...
Не совсем понял друг! ))
То что больше 10 байт я специально выбрасываю указывая в методах 10 байт. Проблема в том, что не пишется и этих 10 байт, так как при считывании 10 байт я получаю начало следующего блока данных, а это говорит о том, что первый блок укороченный. И действительно через Wordpad видно, что второй блок залез на первый. Но фишка еще в том, что примерно в 50% случаев все расклдаывается нормально, а в другие 50% получаю дефект!
По поводу Buffer := PAnsiChar(AllocMem(10)), прошу подсказать если можно как то более оптимально читать строку, я и сам чувствую, что это не оптимально. Сейчас я делаю так:
Buffer := PAnsiChar(AllocMem(10))
ReadFile(h, Buffer^, 10, tmp, nil);
S := Buffer;
FreeMem(Buffer);
Alik (2010-11-04 22:13:00) [27]
> sniknik © (04.11.10 20:53) [2]
> а где место под код завершения, если уж вручную работаешь
> с PChar?
Я не знаю, что такое код завершения?!?
Alik (2010-11-04 22:12:00) [28]
> CrytoGen (04.11.10 20:48) [1]
> Что-то не уловил. Во WriteFile вы указали длину буфера 10
> байт, а строка у вас явно длиннее. Для строки AnsiString
> правильнее использовать PAnsiChar(). Когда пишется обрубок
> вы проверяли результат выполнения функции?
Да, но меня интересуют те самые 10 байт, все остальное я таким образом отбрасываю, это норма. Под обрубком я имею ввиду, что даже 10 байт не пишутся, а пишется меньше.
Palladin (2010-11-04 21:01:00) [29]
> Buffer := PAsniChar(AllocMem(10))
обрубок разума...
Palladin (2010-11-04 21:00:00) [30]ты записал 10 символов, и читаешь 10 символов - это и есть обрубок
sniknik (2010-11-04 20:53:00) [31]а где место под код завершения, если уж вручную работаешь с PChar?
CrytoGen (2010-11-04 20:48:00) [32]Что-то не уловил. Во WriteFile вы указали длину буфера 10 байт, а строка у вас явно длиннее. Для строки AnsiString правильнее использовать PAnsiChar(). Когда пишется обрубок вы проверяли результат выполнения функции?