Seeking
#include <stdio.h>
int fseek(FILE *stream, long offset, int whence);
如果whence设置为SEEK_SET,则文件位置设置为偏移量。
如果whence设置为SEEK_CUR,则将文件位置设置为当前位置加偏移量。
如果whence设置为SEEK_END,则文件位置设置为文件的末尾加上偏移量。
成功完成后,fseek()返回0,清除EOF指示符,并取消ungetc()的效果(如果有的话)。如果出现错误,则返回−1,并适当设置errno。最常见的错误是无效流(EBADF)和无效whence参数(EINVAL)。
或者,标准I/O还提供fsetpos():
#include <stdio.h>
int fsetpos(FILE *stream, fpos_t *pos);
他的效果等同于fseek() + SEEK_SET
成功后,它返回0。否则,它将返回−1,并酌情设置errno。
标准I/O还提供了rewind(),作为一种快捷方式:
#include <stdio.h>
void rewind(FILE *stream);
rewind(stream) == fseek(stream, 0, SEEK_SET)
//用的时候需要先清空errno
errno = 0;
rewind(stream);
if(errno)
/*error*/
获取当前stream的位置
和lseek()不同,fseek()不返回更新的位置。
ftell()返回流的当前流位置:
#include <stdio.h>
long ftell(FILE *stream);
如果出现错误,则返回−1,并适当设置errno。
或者,标准I/O也提供fgetpos():
#include <stdio.h>
int fgetpos(FILE *stream, fpos_t *pos);
成功后,fgetpos()返回0,并将流的当前流位置放在pos中。
失败时,它返回−1并适当地设置errno。
与fsetpos()一样,fgetpos()仅为具有复杂文件位置类型的非Unix平台提供。
Flushing
标准I/O库提供了一个接口,用于将用户缓冲区写入内核,确保写入流的所有数据都通过write()被刷新。
#include <stdio.h>
int fflush(FILE *stream);
在调用时,指向流中的任何未写入数据都会被刷新到内核。如果流为空,则会刷新进程中所有打开的输入流。成功后,fflush()返回0。如果失败, 它返回EOF,并适当地设置errno。
它不能保证数据在物理上被提交到任何介质,为了满足这一需要,可以使用类似fsync()之类的内容。
对于需要确保数据被提交到备份存储区的情况,您需要调用fflush(),然后紧接着是fsync():也就是说,首先要确保 将用户缓冲区写入内核,然后确保将内核的缓冲区写入磁盘。
Errors and End-of-File
检查给定流的状态以确定它是否遇到了错误或到达了文件的末尾,这是非常有用的。
标准I/O为此提供了两个接口。
函数ferror()测试对于流,错误指示符是否设置:
#include <stdio.h>
int ferror(FILE *stream);
错误指示符由其他标准I/O接口根据错误条件设置。如果设置了指示符,则函数返回非零值,否则返回0。
函数feof()测试EOF指示符是否已在流中设置:
#include <stdio.h>
int feof(FILE *stream);
当文件结束时,EOF指示符由其他标准I/O接口设置。如果设置了指示符,此函数将返回一个非零值,否则返回0。
函数clearerr()清除流的错误和EOF指示符:
#include <stdio.h>
void clearerr(FILE *stream);
if(ferror(f))
printf("Error on f!\n");
if(feof(f))
printf("EOF on f!\n");
clearerr(f);
网友评论