Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2013, 00:25   #1
andreil
Пользователь
 
Регистрация: 19.12.2011
Сообщений: 28
Злость Неверная установка указателя файла

В программе имеется следующий код:
Код:
StreamSize inline fileSeek(fileHandle handle, StreamSize moveTo, ESeekMethod method)
{
#ifdef WIN32
    uint32_t hiPtr = moveTo >> 32;
    uint32_t res = SetFilePointer(handle, uint32_t(moveTo), (LONG*)&hiPtr, method);
    if ((res == 0xFFFFFFFF) && (GetLastError() != NO_ERROR))
        return -1;
    else
        return (res | ((uint64_t)hiPtr << 32));
#elif defined __unix__
    return lseek(handle, moveTo, method);
#endif
}
Он используется для реализации метода seek файлового потока.
И всё работало бы хорошо, если бы не Windows-часть этой функции...
А в ней происходит непонятное - при вызове функции со следующими параметрами:
Код:
fileSeek (handle=0x30c, moveTo=-32, method=spEnd) (F:\Projects (C++)\SD\SD\stream.cpp:20)
Она мне возвращает не 0x670e25 (6753829), а 0xce1c6a
Такое поведение замечено во всех случаях использования данной функции - остальной функционал (ReadFile и WriteFile) работает как часы...
Вроде бы использовал эту библиотеку и раньше, ничего такого не замечал. Но тогда у меня стояла XP 32bit, а сейчас - Win8 64bit.
Компилятор - MinGW из последней бинарной сборки Code::Blocks (12.11).

PS: Чуть не забыл структуру ESeekMethod и тип StreamSize;, а то сразу бы все бочки на неё катили бы
Код:
enum ESeekMethod
{
    spBegin,
    spCurrent,
    spEnd
};
typedef int64_t StreamSize;
Если нужны исходники - могу выложить. Но требуются библиотеки zlib, vorbisfile, ogg, lpng16.

Последний раз редактировалось andreil; 15.12.2013 в 12:40.
andreil вне форума Ответить с цитированием
Старый 15.12.2013, 12:20   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

А почему spEnd?
waleri на форуме Ответить с цитированием
Старый 16.12.2013, 10:44   #3
andreil
Пользователь
 
Регистрация: 19.12.2011
Сообщений: 28
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
А почему spEnd?
Нужно прочитать сигнатуру файла, находящуюся в самом конце файла.
В общем, сделал "финт ушами" - сделал через абсолютное смещение в файле:
Код:
str->seek(str->getSize() - sizeof(GPK_sig_t), spBegin);
andreil вне форума Ответить с цитированием
Старый 16.12.2013, 12:20   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Насколько я помню, spEnd будет как раз размер файла - аргумент, так что подозреваю, будет
seek(file, -sizeof(GPK_sig_t), spEnd)
waleri на форуме Ответить с цитированием
Старый 16.12.2013, 12:39   #5
andreil
Пользователь
 
Регистрация: 19.12.2011
Сообщений: 28
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Насколько я помню, spEnd будет как раз размер файла - аргумент, так что подозреваю, будет
seek(file, -sizeof(GPK_sig_t), spEnd)
Так и делал. размер файла - 6753861(0x670E45) байт. результат вызова - в первом сообщении.

Хм, сейчас глянул в отладчике и заметил косяк... Функция fileSeek принимает размер с типом StreamSize, равный int64_t (как и все функции для работы с файловыми потоками, включая и класс-обертку). Метод класса вызывается с параметром -sizeof(GPK_sig_t).
Смотрим в отладчике и видим, что у moveTo младшие 32 бита содержат наше число, а старшие - нули Как так? или мне надо поправить в программе вызов:
Код:
stream->seek(file, -sizeof(GPK_sig_t) * 1LL, spEnd)
для приведения параметра к размеру в 64 бита?

PS: Поправить сейчас не могу, ибо машина с Виндоус дома А на работе пользуюсь христианским Linux

Последний раз редактировалось andreil; 16.12.2013 в 12:51.
andreil вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Установка файла образа nadia.mot Свободное общение 1 24.10.2010 22:48
Неверная запись Golovastik HTML и CSS 1 26.07.2010 21:34
Получение и установка атрибутов файла Волк Microsoft Office Excel 1 21.05.2009 04:56
Установка указателя в одной таблице по значению из другой Avalonix БД в Delphi 1 31.05.2008 17:20
Неверная ссылка на профиль AlDelta О форуме и сайтах клуба 2 27.10.2007 21:03