Я уволил бы его, но к счастью, он никогда не будет на самом деле наниматься.
я предпочел бы, чтобы он провел 2 часа, пишущий чистый, почти функционирующий код, чем для него для удара чего-то вместе, которое работает.
Стиль программирования важен, особенно при работе над командой.
Это становится очень важным при поддержании унаследованных приложений, записанных несколькими людьми.
Часть того, чтобы быть профессионалом, и не только некоторой деточкой сценария, заботится о коде. Это о понимании, что кто-то еще считает этот код (Возможно, даже Вы!) шесть месяцев с этого времени. Поэтому необходимо сделать максимально легким поддержать.
Функция ftell ()
обычно возвращает unsigned long
, которое увеличивается только до 2 32 байтов (4 ГБ ) в 32-битных системах. Таким образом, вы не можете получить смещение файла для файла размером 24 ГБ, который поместится в 32-битный длинный
.
У вас может быть доступна функция ftell64 ()
или Стандартная функция fgetpos ()
может вернуть вам большее смещение.
Вы можете попробовать использовать предоставляемые ОС файловые функции CreateFile и ReadFile . Согласно теме Указатели файлов , позиция сохраняется как 64-битное значение.
Если вы не можете использовать 64-битный метод, предложенный Loadmaster, я думаю, вам придется разбить файл на части.
Этот ресурс , кажется, предполагает, что это возможно с помощью _telli64 (). Однако я не могу это проверить, так как не использую mingw.
Я не знаю никакого способа сделать это в одном файле, это немного похоже на взлом, но если правильное разделение файла не является реальным вариантом, вы можете написать несколько функций, которые временно разбивают файл: одну, которая использует ftell () для перемещения по файлу и меняет ftell () на новый файл, когда он достигает точки разделения, а затем другую, которая сшивает файлы вместе перед выходом. Абсолютно неудачный подход, но если не будет найдено лучшего решения, это может быть способом выполнить работу.
Даже если ftell () в библиотеке Microsoft C возвращает 32-битное значение и, таким образом, очевидно, будет возвращать фиктивные значения, когда вы достигнете 2 ГБ, простое чтение файла все равно должно работать нормально. Или вам тоже нужно поискать в файле? Для этого вам понадобятся _ftelli64 () и _fseeki64 ().
Обратите внимание, что в отличие от некоторых систем Unix, при открытии файла вам не нужен какой-либо специальный флаг, указывающий, что он находится в каком-то «64-битном режиме». Базовый Win32 API отлично справляется с большими файлами.