![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
tatan, а у тебя файловая система на диске случайно не FAT?
|
|||
|
||||
| tatan |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 70 Регистрация: 31.10.2007 Репутация: нет Всего: 1 |
Нет, конечно
Я же говорю, gcc нормально работает |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
Вобщем так. VC 7.1 и VC 9 работают одинаково. Файл у меня создается немногим больше 4Г (т.е. 4Г - не ограничение).
Затыкается, когда вот тут
k становится равным 0. Посмотрел как записывается ADBPageDescriptor, но так и не понял. Во многих местах похожий, но разный код, разбираться лень. Но дело тут явно не в ограничениях на размер и не работе streamoff. Похоже где то либо переполнение (например в unsigned short), либо ошибка в приведении типа. Еще замечено, что поток вывода в некоторый момент приобретает ошибочное состояние, которое не анализируется и не сбрасывается сразу. Добавлено через 3 минуты и 41 секунду Я его долго мотал по отладчику (в т.ч. пытаясь понять, что оно таки делает Затыкается, когда pNum становится равным 65. |
|||
|
||||
| tatan |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 70 Регистрация: 31.10.2007 Репутация: нет Всего: 1 |
Это файл, организованный из страниц одинакового размера, заготовка под будущую карманную СУБД
Есть системный тип страниц, SpaceInventoryPage, эти страницы содержат сведения о других страницах - свободны или нет. При открытии файла свободные страницы заносятся в вектор SIParray, для ускорения получения free page. Такие страницы организованы в список - у каждой в заголовке содержится номер предыдущей и следующей страницы ADBFile - просто файл и основные действия ADBPage - только для того, чтобы работать с зашифрованным RC-4 файлом, ADBPagedFile смотрит, если файл зашифрован, то подает клиенту расштфрованный буфер страницы. Можно было всю работу в ADBPageedFile организовать через ADBPage, но накладно. ADBPagedFile - собственно сам страничный файл, отвечает за выделение-освобождение, использование страниц Спасибо, baldina, буду искать косяк. Отладчиком пользоваться не умею, буду учиться. Правда, непонятно, почему с gcc работает и вроде как после интенсивной проверки логики |
|||
|
||||
| tatan |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 70 Регистрация: 31.10.2007 Репутация: нет Всего: 1 |
Короче, пока завязал с VC, следующий код, компиленный gcc, правильно работает, VC - нет
Видимо какие-то особенности VC я не принимаю о внимание Найду все равно Всем спасибо Програма создает файл ~6250 Mb, устанавливает файловый указатель на filesize - 100 и пишет в файл тестовую строку
|
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
tatan, дело оказалось не в программе.
Не работает fstream::seekp() на файлах больше 4Г. Потоки вызывают стандартную библиотеку С, та - ядреную функцию Win32. fstream::seekp() -> fseek() -> _lseek() -> SetFilePointer(). Вот SetFilePointer() (kernel32.dll) и не работает на больших файлах, если вызывается так, как это делает _lseek(). DWORD SetFilePointer( HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod ); lpDistanceToMoveHigh - NULL для небольших смещений, либо указатель на старшую часть смещения для больших. Так вот _lseek передает NULL. При таком вызове на больших файлах SetFilePointer завершается с ошибкой. А правильно вызывает 64-битная версия _lseek. Обойти можно так - я переделал стандартную функцию fseek(), вызвав её 64-битную версию. Надо просто добавить прилагаемый файл в проект, и будет работать. С CRT линковать надо статически. Удачи. Это сообщение отредактировал(а) baldina - 11.12.2007, 15:31 Присоединённый файл ( Кол-во скачиваний: 15 )
fseek_64.c 0,22 Kb |
|||
|
||||
| tatan |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 70 Регистрация: 31.10.2007 Репутация: нет Всего: 1 |
A я стер ADBFile и переписал с FILE*,
и все заработало. спасибо, baldina, что столько времени потратил на меня, я попробую вернуться к fstream |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |