C语言笔记
使用#ifndef、#define、#endif组合宏定义的作用是:防止头文件的重复包含和编译。
#ifndef __XXX_H__ //if not define
#define __XXX_H__
#include <iostream>
// 其他代码
#endif
共用体:union
union 共用体名{
成员列表
};
结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
共用体占用的内存等于最长的成员占用的内存
同一时刻只能保存一个成员的值
select函数
select函数是一个轮循函数,循环询问文件节点,三个fd_set分别监视文件描述符的读写异常变化,如果有select会返回一个大于0的值。如果没有则在timeout的时间后select返回0,若发生错误返回负值。可以传入NULL值,表示不关心任何文件的读/写/异常变化。
int select(int nfds, fd_set* readset, fd_set* writeset, fe_set* exceptset, struct timeval* timeout);
nfds 需要检查的文件描述字个数,所有文件描述符的最大值加1
readset 用来检查可读性的一组文件描述字
writeset 用来检查可写性的一组文件描述字
exceptset 用来检查是否有异常条件出现的文件描述字。(注:错误不包括在异常条件之内)
timeout 超时,填NULL为阻塞,填0为非阻塞,其他为一段超时时间
返回fd的总数,错误时返回SOCKET_ERROR
fd_set结构体
FD_SET(int fd, fd_set *fdset); //将fd加入set集合
FD_CLR(int fd, fd_set *fdset); //将fd从set集合中清除
FD_ISSET(int fd, fd_set *fdset); //检测fd是否在set集合中,不在则返回0
FD_ZERO(fd_set *fdset); //将set清零使集合中不含任何fd
timeval结构体
long tv_sec; //秒
long tv_usec; //微秒
//函数指针:
int Func(int x); /*声明一个函数*/
int (*p) (int x); /*定义一个函数指针*/
p = Func; /*将Func函数的首地址赋给指针变量p*/
typedef int (*point)(int x);
int *(*a[5])(int,char*);
typedef int *(*PFun)(int,char*);
int open(const char * pathname, int flags, mode_t mode);
头文件:#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>
O_RDONLY 以只读方式打开文件
O_WRONLY 以只写方式打开文件
O_RDWR 以可读写方式打开文件
O_CREAT 若欲打开的文件不存在则自动建立该文件
成功返回一个>0的数,错误返回-1
标准输入的文件标识符为0
FILE *fopen(char *filename, char *mode);
<stdio.h>
filename为文件名(包括文件路径),mode为打开方式,它们都是字符串
"r"-只读 "w"-只写 "a"-追加;文件不存在会创建文件 "r+"-可读可写
fopen() 会获取文件信息,包括文件名、文件状态、当前读写位置等,并将这些信息保存到一个 FILE 类型的结构体变量中。
FILE *fp;
if( (fp=fopen("D:\\demo.txt","rb") == NULL ){
printf("Fail to open file!\n");
exit(0); //退出程序(结束程序)
}
ssize_t read(int fd, void * buf, size_t count);
ssize_t write(int fd,void * buf ,size_t count);
#include <unistd.h>
返回读取写入的字节数;0为读写为0,<0时错误。
size_t fread(void *buffer, size_t size, size_t count, FILE * stream);
size_t fwrite(void *buffer, size_t size, size_t count, FILE * stream);
#include <stdio.h>
buffer为数据源地址,size为每个单元的字节数,count为单元个数,stream为文件流指针
返回成功写入的单元个数。如果小于count,则说明发生了错误,文件流错误标志位将被设置,随后可以通过ferror()函数判断