![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
AD |
![]()
Сообщение
#1
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Необходимо установить указатель файла в конец файла. Как это сделать?
Для того, чтобы установить в начало файла есть функция reset(), а для окончания файла? Cобcтвенно говоря, мне необходимо правильно перевести следующие строки кода на Qt:
WriteHandle - указатель на файл (библиотека карт), куда записывается информация из других файлов. ReadHandle - читаемый на данный файл (карта), откуда эту информацию считывают. Мне важно понять как правильно перевести на Qt-шный стиль строчку кода:
Заранее спасибо. Сообщение отредактировал AD - 28.2.2010, 15:24 |
|
|
![]() |
DEADHUNT |
![]()
Сообщение
#2
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 430 Регистрация: 15.4.2009 Пользователь №: 686 Спасибо сказали: 26 раз(а) Репутация: ![]() ![]() ![]() |
Мне важно понять как правильно перевести на Qt-шный стиль строчку кода:
Заранее спасибо. зачем тебе Qt, если можно перевести чисто на C++:
Сообщение отредактировал DEADHUNT - 26.2.2010, 0:30 |
|
|
AD |
![]()
Сообщение
#3
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Rocky |
![]()
Сообщение
#4
|
Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: ![]() ![]() ![]() |
Для того, чтобы установить в начало файла есть функция reset(), а для окончания файла? Ну если на конец, то можно закрыть его (если он был открыт) и открыть в режиме добавления...Тогда курсор железно в конце будет. Зы. Я например все потоковые операции только через std::ios делаю... Во-первых просто потому что привык, во-вторых никаких потерь "кроссплатформенности"... Вот кстати еще интересно бы сравнить по скорости, кто быстрее.) Потоковые в смысле текстовых файлов. Сообщение отредактировал Rocky - 26.2.2010, 1:20 |
|
|
SABROG |
![]()
Сообщение
#5
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Только два варианта.
Ставить отрицательные значения не рекомендую, если для windows это может переместить указатель в обратную сторону, то в реализации для *nix метод вернет ошибку, так как в отличае от виндовой версии там стоит проверка значения смещения. |
|
|
AD |
![]()
Сообщение
#6
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Такой вариант и сделал. Система попросту зависает (по рабоче-крестьянски, уходит в "глубокий ахтунг"). Фиг знает, почему! Если делать по первому варианту, я смогу после открытия файла с флагом QIODevice::Append перемещаться по файлу, когда мне это понадобиться? |
|
|
Litkevich Yuriy |
![]()
Сообщение
#7
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
AD |
![]()
Сообщение
#8
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#9
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
AD, а сам файл каких размеров?
|
|
|
AD |
![]()
Сообщение
#10
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
AD, а сам файл каких размеров? Litkevich Yuriy, я его ведь формирую как раз в этих строчках! ![]() Вопрос к тем, кто хорошо знаком с boost, у меня дескриптор файла библиотеки определен как . В указанных функциях используется обычный указатель. Я его получаю с помощью следующего вызова: Из-за этого не могут быть проблемы с открытием, закрытие файла и перемещением по нему?
|
|
|
SABROG |
![]()
Сообщение
#11
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
AD |
![]()
Сообщение
#12
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
SABROG |
![]()
Сообщение
#13
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
AD |
![]()
Сообщение
#14
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
При наличии материала с которым можно работать. Так.... Ну судя по всему мне стоит проверить идентичность моих переходов по файлу библиотеки. Следующий код: был перевед в такой:
Т.е. код идентичен или же я напортачил где-то? |
|
|
SABROG |
![]()
Сообщение
#15
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
В прошлой версии ты ограничился 32 битным смещением и соответственно максимальным размером файла в 4Гб. Может лучше qint64 поставить?
Предположим, что -offset = -20, а shift = 19, тогда смещение будет -1. Я выше писал, что отрицательные значения передавать нельзя. Сообщение отредактировал SABROG - 26.2.2010, 18:15 |
|
|
AD |
![]()
Сообщение
#16
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
В прошлой версии ты ограничился 32 битным смещением и соответственно максимальным размером файла в 4Гб. Может лучше qint64 поставить? В какой именно, прости? Предположим, что -offset = -20, а shift = 19, тогда смещение будет -1. Я выше писал, что отрицательные значения передавать нельзя. Как сделать правильно? Передавать модуль разности? |
|
|
SABROG |
![]()
Сообщение
#17
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
В какой именно, прости?
Как сделать правильно? Передавать модуль разности? Я не знаю логику твоей программы. Что содержится в offset, текущее положение курсора в файле? Что в shift, смещение на которое нужно сдвинуться от текущей позиции? Почему offset всегда передается отрицательным?
Две идентичные функции, а для одного и того же аргумента значение передается в разном стиле 0 и NULL. Это ты никак со стилем программирования определиться не можешь? ![]() Сообщение отредактировал SABROG - 26.2.2010, 21:44 |
|
|
AD |
![]()
Сообщение
#18
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Я не знаю логику твоей программы. Что содержится в offset, текущее положение курсора в файле? Что в shift, смещение на которое нужно сдвинуться от текущей позиции? Почему offset всегда передается отрицательным? Две идентичные функции, а для одного и того же аргумента значение передается в разном стиле 0 и NULL. Это ты никак со стилем программирования определиться не можешь? ![]() Нет, конечно. В старой программке сделано через функции винды. Теперь необходимо сделать в Qt-шном варианте. Я то уже определился со стилем. Первое - это старый вариант, второе - новый! |
|
|
DEADHUNT |
![]()
Сообщение
#19
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 430 Регистрация: 15.4.2009 Пользователь №: 686 Спасибо сказали: 26 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
AD |
![]()
Сообщение
#20
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
SABROG |
![]()
Сообщение
#21
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
это почему? вообще лучше nullptr использовать из C++0x. Пока сама Microsoft ожидает увидеть тип NULL лучше давать ей то чего она хочет. Никто ведь не знает будет nullptr равен NULL или нет. А вот в своем коде лучше использовать 0 или умный указатель, который можно проверить на валидность вместо того, чтобы сравнивать с нулём. Нет, конечно. В старой программке сделано через функции винды. Теперь необходимо сделать в Qt-шном варианте. Я то уже определился со стилем. Первое - это старый вариант, второе - новый! Я ответа на свой вопрос так и не увидел. Попробуй что ли добавить qDebug(), пусть выводит смещения которые получаются. |
|
|
AD |
![]()
Сообщение
#22
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
offset - текущее положение в файле, shift - сдвиг. Почему отрицательное - не могу сказать достоверно, код чужой переписываю. Некоторые вещи только догадываться могу. Будем считать, что априори это так и надо.
|
|
|
SABROG |
![]()
Сообщение
#23
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Будем считать, что априори это так и надо. Отрицательное значение для 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 |
![]()
Сообщение
#24
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
У меня просьба к модераторам переименовать тему в "Уточнение работы функции seek"! Заранее спасибо.
SABROG, отдельное спасибо. Теперь никаких заеданий нет. СПАСИБО. Так... ну я разобрался зачем эти перемещения делаются. Я не могу раскрывать все моменты этого кода, но смысл этих перемещений могу сказать. Дело вот в чем. В файл библиотеки записывается вначале содержимое карты, а потом идет перемещение к заголовку библиотеки и записывается заголовок карты. |
|
|
AD |
![]()
Сообщение
#25
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
У меня, возможно еще будут вопросы по seek, относящиеся к этой теме. Пожалуйста, переименуйте! Заранее спасибо!
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#26
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
AD |
![]()
Сообщение
#27
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Кто-нибудь сможет еще слегка подсказать? Есть ошибки в приведенном коде?
Сообщение отредактировал AD - 1.3.2010, 12:10 |
|
|
AD |
![]()
Сообщение
#28
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Во блин... Случайно вчерашнее сообщение удалил. Как раз нужное....
Зависаний при чтении/записи больше нет. Но запись в связи с отличной работой функции seek от функции SetFilePointer имеется. Буду уточнять. Итак в старом варианте следующий код:
В новом варианте:
Что в коде не идентично. В чем несоответствие и соответственно ошибка? Заранее спасибо, если кто-то сможет помочь! |
|
|
SABROG |
![]()
Сообщение
#29
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Если брать winapi код:
И то как я сделал:
То разница есть. shift не должен быть нулевым. Если для SetFilePointer это имеет смысл, т.е. оставляет текущий курсор на прежнем месте, то для seek() при моем варианте итоговое значение будет некорректным. Я не знаю бывают ли такие ситуации, когда у вас SetFilePointer вызывается с нулевым смещением, что мне кажется пустой тратой времени CPU. Если такой факт имеет место быть, то код нужно допиливать. |
|
|
AD |
![]()
Сообщение
#30
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
В том то и дело, что если shift равно нулю, то тогда -_offset + shift = -_offset - а значит идет смещение назад (в данном случае к заголовку). И посмотрите, пожалуйста, приведенный код, он как раз допиленный, согласно всем объяснениям. startOffset - не равно 0! |
|
|
SABROG |
![]()
Сообщение
#31
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
И посмотрите, пожалуйста, приведенный код, он как раз допиленный, согласно всем объяснениям. startOffset - не равно 0! Сделайте 2 функции, старый вариант и новый вариант. Вызовите по очереди и в методах где идет seek() помещайте в лист QList<QPair<uint, uint> > offset. В first можно поместить WINAPI вариант, в second Qt. Потом всё это вывести в файл или на экран и посмотреть где идет разница. |
|
|
AD |
![]()
Сообщение
#32
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Сделайте 2 функции, старый вариант и новый вариант. Вызовите по очереди и в методах где идет seek() помещайте в лист QList<QPair<uint, uint> > offset. В first можно поместить WINAPI вариант, в second Qt. Потом всё это вывести в файл или на экран и посмотреть где идет разница. Мда.... Это разные две программы.... Ладно... что-нибудь постараюсь придумать! Сообщение отредактировал AD - 1.3.2010, 17:08 |
|
|
BRE |
![]()
Сообщение
#33
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
Как я понял, кто-то хотел реализовать (через одно место) установку позиции файла относительно его начала?
/* Почему для этого не воспользоваться SetFilePointer с установкой флага FILE_BEGIN не понятно. Ну да ладно. */ Как мне кажется этот код:
эквивалентен этому:
И возможно дело не в этой функции. /* Все таки первая функция это шедевр. Сколько дней на нее смотрю... */ P.S. Кстати, для чего сохранять _offset, если его всегда можно получить через QFile::pos()? UP: Это: DWORD dwPtr = SetFilePointer(*WriteHandle, 0, 0, FILE_CURRENT); попытка получить текущую позицию? А где используется dwPtr? Сообщение отредактировал BRE - 1.3.2010, 17:50 |
|
|
AD |
![]()
Сообщение
#34
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Как я понял, кто-то хотел реализовать (через одно место) установку позиции файла относительно его начала? Нет. Не совсем так. Помещать следует не в начало файла, в позицию заданную с помощью _offset. В первом варианте - shift = 0, а вот во втором нет. Но вот _offset далеко не нулевое значение. Смысл такой. Есть файл, который хранит что в виде заголовка в начале, а потом идет содержимое других файлов. Так вот заголовки этих других файлов тоже следует писать уже после записи остальных данных - потому что после записи мы знаем смещение этих файлов относительно начало, crc-сумму и прочее.... UP: Это: DWORD dwPtr = SetFilePointer(*WriteHandle, 0, 0, FILE_CURRENT); попытка получить текущую позицию? А где используется dwPtr? Да это строка была для проверки. Забыли удалить, судя по всему. Собственно говоря, можно этот процесс сравнить с процессом написания оглавления в Word. Только представим себе, что оглавление делается не только ко всему документу (заголовку библиотеки), но и к каким отдельным главам (считываемым файлам, содержимое которых записывается в библиотеку). Т.е. вначале делается само содержание этих глав, а потом возвращаемся к странице (месту в файле) где необходимо сделать оглавление и создаем его (Word это умеет делать). Сообщение отредактировал AD - 1.3.2010, 17:52 |
|
|
BRE |
![]()
Сообщение
#35
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
Мне сложно по одной этой функции судить, что хотели сделать разработчики. Возможно, _offset изменяется где то еще, а не только в этой функции???
Но, если нигде больше это значение не изменяется, то эта функция просто перемещает указатель файла на позицию относительно его начала. |
|
|
AD |
![]()
Сообщение
#36
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Изменяется. Сейчас делаю лог-файл для записи всех нужных данных. Буду смотреть. Если что сюда еще спрошу....
|
|
|
AD |
![]()
Сообщение
#37
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Ну тему можно закрывать. Последние изменения, которые были указаны в этой теме помогли. Проблема решена. Дальше мне просто нужно было правильно заполнять поле смещений в каждой карте.
|
|
|
![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 17.6.2025, 9:47 |