fseek ()-fseeko ()- 重新定位文件位置
格式
#include <stdio.h>
int fseek(FILE *stream, long int offset, int origin);
int fseeko(FILE *stream, off_t offset, int origin);语言级别
ANSI
线程安全
是
集成文件系统界面
当在编译命令上指定 SYSIFCOPT (*NOIFSIO) 时, fseeko() 函数不可用。
描述
fseek() 和 fseeko() 函数将与 流 关联的当前文件位置更改为该文件中的新位置。 流 上的下一个操作将在新位置执行。 在打开以进行更新的 流 上,下一个操作可以是读操作或写操作。
fseeko() 函数与 fseek() 完全相同,但 offset 参数的类型为 off_t。
原点 必须是 <stdio.h>中定义的下列其中一个常量:
- 起源
- 定义
- SEEK_SET
- 文件开头
- SEEK_CUR
- 文件指针的当前位置
- SEEK_END
- 文件末尾
对于二进制流,您还可以更改文件末尾以外的位置。 尝试在文件开头之前进行定位会导致错误。 如果成功,那么
fseek() 或 fseeko() 函数将清除文件结束指示符,即使 origin 为 SEEK_END时也是如此,并撤销 ungetc() 函数在同一流上的任何前面的作用。注: 对于以文本方式打开的流,
fseek() 和 fseeko() 函数的使用有限,因为某些系统转换 (例如回车符-换行符和换行符之间的转换) 可能会产生意外结果。 对于以文本方式打开的流,可以依赖的唯一 fseek() 和 fseeko() 操作是使用相对于任何源值为零的偏移量进行查找,或者从文件开头使用从对 ftell() 或 ftello() 函数的调用返回的偏移量值进行查找。 对 ftell() 和 ftello() 函数的调用受其限制。返回值
如果 fseek() 或 fseeko() 函数成功移动指针,那么它将返回 0 。 非零返回值指示错误。 在无法查找的设备 (例如终端和打印机) 上,返回值为非零。
errno 的值可以设置为:
- 值
- 含义
- EBADF
- 文件指针或描述符无效。
- Ebadseek
- 寻道操作的偏移量不正确。
- ENODEV
- 在错误的设备上尝试了操作。
- ENOTOPEN
- 文件未打开。
- ERECIO
- 文件已打开以进行记录 I/O。
- ESTDERR
- 无法打开
stderr。 - 埃斯特丁
- 无法打开
stdin。 - ESTDOUT
- 无法打开
stdout。 - EIOERROR
- 发生了不可恢复的I/O错误。
- EIORECERR
- 发生了可恢复的I/O错误。
使用 type=record打开的文件不支持 fseek() 和 fseeko() 函数。
示例
此示例打开文件 myfile 以进行读取。 执行输入操作后,
fseek() 会将文件指针移动到文件的开头。#include <stdio.h>
#define MAX_LEN 10
int main(void)
{
FILE *stream;
char buffer[MAX_LEN + 1];
int result;
int i;
char ch;
stream = fopen("mylib/myfile", "r");
for (i = 0; (i < (sizeof(buffer)-1) &&
((ch = fgetc(stream)) != EOF) && (ch != '\n')); i++)
buffer[i] = ch;
result = fseek(stream, 0L, SEEK_SET); /* moves the pointer to the */
/* beginning of the file */
if (result == 0)
printf("Pointer successfully moved to the beginning of the file.\n");
else
printf("Failed moving pointer to the beginning of the file.\n");
}