格式化读写:
#include <stdio.h>
int printf(const char *format, ...); //相当于fprintf(stdout,format,…);
int scanf(const char *format, …);
int fprintf(FILE *stream, const char *format, ...); //中间的參数为写入文件的格式
int fscanf(FILE *stream, const char *format, …); //中间为从文件里读取的格式
int sprintf(char *str, const char *format, ...); // eg:sprintf(buf,”the string is;%s”,str);
int sscanf(char *str, const char *format, …); //从字符串中格式化读取
以f开头的将格式化后的字符串写入到文件流stream中
以s开头的将格式化后的字符串写入到字符串str中
内核为每一个进程维护一个已打开文件的记录表,文件描写叙述符是一个较小的正整数(0—1023),它代表记录表的一项,通过文件描写叙述符和一组基于文件描写叙述符的文件操作函数。就能够实现对文件的读、写、创建、删除等操作。经常使用基于文件描写叙述符的函数有open(打开)、creat(创建)、close(关闭)、read(读取)、write(写入)、ftruncate(改变文件大小)、lseek(定位)、fsync(同步)、fstat(获取文件状态)、fchmod(权限)、flock(加锁)、fcntl(控制文件属性)、dup(复制)、dup2、select和ioctl。基于文件描写叙述符的文件操作并不是ANSI C的函数。
此类函数打开文件后将文件名称转化为当前最小可用的文件描写叙述符,0,1,2已经被占用!
#include <sys/types.h> //头文件
#include <sys/stat.h>
#include <fcntl.h> //flag 经常使用的包含O_RDONLY,O_WRONLY,O_CREAT仅仅读仅仅写创建
int open(const char *pathname, int flags); //文件名称 打开方式
int open(const char *pathname, int flags, mode_t mode);//文件名称 打开方式 权限
open(pathname,O_CREAT|O_WRONLY,mode; //创建并读取文件
open()函数出错时返回-1。相关參数例如以下:
flags和mode都是一组掩码的合成值,flags表示打开或创建的方式,mode表示文件的訪问权限。
通过文件描写叙述符读写文件
函数原型为:
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);//文件描写叙述词 缓冲区 长度 数据从文件读到buf
ssize_t write(int fd, const void *buf, size_t count); //buf中字符串写入文件
fd=1。write表示将文件从标准输出流输出,fd=0,read表示从标准输入流读入到buf中
对于read和write函数,出错返回-1,读取完了之后,返回0。 其它情况返回读写的个数(字节数)。
#include <sys/stat.h>
int stat(const char *file_name, struct stat *buf); //通过文件名称获取文件信息,并保存在buf所指的结构体stat中
int fstat(int fd, struct stat *buf); //文件描写叙述词 stat结构体指针
返回值: 运行成功则返回0。失败返回-1,错误代码存于errno(须要include <errno.h>)
通过man stat查找结构体中包括文件的详细信息
select函数。眼下本人多用于函数读写动态监听:
#include <sys/select.h>
#include <sys/time.h>
int select(int maxfd, fd_set *readset,fd_set *writeset, fd_set *exceptionset, const struct timeval * timeout);
返回:就绪描写叙述字的正数目,0——超时,-1——出错
參数解释:
maxfd: 最大的文件描写叙述符(其值应该为最大的文件描写叙述符字 + 1)
readset: 内核读操作的描写叙述符字集合
writeset:内核写操作的描写叙述符字集合
exceptionset:内核异常操作的描写叙述符字集合
timeout:等待描写叙述符就绪须要多少时间。NULL代表永远等下去,一个固定值代表等待固定时间,0代表根本不等待,检查描写叙述字之后马上返回。
当中readset、writeset、exceptionset都是fd_set集合。该集合的相关操作例如以下:
void FD_ZERO(fd_set *fdset); /* 将全部fd清零 */
void FD_SET(int fd, fd_set *fdset); /* 添加一个fd */放入监听集合
void FD_CLR(int fd, fd_set *fdset); /* 删除一个fd */
int FD_ISSET(int fd, fd_set *fdset); /* 推断一个fd是否为1 */
一般来说,在使用select函数之前,首先要使用FD_ZERO和FD_SET来初始化文件描写叙述符集,在使用select函数时,会依据设置时间測试set集合中各个描写叙述符的变化,某个描写叙述符发生变化,会将描写叙述符变为1。set变化说明当前并未堵塞。
可循环使用FD_ISSET測试描写叙述符集,測试描写叙述符是否为1。这样就比較好理解了。在运行完对相关文件描写叙述符之后。使用FD_CLR来清除描写叙述符集。
另外,select函数中的timeout是一个struct timeval类型的指针,该结构体例如以下:
struct timeval
{
long tv_sec; /* second */ //秒
long tv_usec; /* microsecond */ //微秒
};
将文件名称描写叙述符转化为文件指针(多用于不可用fopen打开的管道):
fdopen函数 相关函数:fopen。open,fclose
#include<stdio.h>
FILE * fdopen(int fildes,const char * mode);
函数说明:fdopen取一个现存的文件描写叙述符(我们可能从 o p e n , d u p , d u p 2 , f c n t l或p i p e函数得到此文件描写叙述符)并使一个标准的I / O流与该描写叙述符相结合。
此函数经常使用于由创建管道和网络通信通道函数获得的描写叙述符。
由于这些特殊类型的文件不能用标准I/O fopen函数打开,首先必须先调用设备专用函数以获得一个文件描写叙述符,然后用f d o p e n使一个标准I / O流与该描写叙述符相结合。
fdopen()会将參数fildes 的文件描写叙述词,转换为相应的文件指针后返回。
參数mode 字符串 则代表着文件指针的流形态。此形态必须和原先文件描写叙述词读写模式同样。
mode有下列几种形态字符串: r 打开仅仅读文件。该文件必须存在。
w 打开仅仅写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。 a 以附加的方式打开仅仅写文件。若文件不存在。则会建立该文件。假设文件存在,写入的数据会被加到文件尾。即文件原先的内容会被保留。
对于f d o p e n。t y p e參数的意义则稍有差别。由于该描写叙述符已被打开,所以 f d o p e n为写打开并不截断该文件。(比如,若该描写叙述符原来是由 o p e n函数打开的,该文件那时已经存在,则其O _ T R U N C标志将决定是否截短该文件。
f d o p e n函数不能截短它为写而打开的任一文件。 )另外,标准I / O加入方式也不能用于创建该文件(由于如若一个描写叙述符引用一个文件。则该文件一定已经存在)。
以下贴一下自己联系函数用的代码。第一个是模仿linux ls -l 功能的函数:
//File Name: myls.c #include <sys/stat.h> #include <stdio.h> #include <sys/types.h> #include <dirent.h> #include <unistd.h> #include <time.h> #include <string.h> #include <pwd.h> #include <grp.h> void mode_to_str(mode_t md,char *str); void format(char *time); int main(int argc,char *argv[]) { char *time; char str_mode[11]; DIR *Pdir; struct stat mystat; struct dirent *myent; if(argc==1) { Pdir=opendir("."); } else { Pdir=opendir(argv[1]); } if(Pdir==NULL) { perror("open fail:"); exit(-1); } printf("no,mode,uid,gid,"); while((myent = readdir(Pdir))!=NULL) { memset(&mystat,0,sizeof(mystat)); stat(myent->d_name,&mystat); memset(str_mode,0,11); mode_to_str(mystat.st_mode,str_mode); time=ctime(&mystat.st_atime); time=format(time); // printf("%s ",myent->d_name); //printf("size=%d,type=%c,name=%s ",myent->d_reclen,myent->d_type,myent->d_name); printf("%10s. %2d %8d %8d %5d %s %s ",str_mode,mystat.st_nlink,getpwuid(mystat.st_uid)->pw_name,getgrgid(mystat.st_gid)->gr_name,mystat.st_size,time,myent->d_name); } return 0; } void mode_to_str(mode_t md,char *str) { strcpy(str,"----------"); if(S_ISDIR(md)) { str[0]='d'; } if(md & S_IRUSR) { str[1]='r'; } if(md & S_IWUSR) { str[2]='w'; } if(md & S_IXUSR) { str[3]='x'; } if(md & S_IRGRP) { str[4]='r'; } if(md & S_IWGRP) { str[5]='w'; } if(md & S_IXGRP) { str[6]='x'; } if(md & S_IROTH) { str[7]='r'; } if(md & S_IWOTH) { str[8]='w'; } if(md & S_IXOTH) { str[9]='x'; } } char *format(char *time) { char *p; while((*time)!=' ') { time++; } p=time; while((*p)!=':') { p++; } p=p+3; (*p)='