Форум: "Начинающим";
Текущий архив: 2011.01.23;
Скачать: [xml.tar.bz2];
ВнизПроблема с 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;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.003 c