Поиск большого файла со смещением off64_t не работает

#c #fseek

Вопрос:

Предполагается, что это очень простая операция поиска в большом файле, однако она всегда завершается неудачно и никогда не изменяет смещение. У меня такое чувство, что я что-то упускаю в своем коде. Минимальный воспроизводимый пример:

 #define _FILE_OFFSET_BITS 64
#define __USE_FILE_OFFSET64 1
#include <stdio.h>
#include <iostream>

int main() {
    FILE* file = fopen64("data", "w b");
    off64_t offset1 = 5000;
    off64_t offset2 = 1013309916216033280;
    fseeko64(file, offset1, SEEK_SET);
    std::cout << "Offset at: " << ftello64(file);
    fseeko64(file, offset2, SEEK_SET);
    std::cout << " Offset at: " << ftello64(file);
    if(offset2 != ftello64(file)){
        std::cerr << "Cannot seek to offset2.";
    }
    fclose(file);
    return 0;
}
 

Ожидаемый результат «Смещение на: 5000 Смещение на: 1013309916216033280»

Текущий выходной сигнал «Не удается выполнить смещение 2.Смещение при: 5000 Смещение при: 5000»

Я неправильно понял функциональность функции fseeko64? или я реализую это неправильно?? Кроме того, функция perror выводит «Недопустимый аргумент» без каких-либо дополнительных подробностей.

Комментарии:

1. ftell(), ftello(), ftello64() : возвращает текущее положение указателя файла потока

2. У вас действительно есть файл с 1013309916216033280 байтами? Отличная причина всегда проверять возврат, чтобы определить, удалась функция или нет.

3. @DavidC.Рэнкин, вероятно, нет. 1013309916216033280 B = 1013309 ТБ

4. @paladin Я знаю о функциональности ftello64, я просто использовал ее, чтобы показать, что смещение файла не изменилось после второго fseeko64.

5. @DavidC.Ранкин число в этом примере просто случайное, любое число, превышающее 32 бита, терпит неудачу. Кроме того, файл, с которым я работаю, разрежен, поэтому о достижении такого числа не может быть и речи, но это не означает, что все данные распределены, вероятно, менее 20%.