crossplatform.ru

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

AD
  опции профиля:
сообщение 25.2.2010, 23:15
Сообщение #1


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

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

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




Репутация:   17  


Необходимо установить указатель файла в конец файла. Как это сделать?
Для того, чтобы установить в начало файла есть функция reset(), а для окончания файла?

Cобcтвенно говоря, мне необходимо правильно перевести следующие строки кода на Qt:
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;

WriteHandle - указатель на файл (библиотека карт), куда записывается информация из других файлов. ReadHandle - читаемый на данный файл (карта), откуда эту информацию считывают. Мне важно понять как правильно перевести на Qt-шный стиль строчку кода:
int dwPtr = SetFilePointer(*WriteHandle, 0, NULL, FILE_END);

Заранее спасибо.

Сообщение отредактировал AD - 28.2.2010, 15:24
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
4 страниц V   1 2 3 > »   
Начать новую тему
Ответов (1 - 36)
DEADHUNT
  опции профиля:
сообщение 26.2.2010, 0:30
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 430
Регистрация: 15.4.2009
Пользователь №: 686

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




Репутация:   2  


Цитата(AD @ 25.2.2010, 23:15) *
Мне важно понять как правильно перевести на Qt-шный стиль строчку кода:
int dwPtr = SetFilePointer(*WriteHandle, 0, NULL, FILE_END);

Заранее спасибо.

зачем тебе Qt, если можно перевести чисто на C++:
istream &istream::seekg(streamoff off, ios_base::seekdir dir);


Сообщение отредактировал DEADHUNT - 26.2.2010, 0:30
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 26.2.2010, 0:46
Сообщение #3


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

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

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




Репутация:   17  


Цитата(DEADHUNT @ 26.2.2010, 0:30) *
зачем тебе Qt, если можно перевести чисто на C++:
istream &istream::seekg(streamoff off, ios_base::seekdir dir);

Да я знаю, что можно и вообще чистыми Си-шными функциями обойтись. Нужен Qt, потому что все остальное работает на Qt-шных файлах.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 26.2.2010, 1:15
Сообщение #4


Старейший участник
****

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

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




Репутация:   7  


Цитата(AD @ 25.2.2010, 23:15) *
Для того, чтобы установить в начало файла есть функция reset(), а для окончания файла?

Ну если на конец, то можно закрыть его (если он был открыт) и открыть в режиме добавления...Тогда курсор железно в конце будет.
Зы. Я например все потоковые операции только через std::ios делаю... Во-первых просто потому что привык, во-вторых никаких потерь "кроссплатформенности"... Вот кстати еще интересно бы сравнить по скорости, кто быстрее.) Потоковые в смысле текстовых файлов.

Сообщение отредактировал Rocky - 26.2.2010, 1:20
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 26.2.2010, 1:54
Сообщение #5


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

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

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




Репутация:   34  


Только два варианта.

QFile file("myfile");
if (!file.open(QIODevice::Append) {
    qDebug() << file.errorString();
    return false;
}


QFile file("myfile");
if (!file.open(QIODevice::ReadWrite) {
    qDebug() << file.errorString();
    return false;
}
file.seek(file.size()); // Qt сама использует этот метод


Ставить отрицательные значения не рекомендую, если для windows это может переместить указатель в обратную сторону, то в реализации для *nix метод вернет ошибку, так как в отличае от виндовой версии там стоит проверка значения смещения.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 26.2.2010, 10:17
Сообщение #6


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

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

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




Репутация:   17  


Цитата(SABROG @ 26.2.2010, 1:54) *
QFile file("myfile");
if (!file.open(QIODevice::ReadWrite) {
    qDebug() << file.errorString();
    return false;
}
file.seek(file.size()); // Qt сама использует этот метод

Такой вариант и сделал. Система попросту зависает (по рабоче-крестьянски, уходит в "глубокий ахтунг"). Фиг знает, почему!

Если делать по первому варианту, я смогу после открытия файла с флагом QIODevice::Append перемещаться по файлу, когда мне это понадобиться?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 26.2.2010, 10:45
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(AD @ 26.2.2010, 13:17) *
Система попросту зависает (по рабоче-крестьянски, уходит в "глубокий ахтунг"). Фиг знает, почему!
а что возвращает функция size() для этого файла?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 26.2.2010, 11:02
Сообщение #8


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

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

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




Репутация:   17  


Цитата(Litkevich Yuriy @ 26.2.2010, 10:45) *
а что возвращает функция size() для этого файла?

Cейчас обнаружил, что именно на ней и уходит куда-то далеко. Если пытаться через второй вариант, то то же самое при попытке закрыть файл. Не понимаю, как избавиться от этих глюков.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 26.2.2010, 13:11
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


AD, а сам файл каких размеров?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 26.2.2010, 13:27
Сообщение #10


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

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

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




Репутация:   17  


Цитата(Litkevich Yuriy @ 26.2.2010, 13:11) *
AD, а сам файл каких размеров?

Litkevich Yuriy, я его ведь формирую как раз в этих строчках! :) Да разного размера он может быть.

Вопрос к тем, кто хорошо знаком с boost, у меня дескриптор файла библиотеки определен как
boost::shared_ptr<QFile> _writeHandle;
. В указанных функциях используется обычный указатель. Я его получаю с помощью следующего вызова:
<функция>(_writeHandle.get());
Из-за этого не могут быть проблемы с открытием, закрытие файла и перемещением по нему?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 26.2.2010, 14:21
Сообщение #11


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

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

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




Репутация:   34  


Цитата(AD @ 26.2.2010, 13:27) *
я его ведь формирую как раз в этих строчках! :)


Тогда лучше тебя никто не знает где сейчас стоит указатель. По умолчанию после write() offset = curpos + datalength
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 26.2.2010, 14:54
Сообщение #12


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

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

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




Репутация:   17  


Цитата(SABROG @ 26.2.2010, 14:21) *
Тогда лучше тебя никто не знает где сейчас стоит указатель. По умолчанию после write() offset = curpos + datalength

Это я понимаю, я не понимаю, почему потом зависает... Сможете помочь?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 26.2.2010, 15:32
Сообщение #13


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

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

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




Репутация:   34  


Цитата(AD @ 26.2.2010, 14:54) *
Сможете помочь?


При наличии материала с которым можно работать.

Цитата(AD @ 26.2.2010, 13:27) *
<функция>(_writeHandle.get());


Если функция твоя, то лучше используй boost::weak_ptr. Так ты сможешь проверять жив ли указатель, даже если boost::shared_ptr его уже грохнул.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 26.2.2010, 15:45
Сообщение #14


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

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

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




Репутация:   17  


Цитата(SABROG @ 26.2.2010, 15:32) *
При наличии материала с которым можно работать.

Так.... Ну судя по всему мне стоит проверить идентичность моих переходов по файлу библиотеки.

Следующий код:
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::SeekSet(unsigned int shift)
{
  bool seek = _writeHandle -> seek(-_offset + shift);
  if(seek) _offset = shift;
}

Т.е. код идентичен или же я напортачил где-то?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 26.2.2010, 18:14
Сообщение #15


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

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

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




Репутация:   34  


Цитата(AD @ 26.2.2010, 15:45) *
unsigned int shift

В прошлой версии ты ограничился 32 битным смещением и соответственно максимальным размером файла в 4Гб. Может лучше qint64 поставить?

Цитата(AD @ 26.2.2010, 15:45) *
_writeHandle -> seek(-_offset + shift);


Предположим, что -offset = -20, а shift = 19, тогда смещение будет -1. Я выше писал, что отрицательные значения передавать нельзя.

Сообщение отредактировал SABROG - 26.2.2010, 18:15
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 26.2.2010, 18:30
Сообщение #16


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

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

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




Репутация:   17  


Цитата(SABROG @ 26.2.2010, 18:14) *
В прошлой версии ты ограничился 32 битным смещением и соответственно максимальным размером файла в 4Гб. Может лучше qint64 поставить?

В какой именно, прости?

Цитата(SABROG @ 26.2.2010, 18:14) *
Предположим, что -offset = -20, а shift = 19, тогда смещение будет -1. Я выше писал, что отрицательные значения передавать нельзя.

Как сделать правильно? Передавать модуль разности?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 26.2.2010, 21:40
Сообщение #17


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

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

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




Репутация:   34  


Цитата(AD @ 26.2.2010, 18:30) *
В какой именно, прости?

Цитата(AD @ 26.2.2010, 15:45) *
void T::SeekSet(unsigned int shift)


Цитата(AD @ 26.2.2010, 18:30) *
Как сделать правильно? Передавать модуль разности?


Я не знаю логику твоей программы. Что содержится в offset, текущее положение курсора в файле? Что в shift, смещение на которое нужно сдвинуться от текущей позиции? Почему offset всегда передается отрицательным?

Цитата(AD @ 26.2.2010, 15:45) *
SetFilePointer(*_writeHandle , -_offset + shift, NULL, FILE_CURRENT);
DWORD dwPtr = SetFilePointer(*_writeHandle , 0, 0, FILE_CURRENT);


Две идентичные функции, а для одного и того же аргумента значение передается в разном стиле 0 и NULL. Это ты никак со стилем программирования определиться не можешь? ;)

Сообщение отредактировал SABROG - 26.2.2010, 21:44
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 26.2.2010, 23:11
Сообщение #18


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

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

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




Репутация:   17  


Цитата(SABROG @ 26.2.2010, 21:40) *
Я не знаю логику твоей программы. Что содержится в offset, текущее положение курсора в файле? Что в shift, смещение на которое нужно сдвинуться от текущей позиции? Почему offset всегда передается отрицательным?

Две идентичные функции, а для одного и того же аргумента значение передается в разном стиле 0 и NULL. Это ты никак со стилем программирования определиться не можешь? ;)

Нет, конечно. В старой программке сделано через функции винды. Теперь необходимо сделать в Qt-шном варианте. Я то уже определился со стилем. Первое - это старый вариант, второе - новый!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DEADHUNT
  опции профиля:
сообщение 26.2.2010, 23:16
Сообщение #19


Активный участник
***

Группа: Участник
Сообщений: 430
Регистрация: 15.4.2009
Пользователь №: 686

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




Репутация:   2  


Цитата(AD @ 26.2.2010, 23:11) *
второе - новый!

это почему? вообще лучше nullptr использовать из C++0x.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 26.2.2010, 23:46
Сообщение #20


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

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

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




Репутация:   17  


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

Что именно почему?
Нельзя, потому что компилятор старый, стандарт еще не введен в законнное действие, а у нас авиация - самая консервативная область! ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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   1 2 3 > » 
Тема закрытаНачать новую тему
Теги
Нет тегов для показа


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


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 17.6.2025, 9:47