[РЕШЕНО] Работа с функцией seek, адаптация при работе с SetFilePointer |
Здравствуйте, гость ( Вход | Регистрация )
[РЕШЕНО] Работа с функцией seek, адаптация при работе с SetFilePointer |
SABROG |
27.2.2010, 0:18
Сообщение
#21
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
это почему? вообще лучше nullptr использовать из C++0x. Пока сама Microsoft ожидает увидеть тип NULL лучше давать ей то чего она хочет. Никто ведь не знает будет nullptr равен NULL или нет. А вот в своем коде лучше использовать 0 или умный указатель, который можно проверить на валидность вместо того, чтобы сравнивать с нулём. Нет, конечно. В старой программке сделано через функции винды. Теперь необходимо сделать в Qt-шном варианте. Я то уже определился со стилем. Первое - это старый вариант, второе - новый! Я ответа на свой вопрос так и не увидел. Попробуй что ли добавить qDebug(), пусть выводит смещения которые получаются. |
|
|
AD |
27.2.2010, 0:47
Сообщение
#22
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
offset - текущее положение в файле, shift - сдвиг. Почему отрицательное - не могу сказать достоверно, код чужой переписываю. Некоторые вещи только догадываться могу. Будем считать, что априори это так и надо.
|
|
|
SABROG |
27.2.2010, 2:56
Сообщение
#23
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
Будем считать, что априори это так и надо. Отрицательное значение для Windows функции это перемещение в обратную сторону. Как это связано с вопросом перемещением указателя в конец файла я не понял. Разница между QIODevice::seek() и SetFilePointer в том, что первый берет абсолютное смещение в файле, а второй берет относительное смещение от текущей позиции. Конец файла для seek() это seek(size()), а для SetFilePointer это offset+(currentFileSize-offset): Пример. Размер файла 10 байт. Текущая позиция 5. currentFileSize = 10 offset = 5 Переменная которая передается в SetFilePointer = 5+(10-5) // 10 ... 0+(10-0) = 10 10+(10-10) = 10 Теперь нам надо реализовать тот же функционал перемещения указателя в любую сторону исходя из текущего положения указателя (offset) и переданного смещения (shift). Возьмем всё тот же пример, 5 текущая позиция, 10 размер файла. -5+0 = -5 перемещаемся на 5 байт назад -5+1 = -4 на 4 байта назад -5+2 = -3 -5+3 = -2 -5+4 = -1 -5+5 = 0 стоим на месте -5+6 = 1 вперед на 1 байт (хрен знает что за логика такая, то туда то сюда)
Сообщение отредактировал SABROG - 27.2.2010, 3:21 |
|
|
AD |
27.2.2010, 12:16
Сообщение
#24
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
У меня просьба к модераторам переименовать тему в "Уточнение работы функции seek"! Заранее спасибо.
SABROG, отдельное спасибо. Теперь никаких заеданий нет. СПАСИБО. Так... ну я разобрался зачем эти перемещения делаются. Я не могу раскрывать все моменты этого кода, но смысл этих перемещений могу сказать. Дело вот в чем. В файл библиотеки записывается вначале содержимое карты, а потом идет перемещение к заголовку библиотеки и записывается заголовок карты. |
|
|
AD |
28.2.2010, 13:50
Сообщение
#25
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
У меня, возможно еще будут вопросы по seek, относящиеся к этой теме. Пожалуйста, переименуйте! Заранее спасибо!
|
|
|
Litkevich Yuriy |
28.2.2010, 15:13
Сообщение
#26
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
AD |
28.2.2010, 17:23
Сообщение
#27
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Кто-нибудь сможет еще слегка подсказать? Есть ошибки в приведенном коде?
Сообщение отредактировал AD - 1.3.2010, 12:10 |
|
|
AD |
1.3.2010, 12:47
Сообщение
#28
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Во блин... Случайно вчерашнее сообщение удалил. Как раз нужное....
Зависаний при чтении/записи больше нет. Но запись в связи с отличной работой функции seek от функции SetFilePointer имеется. Буду уточнять. Итак в старом варианте следующий код:
В новом варианте:
Что в коде не идентично. В чем несоответствие и соответственно ошибка? Заранее спасибо, если кто-то сможет помочь! |
|
|
SABROG |
1.3.2010, 15:39
Сообщение
#29
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
Если брать winapi код:
И то как я сделал:
То разница есть. shift не должен быть нулевым. Если для SetFilePointer это имеет смысл, т.е. оставляет текущий курсор на прежнем месте, то для seek() при моем варианте итоговое значение будет некорректным. Я не знаю бывают ли такие ситуации, когда у вас SetFilePointer вызывается с нулевым смещением, что мне кажется пустой тратой времени CPU. Если такой факт имеет место быть, то код нужно допиливать. |
|
|
AD |
1.3.2010, 15:52
Сообщение
#30
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
В том то и дело, что если shift равно нулю, то тогда -_offset + shift = -_offset - а значит идет смещение назад (в данном случае к заголовку). И посмотрите, пожалуйста, приведенный код, он как раз допиленный, согласно всем объяснениям. startOffset - не равно 0! |
|
|
Текстовая версия | Сейчас: 29.3.2024, 16:42 |