格式化读写:
#include
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
//头文件
#include
#include
//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
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
int stat(const char *file_name, struct stat *buf); //通过文件名获取文件信息,并保存在buf所指的结构体stat中
int fstat(int fd, struct stat *buf); //文件描述词 stat结构体指针
返回值: 执行成功则返回0,失败返回-1,错误代码存于errno(需要include
)
通过man stat查找结构体中包含文件的具体信息
select函数,目前本人多用于函数读写动态监听:
#include
#include
int select(int maxfd, fd_set *readset,fd_set *writeset, fd_set *exceptionset, const struct timeva l * 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 timeva l类型的指针,该结构体如下:
struct timeva l
{
long tv_sec; /* second */ //秒
long tv_usec; /* microsecond */ //微秒
};
将文件名描述符转化为文件指针(多用于不可用fopen打开的管道):
fdopen函数 相关函数:fopen,open,fclose
#include
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参数的意义则稍有区别。因为该描述符已被打开