fsetpos ()- 设置文件位置

格式

#include <stdio.h>
int fsetpos(FILE *stream, const fpos_t *pos);

语言级别

ANSI

线程安全

描述

fsetpos() 函数根据 pos指向的值将与 关联的任何文件位置移动到文件中的新位置。 pos 的值是通过先前对 fgetpos() 库函数的调用获取的。

如果成功, fsetpos() 将清除文件结束指示符,并撤销任何先前 ungetc() 函数对同一流的影响。

fsetpos() 调用之后,可以输入或输出处于更新方式的流上的下一个操作。

返回值

如果 fsetpos() 成功更改文件的当前位置,那么将返回 0。 非零返回值指示错误。

errno 的值可以设置为:
含义
EBADF
文件指针或描述符无效。
EBADPOS
指定的位置无效。
EINVAL
为自变量指定的值不正确。 当您使用 *IFSIO 编译程序并且正在使用 QSYS 文件系统中的文件时,可能会收到此错误号。 例如, "/qsys.lib/qtemp.lib/myfile.file/mymem.mbr"
ENODEV
在错误的设备上尝试了操作。
ENOPOS
在指定位置没有记录。
ERECIO
文件已打开以进行记录 I/O。
ESTDERR
无法打开 stderr
埃斯特丁
无法打开 stdin
ESTDOUT
无法打开 stdout
EIOERROR
发生了不可恢复的I/O错误。
EIORECERR
发生了可恢复的I/O错误。
fsetpos() 函数不能用于使用 type=record打开的文件。 此外,在以下情况下, fsetpos() 函数只能支持将位置设置为文件开头:
  • 您的程序是使用 *IFSIO 编译的,并且
  • 您正在处理 QSYS 文件系统中的文件。

示例

此示例打开文件 mylib/myfile 以进行读取。 执行输入操作后, fsetpos() 会将文件指针移动到文件开头,并重新读取第一个字节。
#include  <stdio.h>
 
FILE *stream;
 
int main(void)
{
   int retcode;
   fpos_t pos;
   char ptr[20];  /* existing file 'mylib/myfile' has 20 byte records */
   int  i;
 
   /* Open file, get position of file pointer, and read first record */
 
   stream = fopen("mylib/myfile", "rb");
   fgetpos(stream,&pos);
   if (!fread(ptr,sizeof(ptr),1,stream))
       perror("fread error");
   else printf("1st record: %s\n", ptr);
 
   /* Perform another read operation on the second record       */
   /*  - the value of 'pos' changes                             */
   if (!fread(ptr,sizeof(ptr),1,stream))
       perror("fread error");
   else printf("2nd record: %s\n", ptr);
 
   /* Re-set pointer to start of file and re-read first record  */
   fsetpos(stream,&pos);
   if (!fread(ptr,sizeof(ptr),1,stream))
       perror("fread error");
   else printf("1st record again: %s\n", ptr);
 
   fclose(stream);
}

相关信息