Spec-Zone.ru › C

ftell

Определена в заголовочном файле <stdio.h>
long ftell( FILE* stream );

Возвращает индикатор позиции в файловом потоке stream.

Если поток открыт в двоичном режиме, значение, полученное этой функцией, представляет собой количество байтов от начала файла.

Если поток открыт в текстовом режиме, значение, возвращаемое этой функцией, не определено и имеет смысл только в качестве входного значения для fseek().

Параметры

stream - файловый поток для проверки

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

Индикатор позиции в файле при успешном выполнении или -1L в случае ошибки.

При ошибке переменной errno присваивается положительное значение, определяемое реализацией.

Примечания

В Windows для работы с файлами размером более 2 ГиБ можно использовать _ftelli64.

Пример

Демонстрирует ftell() с проверкой ошибок. Записывает в файл, а затем считывает из него несколько значений с плавающей точкой (FP).

#include <stdio.h>
#include <stdlib.h>

/* If the condition is not met then exit the program with error message. */
void check(_Bool condition, const char* func, int line)
{
    if (condition)
        return;
    perror(func);
    fprintf(stderr, "%s failed in file %s at line # %d\n", func, __FILE__, line - 1);
    exit(EXIT_FAILURE);
}

int main(void)
{
    /* Prepare an array of FP values. */
    #define SIZE 5
    double A[SIZE] = {1.1, 2.0, 3.0, 4.0, 5.0};

    /* Write array to a file. */
    const char* fname = "/tmp/test.bin";
    FILE* file = fopen(fname, "wb");
    check(file != NULL, "fopen()", __LINE__);

    const int write_count = fwrite(A, sizeof(double), SIZE, file);
    check(write_count == SIZE, "fwrite()", __LINE__);

    fclose(file);

    /* Read the FP values into array B. */
    double B[SIZE];
    file = fopen(fname, "rb");
    check(file != NULL, "fopen()", __LINE__);

    long int pos = ftell(file); /* position indicator at start of file */
    check(pos != -1L, "ftell()", __LINE__);
    printf("pos: %ld\n", pos);

    const int read_count = fread(B, sizeof(double), 1, file); /* read one FP value */
    check(read_count == 1, "fread()", __LINE__);

    pos = ftell(file); /* position indicator after reading one FP value */
    check(pos != -1L, "ftell()", __LINE__);
    printf("pos: %ld\n", pos);
    printf("B[0]: %.1f\n", B[0]); /* print one FP value */

    return EXIT_SUCCESS;
}

Возможный вывод:

pos: 0
pos: 8
B[0]: 1.1

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
    • 7.21.9.4 Функция ftell (стр.: TBD)
  • Стандарт C17 (ISO/IEC 9899:2018):
    • 7.21.9.4 Функция ftell (стр.: TBD)
  • Стандарт C11 (ISO/IEC 9899:2011):
    • 7.21.9.4 Функция ftell (стр.: 337-338)
  • Стандарт C99 (ISO/IEC 9899:1999):
    • 7.19.9.4 Функция ftell (стр.: 303-304)
  • Стандарт C89/C90 (ISO/IEC 9899:1990):
    • 4.9.9.4 Функция ftell

См. также

fgetpos
получает индикатор позиции в файле
(функция)
fseek
перемещает индикатор позиции в файле в заданное место
(функция)
fsetpos
перемещает индикатор позиции в файле в заданное место
(функция)
Документация по C++ для ftell

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/io/ftell

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API