fseek , fseeko , fseeko64, rewind , ftell , ftello , ftello64, fgetpos , fgetpos64, fsetpos 或 fsetpos64 子例程
用途
对流的文件指针进行重新定位。
库
标准 C 库 (libc.a)
语法
#include <stdio.h>
void rewind (Stream)
FILE *Stream; long int ftell (Stream)
FILE *Stream; int fgetpos (Stream, Position)
FILE *Stream;
fpos_t *Position;
off_t int ftello (Stream)
FILE *Stream; off64_t int ftello64 (Stream)
FILE *Stream; int fgetpos64 (Stream, Position)
FILE *Stream;
fpos64_t *Position;
描述
Fseek, 菲塞科 和 fseeko64 子例程设置下一个输入或输出操作在 "流" 参数指定的 I/O 流上的位置。 位置 (如果下一个操作由 偏移量 参数确定) ,可以是正数或负数。
Fseek, 菲塞科 和 fseeko64 子例程设置与指定 流 关联的文件指针,如下所示:
- 如果将 沃恩斯 参数设置为 SEEK_SET 值,那么会将指针设置为 偏移量 参数的值。
- 如果将 沃恩斯 参数设置为 SEEK_CUR 值,那么会将指针设置为其当前位置加上 偏移量 参数的值。
- 如果 沃恩斯 参数设置为 SEEK_END 值,那么会将指针设置为文件大小加上 偏移量 参数的值。
如果对尚未使用 福通 子例程打开的文件进行尝试,那么 Fseek, 菲塞科和 fseeko64 子例程不成功。 尤其是, Fseek 子例程不能用在终端上或用 波本 子例程打开的文件上。 当生成的偏移量大于可以正确返回的值时, Fseek 和 菲塞科 子例程也将失败。
倒带 子例程等价于使用以下参数值调用 Fseek 子例程:(流, SEEK_SET 和 SEEK_SET),但是 倒带 子例程不返回值。 在 Fseek 子例程可能失败的情况下 (例如,当 Fseek 子例程与缓冲 I/O 流配合使用时) ,请勿使用 倒带 子例程。 在此情况下,请使用 Fseek 子例程,以便可以检查错误条件。
Fseek, 菲塞科, fseeko64 和 倒带 子例程会撤销 难忘 和 温格特韦克 子例程的任何影响,并清除同一流上的文件结束符 (EOF) 指示符。
Fseek, 菲塞科和 fseeko64 功能允许将文件位置指示符设置为超过文件中现有数据的末尾。 如果稍后写入数据,那么在间隔中对数据的后续读取将返回值为 0 的字节,直到数据实际写入间隔中为止。
对 费特波斯 或 fsetpos64 子例程的成功调用将清除 EOF 指示符,并撤销 难忘 和 温格特韦克 子例程的任何影响。
在 Fseek, 菲塞科, fseeko64 或 倒带 子例程之后,打开以进行更新的文件上的下一个操作可以是输入或输出。
费得, 弗泰洛 和 ftello64 子例程返回 流 参数所指向的流的文件位置指示符的当前位置值。 如果生成的偏移量大于可以正确返回的值,那么 费得 和 弗泰洛 将失败。
费格波斯 和 fgetpos64 子例程存储 职位 参数所指向的对象中 流 参数所指向的流的文件位置指示符的当前值。 费特波斯 和 fsetpos64 根据 职位 参数的值为 流 设置文件位置指示符,该值必须是先前对 费格波斯 或 fgetpos64 子例程的调用的结果。 如果生成的偏移量大于可以正确返回的值,那么 费格波斯 和 费特波斯 将失败。
参数
| 项 | 描述 |
|---|---|
| 流 | 指定输入/输出 (I/O) 流。 |
| 偏移量 | 确定下一个操作的位置。 |
| whence | 确定与 流 参数相关联的文件指针的值。 |
| 位置 | 指定文件位置指示符的值。 |
返回值
在成功完成时, Fseek, 菲塞科 和 fseeko64 子例程返回值 0。 否则,返回值为-1。
在成功完成时, 费得, 弗泰洛 和 ftello64 子例程返回当前字节相对于与指定流关联的文件的开头的偏移量。 否则,将返回一个-1的long int值,并设置errno全局变量。
在成功完成后, 费格波斯, fgetpos64, 费特波斯 和 fsetpos64 子例程将 0 值 0。 否则,会返回非零值,并将 错误号 全局变量设置为特定错误。
错误代码
如果 Fseek, 菲塞科, fseeko64, 费得, 弗泰洛或 ftello64 子例程不成功,因为流是无缓冲的,或者需要清空流缓冲区,并且对子例程的调用导致调用底层 寻求 或 写 子例程,那么它会返回以下一个或多个错误代码:
| 项 | 描述 |
|---|---|
| 再一次 | 指示为文件描述符设置了 O_NONBLOCK 标志,从而使写操作中的进程延迟。 |
| EBADF | 指示 流 参数所基于的文件描述符未打开以进行写入。 |
| EFBIG | 指示已尝试写入超过该进程的文件大小限制或最大文件大小的文件。 |
| EFBIG | 指示该文件是常规文件,并且已尝试在与相应流关联的最大偏移量处或超过该偏移量最大值时进行写入。 |
| EINTR | 指示写操作已终止,因为该进程已接收到信号,并且未传输任何数据,或者实现不报告此文件的部分传输。 |
| EIO | 指示该进程是尝试对其控制终端执行 写 子例程的后台进程组的成员,设置了 停止 标志,该进程未忽略或阻止 SIGTTOU 信号,并且该进程的进程组是孤立进程。 此错误也可能在依赖于实现的条件下返回。 |
| ENOSPC | 指示包含该文件的设备上不存在剩余可用空间。 |
| EPIPE | 指示已尝试写入未打开的管道或 FIFO ,以供任何进程读取。 SIGPIPE 信号也将发送至该进程。 |
| EINVAL | 表示 沃恩斯 参数无效。 生成的文件位置指示符将被设置为负值。 EINVAL 错误代码不应用于 费得 和 倒带 子例程。 |
| EsPIPE | 指示 流 参数所依据的文件描述符与管道, FIFO 或套接字相关联。 |
| Eoverflow | 指示对于 Fseek,生成的文件偏移量将是无法在类型为 长的对象中正确表示的值。 |
| Eoverflow | 指示对于 菲塞科,生成的文件偏移量将是无法在类型为 偏移的对象中正确表示的值。 |
| ENXIO | 指示请求是由不存在的设备发出的,或者该请求超出了该设备的功能范围。 |
由于以下条件, 费格波斯 和 费特波斯 子例程不成功:
| 项 | 描述 |
|---|---|
| EINVAL | 指示 流 参数或 职位 参数无效。 EINVAL 错误代码不应用于 费格波斯 子例程。 |
| EBADF | 指示 流 参数所基于的文件描述符未打开以进行写入。 |
| EsPIPE | 指示 流 参数所依据的文件描述符与管道, FIFO 或套接字相关联。 |
在以下条件下, Fseek, 菲塞科, 费得, 弗泰洛, 费格波斯和 费特波斯 子例程不成功:
| 项 | 描述 |
|---|---|
| Eoverflow | 无法正确返回生成的结果。 |