2016—5—3
函数指针: 用函数指针变量调用函数
用指针变量可以指向一个函数。
函数在编译时被分配给一个入口地址。这个函数的入口地址就称为函数的指针。
int (*p)(); //p可以指向一个函数地址;
int max1(int,int);
p=max1;
int c=(*p)(a,b)
或者 typedef int (*p)();
与其他宏定义不一样,这里表示定义中指针类型p,他所指向的是一个返回类型是int,形参是(int,int)的函数入口地址
int a[5]; int *p,*p1; p=a; p1=&a[3]; p1-p=3;
结构体在内存中存储要对齐
结构体对象拷贝 memcpy(s1,s2);
void fun(struct student *s1) 90%传指针
struct student等价于stu ,struct student *等价于 pstu
pstu a[10] (pstu=>struct student*) char* b[10] sizeof(a)==sizeof(b)==40
//调用库函数qsort(快速排序)升序
int a[N];
qsort(a,N,sizeof(int),compare)
\\compare函数要自己实现,传入的是函数地址 qsort函数传给cmopare函数两个参数*pleft,*pright,表示的是数组a里面任意两个元素(a[0],a[1])数组a可以是任意类型的,所以是void型,用时在强制转换
|
perror()系统调用 perror(“写要输入的内容”)输出错误信息
r 打开一个文本文件,读取
w 创建一个文本文件,写入(已经有的覆盖)
a 打开一个文本文件,光标定位到末尾写入
r+ 打开一个文本文件,读取,写入(先读,独到末尾可以写新数据不会覆盖)
w+ 创建一个文本文件,读取,写入(会覆盖)
a+ 打开一个文本文件,光标定位到末尾,读取、写入
|
//两个函数读到文件尾返回 0;fwrite 写数据的时候count一般要写buffer中数据的长度strlen(str),不然会写进去一些不是自己想要的内容
int
i=0; int ret=0;FILE* fp; fp=fopen(……)
int
ret;
ret=fread(&i,sizeof(int),1,fp); //从fp所指的文件中读一个大小为int的数放到变量i里面
char
a[100]; memset(a,0,sizeof(a));
ret=fread(a,sizeof(char),sizeof(a),fp); //从fp所指的文件中读数组a大小的一些数据放到数组a中
用于二进制文件
char
a[100]; strcpy(a,”hello”);
ret=fwrite(a,sizeof(char),strlen(a),fp)
int fseek( FILE *stream, long offset, int origin ); //参数表1、文件指针 2、位移量,3、当前光标位置
fgetc()函数返回来自stream(流)中的下一个字符,如果到达文件尾或者发生错误时返回EOF.
(origin可设置值) | 说明 |
SEEK_SET | 从文件的开始处开始搜索 |
SEEK_CUR | 从当前位置开始搜索 |
SEEK_END | 从文件的结束处开始搜索 |
char fgetc( FILE *stream ); //从文件流中获取一个字符,获取失败返回EOF(-1);
int fscanf( FILE *stream, const char *format, ... ); //返回已赋值的变量的个数,未进行任何分配时返回EOF( -1 )。
l
int fprintf( FILE *stream, const char *format, ... ); //返回已读入的变量的个数,未进行任何分配时返回EOF( -1 )。
l
l fprint(fp,”hello”);和printf工作一样,不过fprint是在文件里输入
fseek()成功时返回0,失败时返回非零. 你可以使用fseek()移动超过一个文件,但是不能在开始处之前. 使用fseek()清除关联到流的EOF标记.
char * fgets( char
*str, int num, FILE *stream ); //
//这个函数没次读之前都会自己清空str里的内容,所以不用自己认为的在循环第二次读之前使用memset
用于文本文档 int a[100], fgets(a,sizeof(a),fp)
char a[1024];
微软编码 GB2132 汉字表示2个字节