【C 语言】文件操作 ( ftell 函数 | 使用 ftell 函数获取当前指针位置 | 通过 ftell 计算文件大小 )

142 篇文章 95 订阅





一、ftell 函数



ftell() 函数的作用是 获取文件的 当前指针位置 相对于 文件首地址偏移字节数 ;


ftell 函数原型 :

#include <stdio.h>
long ftell(FILE *stream);

ftell 使用场景 : 随机方式存取文件时 , 使用 fseek 函数来回移动指针 , 不容易确定当前指针位置 , 通过调用 ftell 函数确定指针位置 ;





二、使用 ftell 函数获取当前指针位置



代码示例 :

  • 第一次打印指针位置 : 刚打开文件 , 还未读取数据 , 指针指向 0 位置 , 索引 0 ;
  • 第二次打印指针位置 : 跳过了 4 字节数据 , 偏移了 4 字节 , 指针指向第 5 字节 , 索引 4 ;
  • 第三次打印指针位置 : 跳过了 4 字节数据 , 又向后读取 2 字节 , 偏移了 6 字节 , 指向第七字节 , 索引 6 ;
#include <stdio.h>

int main()
{
    // 以写文本的方式向文件中写出数据
    FILE *p = fopen("D:/File/number.dat", "w");
    // 写出 10 个字符
    char array[10] = {1,2,3,4,5,6,7,8,9,10};
    // 将 10 个字符写出到文件中
    fwrite(array, 1, sizeof(array), p);
    // 关闭文件
    fclose(p);




    // 跳过 4 字节读取文件 2 字节
    FILE *p2 = fopen("D:/File/number.dat", "r");

    // 使用 ftell 函数获取当前指针位置
    int location = ftell(p2);
    // 刚打开文件 , 还未读取数据 , 指针指向 0 位置 ★★★
    printf("location = %d\n", location);

    // 读取数据缓冲区
    char array2[2];

    // 跳过 4 字节 , 此时当前位置是 0
    fseek(p2, 4, SEEK_CUR);

    // 使用 ftell 函数获取当前指针位置
    location = ftell(p2);
    // 跳过了 4 字节数据 , 偏移了 4 字节 ,
    // 指针指向第 5 字节 , 索引 4 ★★★
    printf("location = %d\n", location);

    // 读取 2 字节
    fread(array2, 1, sizeof(array2), p2);
    // 打印前 2 字节数据
    printf("%d , %d\n", array2[0], array2[1]);

    // 使用 ftell 函数获取当前指针位置
    location = ftell(p2);
    // 跳过了 4 字节数据 , 又向后读取 2 字节 ,
    // 偏移了 6 字节 , 指向第七字节 , 索引 6 ★★★
    printf("location = %d\n", location);

    return 0;
}

执行结果 :

在这里插入图片描述





三、通过 ftell 计算文件大小



代码示例 : 打开文件后 , 直接使用 fseek 跳转到文件末尾 , 然后使用 ftell 获取当前指针 , 打印出指针位置 , 即可获取文件大小 ;

#include <stdio.h>

int main()
{
    // 以写文本的方式向文件中写出数据
    FILE *p = fopen("D:/File/number.dat", "w");
    // 写出 10 个字符
    char array[10] = {1,2,3,4,5,6,7,8,9,10};
    // 将 10 个字符写出到文件中
    fwrite(array, 1, sizeof(array), p);
    // 关闭文件
    fclose(p);




    // 先打开文件
    FILE *p2 = fopen("D:/File/number.dat", "r");

    // 将文件指针移动到文件末尾
    fseek(p2, 0, SEEK_END);

    // 使用 ftell 函数获取当前指针位置
    int location = ftell(p2);

    // 通过读取当前文件指针位置, 即可获取文件大小 ★★★
    printf("filesize = %d\n", location);

    // 将文件指针恢复
    fseek(p2, 0, SEEK_SET);

    // 使用 ftell 函数获取当前指针位置
    location = ftell(p2);

    // 查看指针是否恢复 ★★★
    printf("location = %d\n", location);

    return 0;
}

执行结果 :

在这里插入图片描述

  • 24
    点赞
  • 104
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
在C语言中,ftellfseek文件操作的两个函数。 引用中的ftell函数用于获取文件指针当前位置相对于文件起始位置的字节偏移量。它的语法为`long int ftell(FILE *stream)`,其中stream是指向FILE类型的指针,表示要操作文件流。返回值是一个long int类型的数值,表示当前位置相对于文件起始位置的字节偏移量。 引用中的fseek函数用于设置文件指针位置。它的语法为`int fseek(FILE *stream, long int offset, int whence)`,其中stream是指向FILE类型的指针,表示要操作文件流;offset是一个long int类型的数值,表示要设置的偏移量;whence是一个整数,表示起始位置的参考点。这个函数的作用是将文件指针移动到相对于起始位置的特定偏移量处。返回值是一个整数,表示函数执行的结果,如果成功则返回0,否则返回非0的错误码。 在引用的代码中,ftell函数用于获取文件"file.txt"的总大小,而fseek函数用于将文件指针移动到文件开头的下一个位置。具体的操作流程如下: 1. 首先,使用fopen函数打开文件"file.txt",并将返回的FILE指针赋值给变量fp。 2. 使用fseek函数文件指针移动到文件末尾,通过设置偏移量为0和参考点为SEEK_END来实现。 3. 使用ftell函数获取文件指针当前位置相对于文件起始位置的字节偏移量,并将结果赋值给变量len,表示文件"file.txt"的总大小。 4. 使用fclose函数关闭文件"file.txt"。 5. 打开文件"file.txt",并将返回的FILE指针赋值给变量fp2。 6. 使用fseek函数文件指针移动到文件开头的下一个位置,通过设置偏移量为1和参考点为SEEK_SET来实现。 7. 使用fwrite函数将out数组中的4个字符写入文件"file.txt"。 8. 使用ftell函数获取文件指针当前位置相对于文件起始位置的字节偏移量,并将结果赋值给变量len2,表示文件"file.txt"的总大小。 9. 使用fclose函数关闭文件"file.txt"。 10. 打印输出文件"file.txt"的总大小(len和len2)。 11. 使用getchar函数等待用户输入,防止窗口自动关闭。 12. 返回0,表示程序执行成功。 总结起来,ftell函数用于获取文件的大小,而fseek函数用于设置文件指针位置。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [ftellfseek,fwrite,fopen等用法](https://blog.csdn.net/persimmon_xh/article/details/113564702)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值