ftell
来自cppreference.com
在标头 <stdio.h> 定义
|
||
long ftell( FILE *stream ); |
||
返回流 stream
的文件位置指示器。
若流以二进制模式打开,则由此函数获得的值是从文件开始的字节数。
若流以文本模式打开,则由此函数返回的值未指定,且仅若作为 fseek() 的输入才有意义。
参数
stream | - | 要检验的文件流 |
返回值
成功时为文件位置指示器,若失败发生则为 -1L 。
失败时,设 errno 对象为实现定义的正值。
示例
演示 ftell()
带错误检查。向文件写出少量浮点值后再从中读取它们。
运行此代码
#include <stdio.h> #include <stdlib.h> /* 如果条件不满足,则退出程序并给出错误消息。 */ 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) { /* 准备浮点值的数组。 */ #define SIZE 5 double A[SIZE] = {1.1,2.,3.,4.,5.}; /* 写数组到文件。 */ 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); /* 读取浮点值到数组 B。 */ double B[SIZE]; file = fopen(fname, "rb"); check(file != NULL, "fopen()", __LINE__); long int pos = ftell(file); /* 位置指示器在文件起始 */ check(pos != -1L, "ftell()", __LINE__); printf("pos: %ld\n", pos); const int read_count = fread(B, sizeof(double), 1, file); /* 读取一个浮点值 */ check(read_count == 1, "fread()", __LINE__); pos = ftell(file); /* 读取一个浮点值后的位置指示器 */ check(pos != -1L, "ftell()", __LINE__); printf("pos: %ld\n", pos); printf("B[0]: %.1f\n", B[0]); /* 打印一个浮点值 */ return EXIT_SUCCESS; }
可能的输出:
0 8 B[0]: 1.1