![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
Как я понял, с помошью SetFilePointer можно устанавливать байтовое смещение от определенной точки.
То есть могу ли я делать так: SetFilePointer(hFile, BytesRealReaded-BytesReaded+1, NULL, FILE_BEGIN); где BytesRealReaded - есть некая локальная для функция DWORD переменная отвечающая за хранение общего кол-ва прочитанных байт, а BytesReaded - есть локальная для модуля этой функции переменная DWORD отвечающая за хранение байтов прочитанных в последний раз. Почему-то она неправильно позиционирует указатель, просто дико перемещая его |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 13 Всего: 98 |
должно работать...
может у тебя BytesRealReaded-BytesReaded в отрицательные числа уходит? что происходит если туда готовые числа подставлять? -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
_hunter
Вот смотри:
|
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
За тупость реализации просьба не пинать...
|
|||
|
||||
| Aleksandor |
|
|||
|
Практик ![]() ![]() Профиль Группа: Участник Сообщений: 272 Регистрация: 22.11.2005 Где: россия, зеленогра д Репутация: 10 Всего: 12 |
А ReadFile сам "file pointer" переставляет
SetFilePointer обычно нужен только если надо прочитать с конца файла
-------------------- Call out Gouranga be happy!!! Gouranga Gouranga Gouranga .... That which brings the highest happiness!! |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 13 Всего: 98 |
кстати да.
т.е. ( если я правильно понял алгоритм ) достаточно будет SetFilePointer(hFile, -BytesReaded, NULL, FILE_CURRENT); сделать P.S. сорри что долго -- отойти нужно было... -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
Совершенно верно, первый вариант как раз таким был, но почему-то он не прошел стресс тест - вылетал екзешен. |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 13 Всего: 98 |
именно на этой строке летит?
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
_hunter
Не сразу, но летит именно на ней. Методом научного тыка пришел к такому варианту:
Теперь вот думаю, почему в таком файле не может найти строку the файл.txt: the |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 13 Всего: 98 |
а почему ты при совпадении строк ( if(CompareStr(buffer, Text)) )
указатель назад смещаеш? по-идее наоборот нужно + SetFilePointer(hFile, -BytesReaded+1, NULL, FILE_BEGIN); по-идее смещать нужно ( а то на то же место вернемся ) -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
_hunter
Там else стоит Моя логика такова: Если нашли подходящую строку, то нафига нам смещать назад указатель ? нам уже пофигу , мы знаем, что позади точно нет неучтенной строки нашего типа(ибо размер мы знаем, он константый, по крайней мере локально) А если же строка оказалась галиматьей, то надо сместиться назад от прочтенной строки, оказвшись тем самым на месте BytesRealReaded = BytesRealReaded-BytesReaded+1. Это сообщение отредактировал(а) En_t_end - 16.12.2005, 15:48 |
|||
|
||||
| JoyEx |
|
|||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 4 Всего: 12 |
En_t_end
ReadFile/WriteFile изменяют файловый указатель и поэтому лучше перед их вызовом позиционировать его с помощью SetFilePointer. Чтобы не вылетать на
надо передавать в ф-цию размер массива и проверять прежде, чем туда что-то писАть. Зачем читать из файла по 1 байту? Так долго, лучше сразу читать не менее lstrlen(Text) байт и потом не забывать делать Си строку ( + 0 ). Это сообщение отредактировал(а) JoyEx - 16.12.2005, 16:21 -------------------- Если ты уже никого не боишься, значит ты самый страшный |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 13 Всего: 98 |
так при равенстве строк CompareStr ноль отдаст и соответственно произойдет переход на else SetFilePointer(hFile, -BytesReaded, NULL, FILE_BEGIN)...
+ ты ситуацию с -1 не учитываеш... -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| En_t_end |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
JoyEx
Дело не в этом, это я учел. Я же показываю лишь тестовую версию, в ней меня не интересует выход за границы, ибо массив передаваемый в моем случае в тестовом коде имеет размер не ниже предполагаемому кол-ву совпадений в файле( я его сам создаю). Я же ведь только тестирую... Естественно я ни в коем случае не возражаю против проверки на выход за пределы выделенной памяти массива
CompareStr - это моя функция Нужна для экспериментов с lstrcmpi stricmp strcmp
Сделанна именно так, чтобы не заморачиваться...
Что я и делаю.... Добавлено @ 17:35 JoyEx
Было бы все так легко файл.txt: БлtheБtheБлаБлаthe Таким образом в первый раз прочитается Блt, что не есть гуд |
||||||||||
|
|||||||||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 13 Всего: 98 |
ааа... ясно. просто такая же функция в SysUtils есть. я и подумал что это она... -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |