标准文件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);