文件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);
注意:
- close()调用成功返回0,返回失败返回EOF 设置errno
- 流关闭时候自动刷新缓冲中的数据并且释放缓冲区
- 当一个程序正常终止时,所有打开的流都会被关闭
- 流一旦关闭后就不能执行操作
处理错误信息
- 存放错误号(error)
- perror(char *s);输出自定义错误信息
- 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, ...);