Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с WriteFile ReadFile [D7, WinXP]


Страницы:   1 2

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(). Когда пишется обрубок вы проверяли результат выполнения функции?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо