Как я могу искать файлы () более 4 ГБ в Windows? - PullRequest
2 голосов
/ 23 февраля 2012

Я на Windows 7, 64-битной и NTFS.Я строю DLL, которая должна быть 32-битной.У меня есть очень простая процедура, которую я хотел бы реализовать в C ++.Я читаю большой файл, используя:

unsigned long p;
ifstream source(file);
streampos pp(p);
source.seekg(pp);

Для файлов размером более 4 ГБ я пытался использовать unsigned long long, но он не работает.Что я делаю неправильно?Я использую GNU GCC. Будет ли это полезным для MSVC Express 2008/2010?

Обновление:

Кажется, что-то не так с моим GCC.Прямо сейчас я проверяю ваши предложения с помощью MSVC, и кажется, что это работает.MSVC использует _int64 для представления объектов streampos / streamoff, позже я проверю это с помощью GCC.

Ответы [ 3 ]

2 голосов
/ 23 февраля 2012

Если вы работаете в 32-битной системе, вам, вероятно, не повезло, если вы делаете это простым способом, хотя библиотека потоков может свободно использовать 64-битное слово для ее pos_type. Тем не менее, это может работать, чтобы использовать относительные поиски. Поскольку все поиски возвращают pos_type, который предположительно указывает текущую позицию, это все равно может работать не слишком хорошо.

Я полагаю, что это только я, но я никогда не находил стремление быть слишком полезным в любом случае. Конечно, реализовав этот беспорядок, я также осознаю, что поиск неизбежно снижает производительность и что он действительно работает только при использовании файлов, открытых в режиме std::ios_base::binary, в котором нет преобразования кода.

1 голос
/ 23 февраля 2012

Я полагаю, что для этого вам понадобятся собственные вызовы Win32, например SetFilePointerEx http://msdn.microsoft.com/en-us/library/aa365542(VS.85).aspx

1 голос
/ 23 февраля 2012

Возможно, вам придется использовать несколько относительных поисков, то есть использовать перегрузку с двумя аргументами seekg.

// Start with seeking from the beginning
source.seekg(some_pos, std::ios::beg);

// Then seek some more from that position
source.seekg(some_offset, std::ios::cur);
...