2018-08-13 (星期一)
2018-08-13 (星期一)
取得当前流位置
不同步lseek(),fseek()并不会返回更新过得位置.为此,另外提供了一个接口.ftell()函数可用于返回stream的当前流:
#include <stdio.h>
long ftell(FILE *stream)
发生错误时,它会返回-1并且将errno设定成适当的值.
此外,标准I/O链接库还提供了fgetpos():
#include <stdioh.h>
int fgetpos(FILE *stream, fpos_t *pos);
执行成功时,fgetpos()会返回0并且将stream的当前流位置放于pos;执行失败时,它会返回-1并且将errno设定成适当的值.如同fsetpos(),之所以会提共fgetpos(),只是因为非linux平台具体负责的文件位置数据类型.
刷新一个流
标准I/O链接库提供了一个接口,可用户将用户缓冲区写出到内核,以确保write()写入至流的所有数据可以被刷新.fflush()函数提供了此功能:
#include <stdio.h>
int fflush(FILE *stream);
调用此函数时,stream所指向的流中任何未被写入内核的数据会被刷新至内核.如果stream为NULL,侧进程中所打开的输入流均会被舒心.执行成功时,fflush()会返回0,执行失败时,它会返回EOF并且讲errno设定成适当的值.
要了解fflush()所造成的影响,必须了解C链接库所维护的缓冲区和内核的缓冲机制有何差异.
错误与EOF
有些标准I/O借口,例如fread(),无法有效的将执行失败的情况传达给调用者,因为他们没有提供任何机制区分错误和EOF.对于这些调用以及其他场合,这可以检查特定流的状态,以确定它到地址遇到了错误还是抵达了文件末端.为此标准I/O链接库提供了两个接口.函数ferror()用于测试stream智商是否设定了错误指示器:
#include <stdio.h>
int ferror (FILE *stream);
错误指示器由其他的标准I/O接口所定义,用于反应错误状态.如果设定了指示器,则此函数会返回一个非零值,否则返回0.
函数feof()用于测试stream之上是否是定了EOF指示器:
#include <stdio.h>
int feof (FILE *stream);
EOF 指示器由其他的标准I/O接口所设定,英语反应抵达了文件的末端.如果设定了指示器,此函数会返回一个非零值,否则返回0.
函数clearerr()用于清楚stream之上的错误和EOF指示器:
#include <stdio.h>
void clearerr(FILE *stream);
此函数没有返回值,而且也不会失败 (无法知道所提供流是否有效).你应该在检查错误与EOF指示器之后调用clearerr(),因为你无法在时候挽回被清除的指示器.
/* 'f'十个有效的流 */ if (ferror (f)) printf ("Error on f!\n"); if (feof (f)) printf ("EOF on f!\n"); clearerr(f);
取得相应的文件描述符
有时,取得支持指定流的文件描述符会很有用.例如,要对流进行系统调用时,如果不存在相关联的标准I/O函数,则可以通过它的文件描述符.要取得支持(backing)流的文件描述符,可以使用flleno ():
#include <stdio.h>
int fileno(FILE *stream);
执行成功时,fileno会返回与stream相关联的文件描述符;执行失败时,它会返回-1,这只会发生在指定了无效的流时,在此情况下,fileno()会把errno设定成EBADF.