Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1286828948
Юрий
2010-10-12 00:29
2011.01.23
С днем рождения ! 12 октября 2010 вторник


2-1288744271
Германн
2010-11-03 03:31
2011.01.23
TApplication событие OnHint


2-1288624179
cyber-pilot
2010-11-01 18:09
2011.01.23
Как перехватить вставку из буфера в комбобокс?


2-1288280931
Aleks
2010-10-28 19:48
2011.01.23
Программа-ценник


15-1286539443
xayam
2010-10-08 16:04
2011.01.23
Drupal 6 + .profile для мультисайтинга





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский