fseek_fseeki64

将文件指针移到指定位置。

语法

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 操作是:

  • 使用相对于任何原始值的偏移 0 进行查找。

  • 使用 fseek_ftelli64 或使用 _fseeki64 时,从文件开头通过调用 ftell 所返回的偏移值进行查找。

此外,在文本模式中,CTRL+Z 将在输入时解释为文件结尾字符。 在打开以进行读取/写入的文件中,fopen 和所有相关例程将检查文件末尾的 Ctrl+Z 并在可能的情况下将其移除。 会移除它,因为将 fseekftell 或者将 _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'.

另请参阅

流 I/O
fopen_wfopen
ftell_ftelli64
_lseek_lseeki64
rewind