crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

4 страниц V  « < 2 3 4  
Тема закрытаНачать новую тему
> [РЕШЕНО] Работа с функцией seek, адаптация при работе с SetFilePointer
SABROG
  опции профиля:
сообщение 1.3.2010, 16:16
Сообщение #31


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(AD @ 1.3.2010, 15:52) *
И посмотрите, пожалуйста, приведенный код, он как раз допиленный, согласно всем объяснениям. startOffset - не равно 0!


Сделайте 2 функции, старый вариант и новый вариант. Вызовите по очереди и в методах где идет seek() помещайте в лист QList<QPair<uint, uint> > offset. В first можно поместить WINAPI вариант, в second Qt. Потом всё это вывести в файл или на экран и посмотреть где идет разница.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 1.3.2010, 17:07
Сообщение #32


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(SABROG @ 1.3.2010, 16:16) *
Сделайте 2 функции, старый вариант и новый вариант. Вызовите по очереди и в методах где идет seek() помещайте в лист QList<QPair<uint, uint> > offset. В first можно поместить WINAPI вариант, в second Qt. Потом всё это вывести в файл или на экран и посмотреть где идет разница.

Мда.... Это разные две программы.... Ладно... что-нибудь постараюсь придумать!

Сообщение отредактировал AD - 1.3.2010, 17:08
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 1.3.2010, 17:42
Сообщение #33


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Как я понял, кто-то хотел реализовать (через одно место) установку позиции файла относительно его начала?
/* Почему для этого не воспользоваться SetFilePointer с установкой флага FILE_BEGIN не понятно. Ну да ладно. */

Как мне кажется этот код:
void T::SeekSet( unsigned int shift )
{
    SetFilePointer(*WriteHandle, -offset + shift, NULL, FILE_CURRENT);
    DWORD dwPtr = SetFilePointer(*WriteHandle, 0, 0, FILE_CURRENT);
    offset = shift;
};


эквивалентен этому:
void T::SeekBegChart(unsigned int shift)
{
    _offset = shift;
    bool seek = _writeHandle -> seek(_offset);
}


И возможно дело не в этой функции.

/* Все таки первая функция это шедевр. Сколько дней на нее смотрю... */

P.S. Кстати, для чего сохранять _offset, если его всегда можно получить через QFile::pos()?

UP:
Это:
DWORD dwPtr = SetFilePointer(*WriteHandle, 0, 0, FILE_CURRENT);
попытка получить текущую позицию? А где используется dwPtr?

Сообщение отредактировал BRE - 1.3.2010, 17:50
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 1.3.2010, 18:00
Сообщение #34


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(BRE @ 1.3.2010, 17:42) *
Как я понял, кто-то хотел реализовать (через одно место) установку позиции файла относительно его начала?

Нет. Не совсем так. Помещать следует не в начало файла, в позицию заданную с помощью _offset. В первом варианте - shift = 0, а вот во втором нет. Но вот _offset далеко не нулевое значение. Смысл такой. Есть файл, который хранит что в виде заголовка в начале, а потом идет содержимое других файлов. Так вот заголовки этих других файлов тоже следует писать уже после записи остальных данных - потому что после записи мы знаем смещение этих файлов относительно начало, crc-сумму и прочее....

Цитата(BRE @ 1.3.2010, 17:42) *
UP:
Это:
DWORD dwPtr = SetFilePointer(*WriteHandle, 0, 0, FILE_CURRENT);
попытка получить текущую позицию? А где используется dwPtr?

Да это строка была для проверки. Забыли удалить, судя по всему.

Собственно говоря, можно этот процесс сравнить с процессом написания оглавления в Word. Только представим себе, что оглавление делается не только ко всему документу (заголовку библиотеки), но и к каким отдельным главам (считываемым файлам, содержимое которых записывается в библиотеку). Т.е. вначале делается само содержание этих глав, а потом возвращаемся к странице (месту в файле) где необходимо сделать оглавление и создаем его (Word это умеет делать).

Сообщение отредактировал AD - 1.3.2010, 17:52
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 1.3.2010, 18:31
Сообщение #35


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Мне сложно по одной этой функции судить, что хотели сделать разработчики. Возможно, _offset изменяется где то еще, а не только в этой функции???
Но, если нигде больше это значение не изменяется, то эта функция просто перемещает указатель файла на позицию относительно его начала.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 1.3.2010, 18:48
Сообщение #36


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Изменяется. Сейчас делаю лог-файл для записи всех нужных данных. Буду смотреть. Если что сюда еще спрошу....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 22.3.2010, 17:04
Сообщение #37


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Ну тему можно закрывать. Последние изменения, которые были указаны в этой теме помогли. Проблема решена. Дальше мне просто нужно было правильно заполнять поле смещений в каждой карте.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

4 страниц V  « < 2 3 4
Тема закрытаНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.4.2024, 11:01