都在stdlib.h函数库内 它们的返回值都是请求系统分配的地址,如果请求失败就返回NULL malloc用于申请一段新的地址,参数size为需要内存空间的长度,如: char* p; p=(char*)malloc(20); calloc与malloc相似,参数sizeOfElement为申请地址的单位元素长度,numElements为元素个数,如: char* p; p=(char*)calloc(20,sizeof(char)); 这个例子与上一个效果相同 realloc是给一个已经分配了地址的指针重新分配空间,参数ptr为原有的空间地址,newsize是重新申请的地址长度,如: char* p; p=(char*)malloc(sizeof(char)*20); p=(char*)realloc(p,sizeof(char)*40); 注意,这里的空间长度都是以字节为单位。 C语言的标准内存分配函数:malloc,calloc,realloc,free等。 malloc与calloc的区别为1块与n块的区别: malloc调用形式为(类型*)malloc(size):在内存的动态存储区中分配一块长度为“size”字节的连续区域,返回该区域的首地址。 calloc调用形式为(类型*)calloc(n,size):在内存的动态存储区中分配n块长度为“size”字节的连续区域,返回首地址。 realloc调用形式为(类型*)realloc(*ptr,size):将ptr内存大小增大到size。 free的调用形式为free(void*ptr):释放ptr所指向的一块内存空间。 C++中为new/delete函数。 fopen()函数用来打开一个文件,其调用的一般形式为: 文件指针名=fopen(文件名,使用文件方式) 其中,“文件指针名”必须是被说明为FILE 类型的指针变量,“文件名”是被打开文件的文件名。 “使用文件方式”是指文件的类型和操作要求。“文件名”是字符串常量或字符串数组。例如: FILE *fp; fp=("file a","r"); "r" 打开文字文件只读 "w" 创建文字文件只写 "a" 增补,如果文件不存在则创建一个 "r+" 打开一个文字文件读/写 "w+" 创建一个文字文件读/写 "a+" 打开或创建一个文件增补 "b" 二进制文件(可以和上面每一项合用) "t" 文这文件(默认项) “rt” 只读打开一个文本文件,只允许读数据 “wt” 只写打开或建立一个文本文件,只允许写数据 “at” 追加打开一个文本文件,并在文件末尾写数据 “rb” 只读打开一个二进制文件,只允许读数据 “wb” 只写打开或建立一个二进制文件,只允许写数据 “ab” 追加打开一个二进制文件,并在文件末尾写数据 “rt+” 读写打开一个文本文件,允许读和写 “wt+” 读写打开或建立一个文本文件,允许读写 “at+” 读写打开一个文本文件,允许读,或在文件末追加数 据 “rb+” 读写打开一个二进制文件,允许读和写 “wb+” 读写打开或建立一个二进制文件,允许读和写 “ab+” 读写打开一个二进制文件,允许读,或在文件末追加数据 1. 文件使用方式由r,w,a,t,b,+六个字符拼成,各字符的含义是: r(read): 读 w(write): 写 a(append): 追加 t(text): 文本文件,可省略不写 b(banary): 二进制文件 +: 读和写 2. 凡用“r”打开一个文件时,该文件必须已经存在, 且只能从该文件读出。 3. 用“w”打开的文件只能向该文件写入。 若打开的文件不存在,则以指定的文件名建立该文件,若打开的文件已经存在,则将该文件删去,重建一个新文件。 4. 若要向一个已存在的文件追加新的信息,只能用“a ”方式打开文件。但此时该文件必须是存在的,否则将会出错。 5. 在打开一个文件时,如果出错,fopen将返回一个空指针值NULL。在程序中可以用这一信息来判别是否完成打开文件的工作,并作相应的处理。因此常用以下程序段打开文件: if((fp=fopen("c:\\hzk16","rb")==NULL) { printf("\nerror on open c:\\hzk16 file!"); getch(); exit(1); } 这段程序的意义是,如果返回的指针为空,表示不能打开C盘根目录下的hzk16文件,则给出提示信息“error on open c:\ hzk16file!”,下一行getch()的功能是从键盘输入一个字符,但不在屏幕上显示。在这里,该行的作用是等待, 只有当用户从键盘敲任一键时,程序才继续执行, 因此用户可利用这个等待时间阅读出错提示。敲键后执行exit(1)退出程序。 6. 把一个文本文件读入内存时,要将ASCII码转换成二进制码, 而把文件以文本方式写入磁盘时,也要把二进制码转换成ASCII码,因此文本文件的读写要花费较多的转换时间。对二进制文件的读写不存在这种转换。 7. 标准输入文件(键盘),标准输出文件(显示器 ),标准出错输出(出错信息)是由系统打开的,可直接使用。文件关闭函数fclose文件一旦使用完毕,应用关闭文件函数把文件关闭, 以避免文件的数据丢失等错误。 fclose()函数 fclose()函数用来关闭一个由fopen()函数打开的文件 , 其调用格式为: int fclose(FILE *stream); 该函数返回一个整型数。当文件关闭成功时, 返回0, 否则返回一个非零值。可以根据函数的返回值判断文件是否关闭成功。 例子: FILE *fpOut=fopen(“c:\\a.txt”,”wt+”); Int a=1; Fprintf(fpOut,”%d”,a); Fclose(fpOut);//contact.h
#ifndef __CONTACT_H__ #define __CONTACT_H__ #define MAX 1000 #define NAME_MAX 20 #define SEX_MAX 5 #define TELE_MAX 12 #define ADDR_MAX 30 #define CAPACITY 2 #define INC_CAPACITY 20 typedef struct peoinfo { char name[NAME_MAX]; char sex[SEX_MAX]; int age; char tele[TELE_MAX]; char addr[ADDR_MAX]; }peoinfo; typedef struct contact { peoinfo* data; int sz; }contact; void init_contact(contact* pcon); void add_contact(contact* pcon); void del_contact(contact* pcon); void find_contact(contact* pcon); void modify_contact(contact* pcon); void display_contact(contact* pcon); void empty_contact(contact* pcon); void name_sort(contact* pcon); void load_info(contact* pcon); void save_info(contact* pcon); #endif
//contact.c
#define _CRT_SECURE_NO_DEPRECATE 1 #include<stdio.h> #include"contact.h" #include<string.h> #include<stdlib.h> #include<errno.h> void display_contact(contact* pcon); int find_peo(contact* pcon) { char name[NAME_MAX] = { 0 }; int j = 0; int i = 0; printf("请输入姓名:>"); scanf("%s", name); printf("%-10s%-10s%-10s%-10s%-10s\n", "name", "sex", "age", "tele", "addr"); for (i = 0; i < pcon->sz; i++) { if (strcmp(name, pcon->data[i].name) == 0) { break; } } if (i == pcon->sz) { return -1; } return i; } void init_contact(contact* pcon) { pcon->data = malloc(CAPACITY*sizeof(peoinfo)); pcon->sz = 0; pcon->capacity = CAPACITY; memset(pcon->data, 0, CAPACITY*sizeof(peoinfo)); } void INC_capacity(contact* pcon) { if (pcon->sz >= pcon->capacity) { peoinfo *p = (peoinfo*)realloc(pcon->data, (pcon->capacity + INC_CAPACITY)*sizeof(peoinfo)); if (p != NULL) { pcon->data = p; pcon->capacity += INC_CAPACITY; //printf("开辟成功!\n"); } else { perror("realloc"); } } } void add_contact(contact* pcon) { INC_capacity(pcon); printf("姓名:>"); scanf("%s", pcon->data[pcon->sz].name); printf("性别:>"); scanf("%s", pcon->data[pcon->sz].sex); printf("年龄:>"); scanf("%d", &(pcon->data[pcon->sz].age)); printf("电话:>"); scanf("%s", pcon->data[pcon->sz].tele); printf("地址:>"); scanf("%s", pcon->data[pcon->sz].addr); pcon->sz++; } void del_contact(contact* pcon) { int j = 0; int p = find_peo(pcon); printf("%-10s%-10s%-10d%-15s%-10s", pcon->data[p].name, pcon->data[p].sex, pcon->data[p].age, pcon->data[p].tele, pcon->data[p].addr); if (p == -1) { printf("没有你要删除的人!\n"); return; } for (j = p; j < pcon->sz - 1; j++) { pcon->data[j] = pcon->data[j + 1]; } pcon->sz--; printf("删除成功!\n"); } void find_contact(contact* pcon) { int p = find_peo(pcon); if (p == -1) { printf("没有你要找的人!\n"); } else { printf("%-10s%-10s%-10d%-15s%-10s", pcon->data[p].name, pcon->data[p].sex, pcon->data[p].age, pcon->data[p].tele, pcon->data[p].addr); } } void modify_contact(contact* pcon) { enum{ EXIT, NAME, SEX, AGE, TELE, ADDR }; int p = find_peo(pcon); int input = 0; if (p == -1) { printf("没有你要找的人!\n"); } else { printf("%-10s%-10s%-10d%-15s%-10s", pcon->data[p].name, pcon->data[p].sex, pcon->data[p].age, pcon->data[p].tele, pcon->data[p].addr); } printf("\n"); printf("********************************\n"); printf("******* 1.name 2.sex *******\n"); printf("******* 3.age 4.tele *******\n"); printf("******* 5.addr 0.exit *******\n"); printf("********************************\n"); printf("请选择:>"); scanf("%d", &input); switch (input) { case EXIT: break; case NAME: printf("名字:>"); scanf("%s", pcon->data[p].name); break; case SEX: printf("性别:>"); scanf("%s", pcon->data[p].sex); break; case AGE: printf("年龄:>"); scanf("%d", &(pcon->data[p].age)); break; case TELE: printf("电话:>"); scanf("%s", pcon->data[p].tele); break; case ADDR: printf("地址:>"); scanf("%s", pcon->data[p].addr); break; default: printf("输入有误!\n"); break; } printf("修改成功!\n"); } void display_contact(contact* pcon) { int i = 0; printf("%-10s%-10s%-10s%-15s%-10s\n", "name", "sex", "age", "tele", "addr"); for (i = 0; i < pcon->sz; i++) { printf("%-10s%-10s%-10d%-15s%-10s\n", pcon->data[i].name, pcon->data[i].sex, pcon->data[i].age, pcon->data[i].tele, pcon->data[i].addr); } printf("显示完毕!\n\n"); } void empty_contact(contact* pcon) { pcon->sz = 0; printf("清空完毕!\n"); } void name_sort(contact* pcon) { int i = 0; for (i = 0; i < pcon->sz - 1; i++) { int j = 0; for (j = 0; j < pcon->sz - 1 - i; j++) { if (strcmp(pcon->data[j].name, pcon->data[j + 1].name)>0) { peoinfo s = pcon->data[j]; pcon->data[j] = pcon->data[j + 1]; pcon->data[j + 1] = s; } } } display_contact(pcon); printf("排序成功!\n"); } void save_info(contact* pcon) { FILE* pf = fopen("contact.txt", "w+"); int i = 0; if (pf == NULL) { perror("fopen"); exit(EXIT_FAILURE); } fprintf(pf, "%d\n", pcon->sz); for (i = 0; i < pcon->sz; i++) { fprintf(pf,"%s %s %d %s %s\n", pcon->data[i].name, pcon->data[i].sex, pcon->data[i].age, pcon->data[i].tele, pcon->data[i].addr); } free(pcon->data); fclose(pf); } void load_info(contact* pcon) { FILE* pf = fopen("contact.txt", "r"); int i = 0; if (pf == NULL) { perror("fopen"); exit(EXIT_FAILURE); } fscanf(pf, "%d\n", &(pcon->sz)); for (i = 0; i < pcon->sz; i++) { INC_capacity(pcon); fscanf(pf, "%s %s %d %s %s\n", pcon->data[i].name, pcon->data[i].sex, &(pcon->data[i].age), pcon->data[i].tele, pcon->data[i].addr); } fclose(pf); }
//test.c#define _CRT_SECURE_NO_DEPRECATE 1 #include<stdio.h> #include"contact.h" #include<windows.h> void menu() { printf("*************************************\n"); printf("*************************************\n"); printf("*************************************\n"); printf("********* 通 讯 录 *******\n"); printf("********* 1.添加 2.删除 *******\n"); printf("********* 3.查找 4.修改 *******\n"); printf("********* 5.显示 6.清空 *******\n"); printf("********* 7.排序 0.退出 *******\n"); printf("*************************************\n"); printf("*************************************\n"); printf("*************************************\n"); } int main() { contact my_con; int input = 0; init_contact(&my_con); load_info(&my_con); do { menu(); printf("请选择:>"); scanf("%d", &input); switch (input) { case 0: break; case 1: add_contact(&my_con); break; case 2: del_contact(&my_con); break; case 3: find_contact(&my_con); break; case 4: modify_contact(&my_con); break; case 5: display_contact(&my_con); break; case 6: empty_contact(&my_con); break; case 7: name_sort(&my_con); break; default: printf("选择错误,请重新输入:>"); break; } } while (input); save_info(&my_con); system("pause"); return 0; }
动态的文件版本的通讯录
最新推荐文章于 2020-12-27 17:54:22 发布