crossplatform.ru

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

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


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

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

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




Репутация:   34  


Цитата(DEADHUNT @ 26.2.2010, 23:16) *
это почему? вообще лучше nullptr использовать из C++0x.

Пока сама Microsoft ожидает увидеть тип NULL лучше давать ей то чего она хочет. Никто ведь не знает будет nullptr равен NULL или нет. А вот в своем коде лучше использовать 0 или умный указатель, который можно проверить на валидность вместо того, чтобы сравнивать с нулём.

Цитата(AD @ 26.2.2010, 23:11) *
Нет, конечно. В старой программке сделано через функции винды. Теперь необходимо сделать в 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  


Цитата(AD @ 27.2.2010, 0:47) *
Будем считать, что априори это так и надо.


Отрицательное значение для 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 байт
(хрен знает что за логика такая, то туда то сюда)
qint64 _offset = _writeHandle->pos();
...
SeekSet(shift);
...
void T::SeekSet(unsigned int shift)
{
_offset += -_offset + shift;
_writeHandle->seek(_offset);
}


Сообщение отредактировал 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, 16:50) *
Пожалуйста, переименуйте!
Автор темы может переименовать тему, в режиме редактирования (не "быстрого") первого сообщения темы
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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 имеется. Буду уточнять.

Итак в старом варианте следующий код:

// Место вызова функций сдвига для записи в заголовок нужной информации
SeekSet();          /// параметр shift по умолчанию равен 0. Сдвиг на начало записи заголовка карты в библиотеку
Head.Write_();
// какие-то еще действия
SeekEnd();


// Функции сдвигов
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::SeekEnd()
{
    
    int dwPtr = SetFilePointer(*WriteHandle, 0, NULL, FILE_END);
    int dwError;
    if (dwPtr == INVALID_SET_FILE_POINTER) // Test for failure
{
    // Obtain the error code.
    dwError = GetLastError();

    // Deal with failure.
    // . . .

} // End of error handler

    offset = 0;
}


В новом варианте:
// Место вызова функций сдвига для записи в заголовок нужной информации
SeekBegChart(startOffset); // аналогично SeekSet(). Сделал название функции близкое к ее применению
_head.Write_();
// какие-то еще действия
SeekEnd();

/// Перемещение в начало описание карты
void T::SeekBegChart(unsigned int shift)
{
    _offset = shift;
    bool seek = _writeHandle -> seek(_offset);
}

/// Перемещение в конец файла
void T::SeekEnd()
{
    _offset = _writeHandle -> size();
    bool seek = _writeHandle -> seek(_writeHandle -> size());
}


Что в коде не идентично. В чем несоответствие и соответственно ошибка? Заранее спасибо, если кто-то сможет помочь!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 1.3.2010, 15:39
Сообщение #29


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

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

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




Репутация:   34  


Если брать winapi код:

-offset + shift


И то как я сделал:

_offset += -_offset + shift;


То разница есть. 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!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 29.3.2024, 16:42