C语言(文件读写)

打开文件数组

#include <stdlib.h>
exit(0);//头文件:#include <stdlib.h>
// exit 结束程序,通常0为正常退出,其余数字为异常,其对应的错误能够本身指定

FILE *fopen(const *charconst *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值
   */
相关文章
相关标签/搜索