%>
将文件指针移到指定位置。
语法
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'.