![]() |
| ||
|
|
Новости |
Поиск |
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. Сбивает с толку то, что то нормально, то дефект! )
CrytoGen (2010-11-06 20:09:00) [1]Про результат сразу спросил в [1] :) Но тут всякие коды завершения, PChar'ы заумные, не до проверки результата записи...
Anatoly Podgoretsky (2010-11-06 18:22:00) [2]Cкажено, что с АПИ он работать не умеет, вот и не анализирует коды завершения, да и не только это. Но мы его уже сподвигли на VCL
DiamondShark (2010-11-06 18:16:00) [3]А это ничего, что WriteFile не обязана писать всё запрошенное количество байт за раз? На этот случай там даже специальный выходной параметр есть -- счётчик реально записанных байт.
Почему-то, никому не пришло в голову проанализировать возвращаемые функцией значения.
Anatoly Podgoretsky (2010-11-05 18:19:00) [4]> Alik (05.11.2010 17:47:28) [28]
Ну понятно, что обидно, зато радость, что работает.
Alik (2010-11-05 17:47:00) [5]
> Anatoly Podgoretsky © (05.11.10 12:14) [27]
>
> > А делаю на API потому что нужна максимальная скорость
> чтения
> > и записи!
>
> Но с АПИ ты практически не умеешь работать, тебя уже спрашивали
> про завершение, ты ничего не смог сказать. Не лезь в АПИ,
> пока не научишься программировать.
Сделал все через Filestream, пока проблем нет, но чувство неудовлетворенности осталось!))
Anatoly Podgoretsky (2010-11-05 12:14:00) [6]
> А делаю на API потому что нужна максимальная скорость чтения
> и записи!
Но с АПИ ты практически не умеешь работать, тебя уже спрашивали про завершение, ты ничего не смог сказать. Не лезь в АПИ, пока не научишься программировать.
Anatoly Podgoretsky (2010-11-05 12:13:00) [7]> Alik (05.11.2010 11:27:24) [24]
Если заведомо не пишешь, то и по зубам не получишь.
По скорости, а ты сравнивал АПИ с TFileStream?
Для АПИ никаких строк не существует, в отличии от Дельфи, АПИ оперирует
только массивами байт или отдельными переменными.
sniknik (2010-11-05 11:37:00) [8]> останавливается на @S[1] и ругается так:
почему на @S[1], а не на tmp например?
> А как тогда нужно правильно читать строки методом ReadFile?
надо читать справку(и выполнять соглашения) именно по тому ReadFile который используешь (у тебя похоже какой то другой...).
> А делаю на API потому что нужна максимальная скорость чтения и записи!
не видел еще действительно быстрой программы написанной фанатом "скорости от апи"... они упускают логику и алгоритмы (на чем реально можно ускорить) через чур вдаваясь в детали.
Alik (2010-11-05 11:27:00) [9]
> Anatoly Podgoretsky © (05.11.10 11:19) [23]
> Так как в твоем вопросе
> PChar(S) и Buffer^
> А @S[1] это константный объект и предмет для AV, кстати
> PChar(S) аналогично, поскольку нужен дополнитетельный контрол
> по длине, длина должна быть больше нуля.
А в чем заключается такой контроль? пустые строки я заведомо не пишу!
Данные API я очень даже эффективно применяю, для структурных переменных все в шоколоде, проблема только со строками! А делаю на API потому что нужна максимальная скорость чтения и записи!
Anatoly Podgoretsky (2010-11-05 11:19:00) [10]Так как в твоем вопросе
PChar(S) и Buffer^
А @S[1] это константный объект и предмет для AV, кстати PChar(S) аналогично, поскольку нужен дополнитетельный контрол по длине, длина должна быть больше нуля.
Другой вопрос, а нафиг тебе АПИ функции, почему не TFileStream, ведь все равно ты с АПИ работать не умеешь.
Alik (2010-11-05 11:10:00) [11]
> Anatoly Podgoretsky © (05.11.10 10:57) [21]
>
> > Alik (05.11.10 00:11) [17]
>
> > Благодарю, это мне существенно поможет в моих проектах!
>
>
>
> это тебе существенно поможет получить AV и другие проблемы.
>
> <Цитата>
А как тогда нужно правильно читать строки методом ReadFile?
Anatoly Podgoretsky (2010-11-05 10:57:00) [12]
> Alik (05.11.10 00:11) [17]
> Благодарю, это мне существенно поможет в моих проектах!
это тебе существенно поможет получить AV и другие проблемы.
Alik (2010-11-05 10:48:00) [13]
> RWolf © (04.11.10 23:59) [15]
>
> > А можно так: ReadFile(h, S, 10, tmp, nil);
>
> SetLength(s, 10);
> ReadFile(h, @S[1], 10, tmp, nil);
Попробовал так, компилятор Дельфи 7 останавливается на @S[1] и ругается так:
Constant object cannot be passed as var parameter
Германн (2010-11-05 02:28:00) [14]
> Благодарю, это мне существенно поможет в моих проектах!
> Вот если бы еще разобраться почему Writefile хондрит при
> записи строк! Может нужно что то типа Sleep(100)?
А вот тут желательно знать подробности. Либо WriteFile и ReadFile действительно разнесены как сказано в Alik (04.11.10 23:25) [9], либо кто-то чего-то не договаривает.
sniknik (2010-11-05 02:09:00) [15]> Я не знаю, что такое код завершения?!?
http://www.programmersclub.ru/typepchar/
Теперь тип PCHAR. Фактически тип PCHAR это указатель на тип CHAR.... и далее.
Alik (2010-11-05 00:11:00) [16]
> RWolf © (04.11.10 23:59) [15]
>
> > А можно так: ReadFile(h, S, 10, tmp, nil);
>
> SetLength(s, 10);
> ReadFile(h, @S[1], 10, tmp, nil);
Благодарю, это мне существенно поможет в моих проектах! Вот если бы еще разобраться почему Writefile хондрит при записи строк! Может нужно что то типа Sleep(100)?
RWolf (2010-11-04 23:59:00) [17]да, в юникодных дельфях нужен AnsiString.
RWolf (2010-11-04 23:59:00) [18]
> А можно так: ReadFile(h, S, 10, tmp, nil);
SetLength(s, 10);
ReadFile(h, @S[1], 10, tmp, nil);
RWolf (2010-11-04 23:57:00) [19]
> Какой вообще самый быстрый способ чтения и записи?
Быстрее ReadFile вряд ли что-то найти, при условии правильной буферизации — это самый низкий уровень работы с файлами. Отображение файла на память тоже работает довольно быстро, если не так же быстро.
Alik (2010-11-04 23:57:00) [20]
> RWolf © (04.11.10 23:54) [12]
>
> > Alik (04.11.10 23:48) [11]
>
> string, разумеется. Родной для Delphi тип, с автоматическим
> управлением памятью.
> array тоже годится.
А можно так: ReadFile(h, S, 10, tmp, nil);
Насколько мне известно второй параметр должен быть указателем?