打开文件数组
#include <stdlib.h> exit(0);//头文件:#include <stdlib.h> // exit 结束程序,通常0为正常退出,其余数字为异常,其对应的错误能够本身指定 FILE *fopen(const *char,const *mode); /** *path:指定打开文件路径和文件名 *mode:打开模式; * r:只读,从文件头开始读取;文件必须存在 * w:只写(重写),从文件头开始重写【写入内容覆盖整个文件】;若文件不存在,则建立一个新的文件 * a:追加,在文件尾部追加内容;若文件不存在,则建立一个新的文件 * r+:读写,从文件头开始读取和覆盖【只覆盖从头开始的相应字节内容,其他字节会保留】;文件必须存在 * w+:读和从写,从文件头开始读和重写;若文件不存在,则建立一个新的文件 * a+:读和追加,读取位置是从文件头开始,写入在文件尾部追加;若文件不存在,则建立一个新的文件 * b:与以上6种模式结合用于操做二进制文件;("rb","wb","ab","r+b","w+b","a+b")*/
以字符形式读写缓存
FILE *fp=fopen("hello.txt",""a+"); //打开文件 char ch=getc(fp);
(ch)!=EOF /** *每次读取一个字符,读取到( EOF:宏定义为-1 )结束 *fgetc()和getc的区别:fgetc()为函数实现;为getc()则为宏的实现 *宏避免了方法调用堆栈的操做,但不能传入内联函数(如 i++操做,可能使用以后得出错误结果) */ putc( ch,fp ); //写入文件一个字符 ( fputc()/putc()的关系与fgetc()/getc()同样 ) fclose( fp );//关闭文件
以字符串形式读写函数
char *fgets(char *s,int size,FILE *stream ); /** *读取一个字符串最大长度为 [size-1] ;遇到换行符和文件结束时会结束本次读取,且 '\n' 会被认为合法字符串读取; *读取到文件结束时,将会设置末尾指示器【 feof( FILE *stream ); 没设置时返回非0,设置后返回0】 *s:字符型指针,指向用于存放读取字符串的位置;读取失败时 s 指向的数据不变 *size:指定读取的字符数(包括最后的 '\0' ) *stream :为读取的文件指针; *返回值:返回s参数指向的地址,即为保存字符串的地址 */ int fputs( const char *s,FILE *stream ); /** *向 stream 指向的文件写入一个字符串 *s:指向待写入字符串的位置(字符串结束位置的 '\0' 不会写入到文件); *stream :为读取的文件指针; *写入成功返回一个得0值,不然返回EOF(-1); */
格式化读写spa
int fprintf( FILE *stream,const char *format,... ); //优点:能够格式化写入,能够带一些变量 //如:fprintf( fp,"%d-%d-%d",year,mon,day ); int fscanf( FILE *stream,const char *format,... ); //优点:能够格式化读取,把读取到的部份内容赋值给一些变量 //如:fscanf( fp,"%d-%d-%d",&year,&mon,&day );
以二进制读写指针
一、 打开模式字符串加了 'b',用以上方法是能够以二进制形式读写;
二、用专门的二进制读写方法:(这样就直接能够写入结构体了)code
size_t fwrite( void *ptr,size_t size,size_t nmemb,FILE *stream ); size_t fread( void *ptr,size_t size,size_t nmemb,FILE *stream ); /** *ptr:指向存放数据的指针,该内存的尺寸是 [size*nmenb] 个字节 *size:指定要读取的每一个元素的尺寸,最终尺寸为 [size*nmenb] *nmemb:指定读取的元素个数 *stream:指定带读取的文件流 *返回值:实际上读到的元素个数;若是该值小于 nmemb,就说明读取到文件末尾或有错误(能够用feof()或ferror()标志判断) */
随机读写orm
经过修改打开文件的位置指示器来达到直接读取目标位置的方法blog
long int ftell( FILE *stream ); /** *获得位置指示器的值;编译器认为文件的内容是一个字符数组 *返回值:long 类型的值,返回值即为当前位置字符的下标 */ rewint( FILE *stream ); /** *将位置指示器初始化到文件头位置 *写入一些数据后,用该方法回到文件头位置继续写入会覆盖原有内容相应字节的内容 */ int fseek( FILE *stream,long int offsef,int whence ); /** *用于设置文件流的位置指示器的位置 *stream:指定代操做的文件流 *offsef:指定从 whence 参数的位置器移动多少个字节 *whence:指定开始移动位置;能够用: * SEEK_SET【文件头】 * SEEK_CUR【 当前的读写位置 】 * SEEK_END【 文件末尾 】 *返回值:成功返回0;失败返回非0值;如:fseek( fp,sizeof(student Stu)*1,SEEK_SET ); */
文件中的指示器内存
int feof( FILE *stream );
//位置指示器,读到文件末尾时返回非0值 int ferror( FILE *stream );
//错误指示器,文件读写发生错误时返回非0值(判断是否进行错误处理) clearerr( FILE *stream );
//同时清除位置指示器和错误指示器的状态
程序执行时会打开3个面向终端的标准流字符串
stdin; //标准输入(scanf函数接收数据) stdout; //标准输出(printf函数打印字符串) sederr; //标准错误输出(自动打印报错信息) //重定向:因为标准输出流和标准错误输出流都是直接将信息打印在终端;因此 Linux 能够经过重定向的方法将3个流的信息重定向到一个文件中 //从定向标准输入:< 从定向标准输出:> 从定向标准错误输出:2>例如: gcc test1.c && ./a.out //(编译text1.c文件) ./a.out 2> error.txt //(执行a.out,并将错误输出流重定向到 error.txt 中) ./a.out > output.txt //(执行a.out,并将输出流重定向到 output.txt 中) ./a.out > 1.txt 2> 2.tet
IO缓冲区:(刷新缓冲区)
一、fflush( FILE *stream );函数主动刷新
二、缓冲区自动刷新
按块缓存:填满缓冲区后才进行实际的设备读写操做
按行缓存:接收到换行符以前,数据都是先缓存在缓冲区中的
不缓存:直接读写设备上的数据
int setvbuf( FILE *stream,char *buf,int mode,size_t size ); /** *设置缓存模式 *stream:指定打开的数据流; *buf:传入字符数组,指定分配的缓冲区(为NULL时,函数会自动分配一个指定尺寸的缓冲区) *size:指定缓冲区的尺寸( 字节 ); *mode:缓冲区模式 * _IOFBF(按块缓存) * _IOLBF(按行缓存) * _IONBF(不缓存) *返回值:调用成功返回0;调用失败返回非0值 */