美文网首页
Buffered I/O Seeking & Flushing

Buffered I/O Seeking & Flushing

作者: 无无吴 | 来源:发表于2019-08-13 13:18 被阅读0次

    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);
    

    相关文章

      网友评论

          本文标题:Buffered I/O Seeking & Flushing

          本文链接:https://www.haomeiwen.com/subject/eopvjctx.html