文件IO学习
标准IO库
流与文件对象
对应标准IO库,对文件的读写操作都是围绕着流(stream)进行的
流(文本流或者二进制流)主要是指一种逻辑上的概念,它提供或存储数据。产生数据的叫输入流,消耗数据的叫输出流。流的概念使我们不再关注具体细节和设备本身,是一个抽象的概念
缓冲
标准IO库提供缓冲的目的是尽可能的减少read和write的次数。1、全缓冲 2、行缓冲(当流涉及到终端时,通常是行缓冲) 3、无缓冲,不经过缓冲区直接写入
FILE* fopen(const char*restrict pathname , const char* restrict type);
成功则返回文件指针,出错则返回NULL
type 对应参数 r , w , a , r+ , w+ , a+分别对应只读,只写,追加,后三种在前三种的基础上均是以读写的方式打开。加b均可对应相应的二进制文件
int fclose(FILE* fp);
关闭一个打开的流,出错则返回EOF。
打开流之后,三种不同类型IO可选择
1.一个字符 2.一行字符 3.直接IO(fread fwrite)
1. int getc(FILE* fp)
2.int fgetc(FILE* fp)
3.int getchar(void)
每个流在FILE对象中维持了两个标志
出错标志
文件结束标志
输出函数
1.int putc(int c , FILE* fp)
2.int fputc(int c,FILE* fp)
3.int putchar(int c)
每次一行IO
输入
char * fgets(char* restrict buf , int n , FILE* restrict fp);
char* gets(char* buf)
输出
int fputs(const char* restrict str,FILE* restrict fp);
int puts(const char* str);
二进制IO
size_t fread(void* restrict ptr, size_t size , size_t nobj, FILE* restrict fp);
size_t fwrite(void* restrict ptr, size_t size , size_t nobj, FILE* restrict fp);
定位流
long ftell(FILE* fp)
若成功则返回当前文件位置指示,出错则返回-1
int fseek(FILE* fp, long offset , int whence)
如果执行成功,stream将指向以fromwhere(偏移起始位置:文件头0(SEEK_SET),当前位置1(SEEK_CUR),文件尾2(SEEK_END))为基准,偏移offset(指针偏移量)个字节的位置
格式化输出
int fprintf(FILE* restrict fp , const char*restrict format,..)
若成功则返回输出字节数,若输出出错则返回负值