文件IO

文件IO使用文件描述符作为操作文件的

获取文件属性
1、通过路径获取文件属性;
int stat(const char * pchPath, struct stat *pBuf);

样例:获取文件的大小

void check_log()
 {
     int iRet;
     char chMod[MAX_STR128_LEN];
     char *chLogName = g_sippconfig->log_path;
 
     struct stat log_info;
 
     iRet = stat(chLogName, &log_info);
     if (iRet < 0)
     {
         sprintf(chMod, "touch %s", chLogName);
         system(chMod);
     }
     else
     {
         if (log_info.st_size > 15000000)
         {
             sprintf(chMod, "rm -f %s && touch %s", chLogName, chLogName);
             system(chMod);
         }
     }
 }
2、通过文件描述符获取对应的文件属性;
int fstat(int iFd, struct stat *pBuf);

3、通过路径获取文件属性,与stat区别在于获取链接文件的属性时lstat获取的是链接文件本身的属性,stat获取的源文件(目标文件)的属性;

int lstat(const char *pchPath, struct stat *pBuf);

stat结构体:

struct stat {
         mode_t     st_mode;       //文件对应的模式,文件,目录等
         ino_t      st_ino;       //inode节点号
         dev_t      st_dev;        //设备号码
         dev_t      st_rdev;       //特殊设备号码
         nlink_t    st_nlink;      //文件的连接数
         uid_t      st_uid;        //文件所有者
         gid_t      st_gid;        //文件所有者对应的组
         off_t      st_size;       //普通文件,对应的文件字节数
         time_t     st_atime;      //文件最后被访问的时间
         time_t     st_mtime;      //文件内容最后被修改的时间
         time_t     st_ctime;      //文件状态改变时间
         blksize_t st_blksize;    //文件内容对应的块大小
         blkcnt_t   st_blocks;     //伟建内容对应的块数量
       };

标准IO

标准IO通过缓存机制,减少系统调用,增加文件操作的效率;

流的缓冲类型:
  • 全缓冲:当流的缓冲区无数据或无空间的时候才执行实际的IO操作
  • 行缓冲:当在输入和输出中遇到‘\n’时执行实际的IO操作
  • 无缓冲:数据直接写入文件,流不进行缓冲
标准IO预定三个流:
  • stdin:标准输入流
  • stdout:标准输出流
  • stderr:标准错误流
标准IO打开文件
FILE *fopen(const char *file_path, const char *open_mode);

mode参数:

方式

简介

“r"或"rb”

以只读方式打开文件,文件必须存在。

"r+“或"r+b”

以读写方式打开文件,文件必须存在。

“w"或"wb”

以只写方式打开文件,若文件存在则文件长度清零,若文件不存在则创建。

"w+“或"w+b”

以读写方式打开文件,其他同"w"。

“a"或"ab”

以只写方式打开文件,若文件不存在则创建;向文件写入的数据会被追加到文件末尾。

"a+“或"a+b”

以读写方式打开文件,其他同"a"。

标准IO关闭文件
int fclose(FILE *file);

注意:

  1. close()调用成功返回0,返回失败返回EOF 设置errno
  2. 流关闭时候自动刷新缓冲中的数据并且释放缓冲区
  3. 当一个程序正常终止时,所有打开的流都会被关闭
  4. 流一旦关闭后就不能执行操作
处理错误信息
  1. 存放错误号(error)
  2. perror(char *s);输出自定义错误信息
  3. strerr(error);根据错误号输出错误信息
标准IO读写流

单字符读写

int fgetc(FILE *file);
 int getc(FILE *file);
 int getchar(void);
 
 int fput(int c, FILE *file);
 int putc(int c, FILE *file);
 int putchar(int c);

一行字符串读写

char *gets(char *s);
 char *fgets(char *s, int size, FILE *stream);
 
 int puts(const char *s);
 int fputs(const char *s, FILE *stream);

多字符读写

size_t fread(void *ptr, size_t size, size_t n, FILE *fp);
 size_t fwrite(const void *ptr, size_t size, size_t n, FILE *fp)
标准IO刷新流

1.缓冲区满了之后会自动刷新

2.当流关闭的时候,如果缓冲还有数据会刷新

3.fflush刷新

int fflush(FILE *fp);
标准IO定位流
long ftell(FILE *stream);
 long fseek(FILE *stream, long offset, int whence);
 void rewind(FILE *stream);
  • ftell返回当前读写位置,错误返回EOF
  • fseek定位一个流,成功返回0,失败返回EOF
  • rewind将流定位到起始位置

当对流进行读写的时候,读写位置会自动后移。

标准IO格式化输出
int printf(const char *fmt, ...);
 int fprintf(FILE *stream, const char *fmt, ...);
 int sprintf(char *s, const char *fmt, ...);