Skip to content
Published at:

标准文件IO

标准文件IO和系统调用open/read/write的关系:

标准文件IO会去调用open/read/write系统调用,内部是对系统调用的封装

系统调用open/read/write有什么问题:

程序中使用open/read/write系统调用,程序会频繁的在用户态内核态去切换;

为了减少系统调用的次数,标准文件IO增加了缓冲区,来提高效率

针对缓冲区Buffer的几个函数:

  • void setbuf(FILE *stream, char *buf);
  • void setbuffer(FILE *stream, char *buf, size_t size);
  • void setlinebuf(FILE *stream);
  • int setvbuf(FILE *stream, char *buf, int mode, size_t size);
  • int fflush(FILE *stream);

参数mode:

  • IONBF: unbuffered 不带缓冲
  • IOLBF: line buffered 行缓冲
  • IOFBF: fully buffered 全缓冲
c
#include <stdio.h>
#include <stdio_ext.h>

int main(void) {
    FILE* f;
    size_t bufsize;

    f = fopen("test.txt", "wb");
    if (f == NULL) {
        perror("fopen failed\n");
        return -1;
    }

    bufsize = __fbufsize(f);
    printf("The buffer size is %zd\n", bufsize);

    putc('\n', f);
    bufsize = __fbufsize(f);
    printf("The buffer size is %zd\n", bufsize);

    fclose(f);
    return 0;
}

操作相关的函数:

  • FILE *fopen(const char *path, const char *mode);
  • int fclose(std::FILE* stream);
  • size_t fread(void *buffer, size_t size, size_t count, FILE *stream);
  • size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

"光标"位置相关函数:

  • int fseek(FILE *stream, long offset, int whence);
  • long ftell(FILE *stream);
  • void rewind(FILE *stream);

"工具"函数:

  • int fgetc(FILE *stream);
  • char *fgets(char *s, int size, FILE *stream);
  • int getc(FILE *stream);

格式化IO:

  • int fprintf(FILE *stream, const char *format, ... );
  • int fscanf(FILE *stream, const char *format, ... );

other:

  • void clearerr(FILE *stream);
  • int feof(FILE *stream);
  • int ferror(FILE *stream);
  • int fileno(FILE *stream);

临时文件:

  • FILE *tmpfile(void);