← Назад к вопросам

Что такое fseek?

1.0 Junior🔥 91 комментариев
#Язык C++

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое fseek

fseek — это функция стандартной библиотеки C, которая устанавливает позицию указателя в файловом потоке. Она позволяет вам перемещаться по файлу без необходимости читать все данные подряд, что особенно полезно при работе с большими файлами.

Синтаксис

#include <cstdio>

int fseek(FILE* stream, long offset, int whence);

Параметры:

  • stream — указатель на файловый поток (FILE*)
  • offset — смещение в байтах от позиции, определённой whence
  • whence — точка отсчета:
    • SEEK_SET (0) — начало файла
    • SEEK_CUR (1) — текущая позиция
    • SEEK_END (2) — конец файла

Возвращаемое значение:

  • 0 — успех
  • ненулевое значение — ошибка

Примеры использования

Пример 1: Перемещение в начало файла

FILE* file = fopen("data.bin", "rb");
if (file != nullptr) {
    fseek(file, 0, SEEK_SET);  // В начало файла
    fclose(file);
}

Пример 2: Перемещение в конец файла

FILE* file = fopen("log.txt", "ab");
if (file != nullptr) {
    fseek(file, 0, SEEK_END);  // В конец файла
    long file_size = ftell(file);
    std::cout << "Размер файла: " << file_size << " байт" << std::endl;
    fclose(file);
}

Пример 3: Перемещение от текущей позиции

FILE* file = fopen("data.bin", "rb");
if (file != nullptr) {
    fseek(file, 10, SEEK_CUR);  // Переместиться на 10 байт вперёд
    fclose(file);
}

Пример 4: Чтение конкретной записи в бинарном файле

struct Record {
    int id;
    char name[50];
};

FILE* file = fopen("records.bin", "rb");
if (file != nullptr) {
    // Перейти к 5-й записи (индекс 4)
    fseek(file, 4 * sizeof(Record), SEEK_SET);
    
    Record rec;
    if (fread(&rec, sizeof(Record), 1, file) == 1) {
        std::cout << "ID: " << rec.id << ", Name: " << rec.name << std::endl;
    }
    
    fclose(file);
}

Важные моменты

Комбинация с ftell:

long current_pos = ftell(file);  // Получить текущую позицию
fseek(file, current_pos + 100, SEEK_SET);  // Переместиться на 100 байт вперёд

Очистка буфера:

fseek(file, 0, SEEK_SET);
fflush(file);  // Очистить буфер вывода

Обработка ошибок:

if (fseek(file, offset, SEEK_SET) != 0) {
    std::cerr << "Ошибка: не удалось переместиться в файле" << std::endl;
}

Ограничения

  • Работает только с файлами, открытыми в бинарном режиме или текстовом режиме: Для текстовых файлов может быть непредсказуемо на некоторых платформах
  • Размер смещения: В старых системах long может быть только 32-битным (до 2 ГБ)
  • Производительность: Частые вызовы fseek замедляют работу

Современная альтернатива

В C++ рекомендуется использовать std::ifstream и std::ofstream с методом seekg() / seekp():

#include <fstream>

std::ifstream file("data.bin", std::ios::binary);
file.seekg(100, std::ios::beg);  // Перемещение на 100 байт от начала

char buffer[10];
file.read(buffer, 10);

Заключение

fseek — это фундаментальная функция для работы с файлами в C. Она позволяет эффективно навигировать по большим файлам, читать данные в случайном порядке и реализовать сложные операции с файловыми структурами. В современном C++ предпочтение отдаётся потокам (streams), но знание fseek остаётся критически важным.

Что такое fseek? | PrepBro