将文件指针移到指定位置。
语法
int fseek(
FILE *stream,
long offset,
int origin
);
int _fseeki64(
FILE *stream,
__int64 offset,
int origin
);
参数
stream
指向 FILE 结构的指针。
offset
origin 中的字节数。
origin
初始位置。
返回值
如果成功,则 fseek 和 _fseeki64 返回 0。 否则,返回一个非零值。 在无法查找的设备上,返回值是未定义的。 如果 stream 为空指针,或者 origin 不是下述允许的值之一,fseek 和 _fseeki64 会调用无效的参数处理程序,如参数验证中所述。 如果允许执行继续,则这些功能将 errno 设置为 EINVAL 并返回 -1。
注解
fseek 和 _fseeki64 函数将与 stream 关联的文件指针(如有)一起移动到新位置,该位置在 origin 中为 offset 个字节。 该流上的下一步操作发生在新位置。 在准备更新的流上,下一个操作可以是读取或写入。 参数 origin 必须是 STDIO.H 中定义的以下常量之一:
| origin 值 | 含义 |
|---|---|
SEEK_CUR |
文件指针的当前位置。 |
SEEK_END |
文件结尾。 |
SEEK_SET |
文件开头。 |
可以使用 fseek 和 _fseeki64 在文件的任何位置重新定位指针。 此外还可以在文件结尾外放置指针。 fseek 和 _fseeki64 清除文件结尾指示器,并使先前针对 stream 的任何 ungetc 调用失效。
当文件打开以追加数据时,当前文件位置由最后的 I/O 操作确定,而不是由发生下一个写入的位置确定。 如果在为追加而打开的文件中尚未发生 I/O 操作,则文件位置是文件开头。
对于在文本模式下打开的流,fseek 和 _fseeki64 的用途相当有限,因为回车-换行转换可能导致 fseek 和 _fseeki64 产生意外结果。 唯一保证作用于在文本模式下打开的流的 fseek 和 _fseeki64 操作是:
此外,在文本模式中,CTRL+Z 将在输入时解释为文件结尾字符。 在打开以进行读取/写入的文件中,fopen 和所有相关例程将检查文件末尾的 Ctrl+Z 并在可能的情况下将其移除。 会移除它,因为将 fseek 和 ftell 或者将 _fseeki64 和 _ftelli64 结合使用在以 CTRL+Z 结尾的文件中移动,可能导致 fseek 或 _fseeki64 在文件结尾附近无法正常工作。
当 CRT 打开以字节顺序标记 (BOM) 开头的文件时,文件指针位于 BOM 后面。 (即,位于文件实际内容的开头)。 如果需要 fseek 到文件开头,请使用 ftell 来获取初始位置,然后 fseek 到该位置而不是位置 0。
此函数在执行期间将锁定其他线程,因此是线程安全的。 有关非锁定版本,请参阅 _fseek_nolock、_fseeki64_nolock。
默认情况下,此函数的全局状态范围限定为应用程序。 若要更改此行为,请参阅 CRT 中的全局状态。
要求
| 函数 | 必需的标头 |
|---|---|
fseek |
<stdio.h> |
_fseeki64 |
<stdio.h> |
有关兼容性的详细信息,请参阅 兼容性。
示例
// crt_fseek.c
// This program opens the file FSEEK.OUT and
// moves the pointer to the file's beginning.
#include <stdio.h>
int main( void )
{
FILE *stream;
char line[81];
int result;
if ( fopen_s( &stream, "fseek.out", "w+" ) != 0 )
{
printf( "The file fseek.out was not opened\n" );
return -1;
}
fprintf( stream, "The fseek begins here: "
"This is the file 'fseek.out'.\n" );
result = fseek( stream, 23L, SEEK_SET);
if( result )
perror( "Fseek failed" );
else
{
printf( "File pointer is set to middle of first line.\n" );
fgets( line, 80, stream );
printf( "%s", line );
}
fclose( stream );
}
File pointer is set to middle of first line.
This is the file 'fseek.out'.