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. Сбивает с толку то, что то нормально, то дефект! )


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);
Насколько мне известно второй параметр должен быть указателем?


Страницы:   1 2

Наверх

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