标准文件库
查询文件属性<sys/types.h><sys/stat.h>int stat(const char *filename, struct stat *buf)获取文件属性int fstat(int fd, struct stat *buf)功能同stat,但是入参是文件描述符int lstat(const char *filename, struct stat *buf)功能同 stat,但是能处理链接文件 查询文件属性struct statdev_t st_dev //设备IDmode_t st_mode //文件类型与权限(ls显示的 –rwx------)nlink_t st_nlink //文件链接数uid_t st_uid //文件所有人 IDgid_t st_gid //文件所属组 IDoff_t st_size //文件大小time_t st_atime //最近访问时间(access)time_t st_mtime //最近修改时间(modify)time_t st_ctime //文件状态最近改变时间(change)
查询文件属性
文件类型S_IFREG 普通文件 - S_IFDIR 目录文件 d S_IFCHR 字符文件 c S_IFBLK 块文件 b S_IFIFO 管道文件 p S_IFLNK 符号链接 l S_IFSOCK 套接字文件 sS_IFMT 掩码判断方法: if (st_mode & S_IFMT)
查询文件属性
宏判断, 返回 0或者1S_ISREG(st_mode) /* 判断是否为普通文件 - */S_ISDIR(st_mode) /* 判断是否为目录文件 d */S_ISCHR(st_mode) /* 判断是否为字符文件 c */S_ISBLK(st_mode) /* 判断是否为块文件 b */S_ISFIFO(st_mode) /* 判断是否为管道文件 p */S_ISLNK(st_mode) /* 判断是否为符号链接 l */S_ISSOCK(st_mode) /*判断是否位套接字文件*/文件访问权限属性
S_IRUSR S_IWUSR S_IXUSR S_IRGRP S_IWGRP S_IXGRPS_IROTH S_IWOTH S_IXOTHif (st_mode & S_IRUSR)
r w x usr grp oth 权限和使用者事实上,这些宏,只是把 000 000 000 这个 9 个bit位的数字,对应位置置位位1 (高位补0)。
S_IRUSR = 0400 S_IWUSR = 0200 S_IXUSR =0100S_IRGRP = 0040 ... 查询文件系统相关信息#include <sys/statfs.h> 或者下面这个#include<sys/vfs.h>int statfs(const char *path, struct statfs *buf)int fstatfs(int fd, struct statfs *buf)结构体解析:struct statfslong f_type; /* 文件系统类型 */ long f_bsize; /* 经过优化的传输块大小 */ long f_blocks; /* 文件系统数据块总数 */ long f_bfree; /* 可用块数 */ long f_bavail; /* 非超级用户可获取的块数 */ long f_files; /* 文件结点总数 */ long f_ffree; /* 可用文件结点数 */ fsid_t f_fsid; /* 文件系统标识 */ long f_namelen; /* 文件名的最大长度 */
文件操作
#include<stdio.h>FILE* fopen(const char* filename, const char* mode)打开文件FILE* freopen(const char* filename, const char* mode, FILE* stream)文件重定向, 操作 stream文件时候,实际操作的是 filename文件int fclose(FILE* stream)关闭文件int remove(const char *filename)删除文件int rename(const char *oldname, const char * newname)重命名文件 freopen 文件流重定向FILE *pFilepFile= freopen(“1.txt”, “w”, stdout)所有输出到stdout的内容被输出到 1.txtpFile = freopen(“1.txt”, “r”, stdin)所有有stdin输入的地方,变成从 1.txt 输入注意:输出到stdout等同于写入文件,输入到stdin等同于读取文件
stdin=fopen("/dev/tty","r")stdout=fopen("/dev/tty","w")stdin表示控制台读这个文件,就相当于scanf();
stdout表示控制台写这个文件,相当于printf(); 重定向类似与管子,一边是stdin或stdout,另一边是文件。当文件打开并与stdout连通时,以下两句等效:fprintf(stdout,"this is write1\n");fprintf(file,"this is write2\n"); 例子:#include <stdio.h>//写入文件
void test_freopen(){ fprintf(stdout,"this is test!\n"); FILE *file=freopen("1.txt","w",stdout); if(file==NULL) { return ; } fprintf(stdout,"this is write1\n"); fprintf(file,"this is write2\n");fclose(file);
printf("this is end\n");}//读取文件void test_freopen2(){
char buf[1024]; scanf("%s",buf); printf("your input is %s\n",buf); FILE *file=freopen("1.txt","r",stdin); if(file==NULL) { return ; } scanf("%s",buf); printf("your input is %s\n",buf); fclose(file);}
void main()
{ test_freopen(); test_freopen2();}
标准文件操作(与C语言一样)
标准输入int getc(FILE *stream)从文件流中读取字符,宏定义方式,效率高,括号里面不要进行运算int fgetc(FILE *stream)从文件中读取字符,函数定义形式,效率比getc()低int getchar(void)从stdin 读入一个字符, 事实上,就是 getc(stdin)char *gets(char *s)
从stdin 中读取字符存入 s,返回NULL或者s地址char *fgets(char *s, int n, FILE *stream)加入流长度控制注意:fgetc(file)返回值是 int,不是 char,因为char类型的一个字符是255,此时可能会多出一个未知字符
buf=(fgetc(file))!=EOF 返回 EOF = int(-1) = 0xffffffff 时表示读取结束
标准输出
putchar(int c)putc(int c, FILE *stream)fputc(int c, FILE *stream)区别联系类似 getc, getchar, fgetc前缀 f 就是 function的意思行输出:以 ‘\0’ 结束输出
int puts(const char *s)int fputs(const char *s, FILE *stream
块读写
size_t fread(void *ptr, size_t size, size_t nBlock, FILE *stream)size_t fwrite(const void *ptr, size_t size, size_t nBlock, FILE *stream)块读写可存储结构体。,第三参数表示存储块的数目。 例子:#include <stdio.h>typedef struct CWR{ int x; int y; char buf[8]; }CWR;void test_freopen()
{ FILE *file=fopen("1.txt","w"); if(file==NULL) { return ; }CWR wr[]={
{1,2,"Hello"},{3,4,"World"}}; fwrite(&wr,sizeof(CWR),2,file);fclose(file);
}void test_freopen2()
{
FILE *file=fopen("1.txt","r"); if(file==NULL) { return ; } CWR wrr; fread(&wrr,sizeof(CWR),1,file); printf("%d %d %s\n",wrr.x,wrr.y,wrr.buf);fread(&wrr,sizeof(CWR),1,file);
printf("%d %d %s\n",wrr.x,wrr.y,wrr.buf);fclose(file);
}void main(){ test_freopen(); test_freopen2();}
注意:以下的格式化多用于合并字符,如:str="sprintf","操作";int sprintf(strr, "操作%s", str);那么,strr="操作sprintf";
格式化输出
int printf(const char *format, ...);int fprintf(FILE *stream, const char *format, ...);int sprintf(char *str, const char *format, ...);int snprintf(char *str, size_t size, const char *format, ...);格式控制%3d 右对齐输出(左边填空格)%-3d 左对齐 (右边填空格)%+d 带符号输出( +, -)% d 带符号输出(空格,-)%#x 进制输出带前缀(0, 0x格式化输入
int scanf(const char *format, ...)int fscanf(FILE *stream, const char* format, ...)int sscanf(const char* s, const char* format, ...) 文件读写与定位int fseek(FILE *stream, long offset, int whence);SEEK_SET SEEK_END SEEK_CURlong ftell(FILE *stream);void rewind(FILE *stream);int fgetpos(FILE *stream, fpos_t *pos);int fsetpos(FILE *stream, fpos_t *pos); 文件状态ferror(FILE*) 发生IO错误 返回非0,正常返回0feof(FILE*)文件结束EOF返回非0, 否则返回0clearer(FILE*)清除IO错误标志和 EOF标志获取错误信息
char* strerror(errno)返回当前错误信息printf(“There is a error[%s]:%s\n”, “MY”, strerror(errno))头文件 errno.h string.hperror(char *);在里面集成了 strerror(errno),这个里面不支持我们输出参数
文件缓冲
BUFSIZ 缓冲区大小的宏,256的整数倍void setbuf(FILE*, char *buf)把文件缓冲区设置位 buf, 这里buf大小位 BUFSIZbuf为NULL则关闭缓存int setvbuf(FILE*, char *buf, int type, size_t size)指定缓冲区位置(buf)和大小(size)type 指定缓冲模式 _IOFBF:全缓冲: 普通文件读写,缓冲区满时写入文件,读出文件直到缓冲区满 _IOLBF:行缓冲: 遇到换行(‘\n’)刷新缓冲区, stdout, stdin _IONBF:无缓冲: 所有IO直接执行, stderrint fflush(FILE *);强制刷新缓冲区 变长参数使用#include<stdarg.h>va_list 定义变量列表变量va_start 获取变量列表起始地址va_arg 获取变量,同时指向下一个变量va_end 结束变量获取,释放句柄(清零变量)vsprintf/vsnprintf 从变量列表里依次格式化取变量记录日志函数 WriteLog(char *pFmt, ...)