Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.01.23;
Скачать: CL | DM;

Вниз

Проблема с WriteFile ReadFile   Найти похожие ветки 

 
Alik   (2010-11-04 20:12) [0]

Добрый вечер!

У меня такая проблема - пишу и читаю строки типа 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-04 20:48) [1]

Что-то не уловил. Во WriteFile вы указали длину буфера 10 байт, а строка у вас явно длиннее. Для строки AnsiString правильнее использовать PAnsiChar(). Когда пишется обрубок вы проверяли результат выполнения функции?


 
sniknik ©   (2010-11-04 20:53) [2]

а где место под код завершения, если уж вручную работаешь с  PChar?


 
Palladin ©   (2010-11-04 21:00) [3]

ты записал 10 символов, и читаешь 10 символов - это и есть обрубок


 
Palladin ©   (2010-11-04 21:01) [4]


> Buffer := PAsniChar(AllocMem(10))

обрубок разума...


 
Alik   (2010-11-04 22:12) [5]


> CrytoGen   (04.11.10 20:48) [1]
> Что-то не уловил. Во WriteFile вы указали длину буфера 10
> байт, а строка у вас явно длиннее. Для строки AnsiString
> правильнее использовать PAnsiChar(). Когда пишется обрубок
> вы проверяли результат выполнения функции?


Да, но меня интересуют те самые 10 байт, все остальное я таким образом отбрасываю, это норма. Под обрубком я имею ввиду, что даже 10 байт не пишутся, а пишется меньше.


 
Alik   (2010-11-04 22:13) [6]


> sniknik ©   (04.11.10 20:53) [2]
> а где место под код завершения, если уж вручную работаешь
> с  PChar?


Я не знаю, что такое код завершения?!?


 
Alik   (2010-11-04 22:20) [7]


> 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);


 
clickmaker ©   (2010-11-04 23:18) [8]

WriteFile вообще-то сдвигает указатель внутри файла на число записанных байт.
чтобы прочитать сначала, надо его отмотать перед ReadFile. см. SetFilePointer()


 
Alik   (2010-11-04 23:25) [9]


> clickmaker ©   (04.11.10 23:18) [8]
> WriteFile вообще-то сдвигает указатель внутри файла на число
> записанных байт.
> чтобы прочитать сначала, надо его отмотать перед ReadFile.
>  см. SetFilePointer()


При формировании файла я только пишу в него, чтение я осуществляю из другой процедуры после полного формирования файла, так что методы записи и чтения разнесены.


 
RWolf ©   (2010-11-04 23:43) [10]

зачем вообще париться с ручным выделением памяти и какими-то PChar?


 
Alik   (2010-11-04 23:48) [11]


> RWolf ©   (04.11.10 23:43) [10]
> зачем вообще париться с ручным выделением памяти и какими-
> то PChar?


А как без них? с применением TFileStream?
Какой вообще самый быстрый способ чтения и записи? Мои файлы состоят из большого кол-ва типизированных переменных и строк.


 
RWolf ©   (2010-11-04 23:54) [12]


> Alik   (04.11.10 23:48) [11]

string, разумеется. Родной для Delphi тип, с автоматическим управлением памятью.
array тоже годится.


 
Alik   (2010-11-04 23:57) [13]


> RWolf ©   (04.11.10 23:54) [12]
>
> > Alik   (04.11.10 23:48) [11]
>
> string, разумеется. Родной для Delphi тип, с автоматическим
> управлением памятью.
> array тоже годится.


А можно так: ReadFile(h, S, 10, tmp, nil);
Насколько мне известно второй параметр должен быть указателем?


 
RWolf ©   (2010-11-04 23:57) [14]


> Какой вообще самый быстрый способ чтения и записи?

Быстрее ReadFile вряд ли что-то найти, при условии правильной буферизации — это самый низкий уровень работы с файлами. Отображение файла на память тоже работает довольно быстро, если не так же быстро.


 
RWolf ©   (2010-11-04 23:59) [15]


> А можно так: ReadFile(h, S, 10, tmp, nil);

SetLength(s, 10);
ReadFile(h, @S[1], 10, tmp, nil);


 
RWolf ©   (2010-11-04 23:59) [16]

да, в юникодных дельфях нужен AnsiString.


 
Alik   (2010-11-05 00:11) [17]


> 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)?


 
sniknik ©   (2010-11-05 02:09) [18]

> Я не знаю, что такое код завершения?!?
http://www.programmersclub.ru/typepchar/
Теперь тип PCHAR. Фактически тип PCHAR это указатель на тип CHAR. ... и далее.


 
Германн ©   (2010-11-05 02:28) [19]


> Благодарю, это мне существенно поможет в моих проектах!
> Вот если бы еще разобраться почему Writefile хондрит при
> записи строк! Может нужно что то типа Sleep(100)?

А вот тут желательно знать подробности. Либо WriteFile и ReadFile действительно разнесены как сказано в Alik   (04.11.10 23:25) [9], либо кто-то чего-то не договаривает.


 
Alik   (2010-11-05 10:48) [20]


> 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


 
Anatoly Podgoretsky ©   (2010-11-05 10:57) [21]


> Alik   (05.11.10 00:11) [17]

> Благодарю, это мне существенно поможет в моих проектах!


это тебе существенно поможет получить AV и другие проблемы.


 
Alik   (2010-11-05 11:10) [22]


> Anatoly Podgoretsky ©   (05.11.10 10:57) [21]
>
> > Alik   (05.11.10 00:11) [17]
>
> > Благодарю, это мне существенно поможет в моих проектах!
>  
>
>
> это тебе существенно поможет получить AV и другие проблемы.
>
> <Цитата>


А как тогда нужно правильно читать строки методом ReadFile?


 
Anatoly Podgoretsky ©   (2010-11-05 11:19) [23]

Так как в твоем вопросе
PChar(S) и Buffer^
А @S[1] это константный объект и предмет для AV, кстати PChar(S) аналогично, поскольку нужен дополнитетельный контрол по длине, длина должна быть больше нуля.

Другой вопрос, а нафиг тебе АПИ функции, почему не TFileStream, ведь все равно ты с АПИ работать не умеешь.


 
Alik   (2010-11-05 11:27) [24]


> Anatoly Podgoretsky ©   (05.11.10 11:19) [23]
> Так как в твоем вопросе
> PChar(S) и Buffer^
> А @S[1] это константный объект и предмет для AV, кстати
> PChar(S) аналогично, поскольку нужен дополнитетельный контрол
> по длине, длина должна быть больше нуля.


А в чем заключается такой контроль? пустые строки я заведомо не пишу!
Данные API я очень даже эффективно применяю, для структурных переменных все в шоколоде, проблема только со строками! А делаю на API потому что нужна максимальная скорость чтения и записи!


 
sniknik ©   (2010-11-05 11:37) [25]

> останавливается на @S[1] и ругается так:
почему на @S[1], а не на tmp например?

> А как тогда нужно правильно читать строки методом ReadFile?
надо читать справку(и выполнять соглашения) именно по тому ReadFile который используешь (у тебя похоже какой то другой...).

> А делаю на API потому что нужна максимальная скорость чтения и записи!
не видел еще действительно быстрой программы написанной фанатом "скорости от апи"... они упускают логику и алгоритмы (на чем реально можно ускорить) через чур вдаваясь в детали.


 
Anatoly Podgoretsky ©   (2010-11-05 12:13) [26]

> Alik  (05.11.2010 11:27:24)  [24]

Если заведомо не пишешь, то и по зубам не получишь.
По скорости, а ты сравнивал АПИ с TFileStream?
Для АПИ никаких строк не существует, в отличии от Дельфи, АПИ оперирует
только массивами байт или отдельными переменными.


 
Anatoly Podgoretsky ©   (2010-11-05 12:14) [27]


> А делаю на API потому что нужна максимальная скорость чтения
> и записи!

Но с АПИ ты практически не умеешь работать, тебя уже спрашивали про завершение, ты ничего не смог сказать. Не лезь в АПИ, пока не научишься программировать.


 
Alik   (2010-11-05 17:47) [28]


> Anatoly Podgoretsky ©   (05.11.10 12:14) [27]
>
> > А делаю на API потому что нужна максимальная скорость
> чтения
> > и записи!
>
> Но с АПИ ты практически не умеешь работать, тебя уже спрашивали
> про завершение, ты ничего не смог сказать. Не лезь в АПИ,
>  пока не научишься программировать.


Сделал все через Filestream, пока проблем нет, но чувство неудовлетворенности осталось!))


 
Anatoly Podgoretsky ©   (2010-11-05 18:19) [29]

> Alik  (05.11.2010 17:47:28)  [28]

Ну понятно, что обидно, зато радость, что работает.


 
DiamondShark ©   (2010-11-06 18:16) [30]

А это ничего, что WriteFile не обязана писать всё запрошенное количество байт за раз? На этот случай там даже специальный выходной параметр есть -- счётчик реально записанных байт.

Почему-то, никому не пришло в голову проанализировать возвращаемые функцией значения.


 
Anatoly Podgoretsky ©   (2010-11-06 18:22) [31]

Cкажено, что с АПИ он работать не умеет, вот и не анализирует коды завершения, да и не только это. Но мы его уже сподвигли на VCL


 
CrytoGen   (2010-11-06 20:09) [32]

Про результат сразу спросил в [1] :) Но тут всякие коды завершения, PChar"ы заумные, не до проверки результата записи...



Страницы: 1 вся ветка

Текущий архив: 2011.01.23;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.01 c
15-1286524599
И. Павел
2010-10-08 11:56
2011.01.23
Как остановить трассировку?


2-1288273897
JEDI
2010-10-28 17:51
2011.01.23
Проблема с QuickReport


2-1288507838
31512
2010-10-31 09:50
2011.01.23
Out of memory при создании экземпляра объекта


3-1250771479
Ламот
2009-08-20 16:31
2011.01.23
select отказывается искать данные в столбце...


2-1288563898
Германн
2010-11-01 01:24
2011.01.23
Отладка компонент