fopen
函数原型:FILE *fopen(const char *filename, const char *mode);
返回FILE*,这个返回值可以理解为,指向打开文件的一个指针,通过它可以找到该文件并进行操作;形参const char* filename,以当前路径,输入你要打开的文件路径及名称;形参const char* mode输入你要赋予操作该文件的权限类型
const char* mode的常用类型:
举例:
FILE* fp = fopen("./test.txt","w");打开一个当前路径下test.txt的文件,赋予写入权限(如果没有文件就创建),fp就是指向该文件的指针,其他文件操作函数形参为FILE*类型的地方基本都是传入fp
一般需要判断是否打开成功,如果未成功打开,return结束程序,以免后续对文件的操作产生错误
fclose
函数原型:int fclose( FILE *fp );
返回值类型为int,如果流fp成功关闭,fclose 返回 0,否则返回EOF(-1),形参FILE* fp为需要关闭的文件,关闭后需要fp =NULL;赋空(与动态内存函数free()类似)
fwrite
函数原型:size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
返回值size_t(无符号long),返回写入的数据量(多少个size_t size);形参const void* ptr,指向你要写入文件的内容的区域(例:创建一个数组并赋值,数组地址作为该形参传入,写入文件的就是该数组的数据);size_t size指你要写入的一个数据大小/byte字节,size_t numemb指你要写入多少个该类型数据;FILE* stream就是上面说过的指向文件的"指针"FILE* fp,标准说法是流
举例:
FILE* fp = fopen("./test.txt","w");
int a[5] = {1,2,3,4,5};
size_t size = fwrite(a,sizeof(int),5,fp);当前路径下打开一个test.txt文件,创建一个int数组a,将a的内容写入进fp指向的test.txt文件当中
fread
函数原型:size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
返回值size_t返回实际读取的元素个数;形参void* buffer指接收读取数据的指针指向区域,size_t size指每个读取的元素所占字节数;size_t count指要读取的元素个数;FILE* stream指要读取的文件指针
举例:
FILE* fp = fopen("./test.txt","r");
int a[5] ;
size_t size = fread(a,sizeof(int),5,fp);将当前路径下的test.txt文件的前5个int类型读取到数组a中
fseek、ftell、rewind
函数原型:long ftell(FILE* stream); 获取当前文件指针所在的位置
函数原型:void rewind(FILE* stream); 将文件指针移动带文件开头
着重讲一下fseek函数,因为多了一个基准位置参数
函数原型:int fseek(FILE* stream,long offset,int whence);
返回值int,成功,返回0,失败返回非0值,并设置error的值,可以用perror()函数输出错误
形参FILE* stream指要操作的文件,long offset指文件指针要移动的距离(偏移量/byte字节),int whence指文件指针从哪个位置开始移动 long offset距离,这个地方有3个固定参数:
SEEK_SET 把文件头作为基准位置开始移动
SEEK_CUR 把当前文件指针位置作为基准位置开始移动
SEEK_END 把文件尾作为基准位置开始移动
如果long offset传正数,就往后移动,传负数就向前移动;这些函数主要就是改变读、写文件的位置
举例:
FILE* fp = fopen("./test.txt","w+");
fseek(fp,4,SEEK_SET); 读写位置从文件头向后移动4个字节
fseek(fp,4,SEEK_CUR); 读写位置从当前文件指针位置向后移动4个字节
fseek(fp,-4,SEEK_END); 读写位置从文件尾向前移动4个字节
fprintf、fscanf
函数原型:int fprintf (FILE* stream, const char*format, [argument]);
返回值一般不关注,FILE* stream指要操作的文件指针,const char* format与printf函数的第一个形参相同,[argument]与printf函数的第二个形参相同
函数原型:int fscanf(FILE *stream, char *format,[argument...]);
返回值一般不关注,FILE* stream指要操作的文件指针,const char* format与scanf函数的第一个形参相同,[argument]与scanf函数的第二个形参相同
这两个函数效率太低,不适合处理大数据量的文件
stdin、stdout、stderr
标准输入 stdin 键盘
标准输出 stdout 终端窗口
标准错误 stderr 终端窗口
举例:
int a = 100;
printf("%d\n",a); 等价于fprintf(stout,"%d\n",a);
scanf("%d",&a); 等价于fscanf(stdin,"%d",&a);