Если вы используете файловые потоки вместо файловых дескрипторов, то вы можете написать себе (простую) функцию, аналогичную системному вызову POSIX pread()
.
Вы можете легко эмулировать его, используя потоки вместо файловых дескрипторов 1 . Возможно, вам следует написать себе такую функцию (которая немного отличается от той, которую я предложил в комментарии):
size_t fpread(void *buffer, size_t size, size_t mitems, size_t offset, FILE *fp)
{
if (fseek(fp, offset, SEEK_SET) != 0)
return 0;
return fread(buffer, size, nitems, fp);
}
Это разумный компромисс между соглашениями pread()
и fread()
.
Как будет выглядеть синтаксис вызова функции? Например, чтение со смещения 732, а затем снова со смещения 432 (оба с начала файла) и файлового потока с именем f
.
Поскольку вы не сказали, сколько байтов нужно прочитать, я собираюсь брать 100 каждый раз. Я предполагаю, что целевые переменные (буферы) равны buffer1
и buffer2
, и что они достаточно большие.
if (fpread(buffer1, 100, 1, 732, f) != 1)
...error reading at offset 732...
if (fpread(buffer2, 100, 1, 432, f) != 1)
...error reading at offset 432...
Счетчик возврата - это количество полных единиц по 100 байт каждая; либо 1 (получил все), либо 0 (что-то пошло не так).
Есть и другие способы написания этого кода:
if (fpread(buffer1, sizeof(char), 100, 732, f) != 100)
...error reading at offset 732...
if (fpread(buffer2, sizeof(char), 100, 432, f) != 100)
...error reading at offset 432...
Это читает 100 одиночных байтов каждый раз; тест гарантирует, что вы получили все 100 из них, как и ожидалось. Если вы захватите возвращаемое значение во втором примере, вы сможете узнать, сколько данных вы получили. Было бы очень удивительно, если бы первое чтение прошло успешно, а второе не удалось; какой-то другой программе (или потоку) пришлось бы обрезать файл между двумя вызовами fpread()
, но, как известно, более забавные вещи происходили.
1 Эмуляция не будет идеальной; вызов pread()
обеспечивает гарантированную атомарность, которую не обеспечит комбинация fseek()
и fread()
. Но на практике это редко будет проблемой, если только у вас нет нескольких процессов или потоков, одновременно обновляющих файл, когда вы пытаетесь расположить и прочитать его.