c语言3月23日学习总结
来源:互联网 发布:天津医科大学考研知乎 编辑:程序博客网 时间:2024/06/11 00:38
1.数据块读写函数fread和write
/* fwrite 和 fread 是数据的写入和读取的函数 每次读写一块数据,不是读取字符个数 fwrite 写入数据到文件中 1) 字符串 FILE *fp = fopen("fwriteString.txt","w"); if(fp!=NULL){ // fwrite(buffer,size,count,fp); char str[]="helloWorld!"; fwrite(str,strlen(str),1,fp); printf("文件写入成功!\n"); } fcolose(fp); fp = NULL; */#include <stdio.h>#include <string.h>/** * fwrite写入一个字符串到文件中 */void test1(){ //定义文件指针 FILE *fp = fopen("fwriteString.txt","w"); //判断文件是否打开成功 if(fp!=NULL){ // fwrite(buffer,size,count,fp); char str[]="helloWorld!"; //使用fwrite 写入一块数据 fwrite(str,strlen(str),1,fp); printf("文件写入成功!\n"); } fclose(fp); fp = NULL;}//用fwrite 写入一个二进制文件void test2(){ //定义文件指针 FILE *fp = fopen("d.data","wb"); //w写入 b 二进制 //判断文件是否打开成功 if(fp!=NULL){ int num = 10; //写入到文件中 fwrite(&num, sizeof(num), 1, fp); printf("写入文件成功!\n"); } fclose(fp); fp = NULL;}/** * 从文件中读取二进制数据 */void test3(){ //定义文件指针 FILE *fp = fopen("d.data","rb"); //w写入 b 二进制 //判断文件是否打开成功 if(fp!=NULL){ int num = 0; //fread(buffer,size,count,fp); fread(&num, sizeof(num), 1, fp); printf("读取成功:num = %d\n",num); } fclose(fp); fp = NULL;}int main(int argc, const char * argv[]) { test3(); return 0;}
2.应用:从文件中读取结构体信息
#include <stdio.h>int main(int argc, const char * argv[]) { //1、定义结构 struct Student { char name[20]; char sex; int age; float score; }; //2、定义结构数组 //3、接收用户输入的内容 struct Student stu[5]={{"zbz",'F',38,59.99f},{"sb",'F',48,59.99f},{"cgx",'F',18,59.99f},{"dlj",'M',8,59.99f},{"banzhang",'Y',18,99.99f}}; //4、写入数据 FILE *fp = fopen("student.data", "wb+"); if (fp!=NULL) { // fwrite(&stu[i],sizeof(struct Studnet),1,fp) for (int i=0; i<5; i++) { // fwrite(&stu[i],sizeof(struct Student),1,fp); } printf("文件写入成功!\n\n\n"); // 立即读取 // 文件指针拉回来 rewind(fp); // 定义结构数组,接收从文件中读取的数据 struct Student stuArray[5]; printf("姓名\t\t性别\t\t年龄\t\t成绩\n"); for (int i=0; i<5; i++) { //读取数据并且保存到 stuArray中 fread(&stuArray[i],sizeof(struct Student),1,fp); printf("%s\t\t%c\t\t%d\t\t%.2f\n",stuArray[i].name,stuArray[i].sex,stuArray[i].age,stuArray[i].score); } // 遍历显示 } return 0;}
3.格式化读写函数fscanf和fprintf
/* fscanf() 格式化的读取,从文件中读取 fprintf() 格式化的写入,写入到文件中 10:9.9,xxxx,1.jpg# fprintf(fp,"%d:%.2f,%s,%s#",10,9.9f,"最便宜的面膜","20150301010101.jpg"); */#include <stdio.h>/** * 格式化的写入 */void test1(){ FILE* fp = fopen("fprintf.txt", "w"); if (fp!=NULL) { //格式化写入 int productId = 10; float productPrice = 9.9f; char *productTitle = "最便宜的面膜"; char *productTitleImg="20150301010101.jpg"; fprintf(fp,"%d:%.2f,%s\n%s",productId,productPrice,productTitle,productTitleImg); printf("数据写入成功!\n"); } fclose(fp);}void test2(){ FILE* fp = fopen("fprintf.txt", "r"); if (fp!=NULL) { //格式化写入 int productId = 0; float productPrice = 0.0f; char productTitle[50]; char productTitleImg[50]; fscanf(fp,"%d:%f,%s\n%s",&productId,&productPrice,productTitle,productTitleImg); printf("产品编号:%d\n",productId); printf("产品价格:¥%.2f\n",productPrice); printf("产品名称:%s\n",productTitle); printf("产品图片:%s\n",productTitleImg); } fclose(fp);}int main(int argc, const char * argv[]) { test2(); return 0;}
4.应用:向文件中读取和写入一个二维数组
#include <stdio.h>int main(int argc, const char * argv[]) { //使用fprintf和fscanf函数 将一个二维数组逐行写入到文件中,并读取出来。 //1、定义二维数组 int a[3][2]={1,2,3,4,5,6}; //2、定义文件指针 FILE *fp = fopen("saveArray.txt", "w+"); //3、判断 if (fp!=NULL) { //4、格式化的写入 1,2# for (int i=0; i<3; i++) { fprintf(fp,"%d,%d#",a[i][0],a[i][1]); } //5、拉回指针 rewind(fp); //6、定义数组,接收读取的内容 int array[3][2]; //7、循环读取 for (int i=0; i<3; i++) { fscanf(fp, "%d,%d#",&array[i][0],&array[i][1]); printf("%d\t\t%d\n",array[i][0],array[i][1]); printf("-------------------\n"); } // 显示出来 } //关闭文件指针 fclose(fp); fp = NULL; return 0;}
5.文件的随机读写
#include <stdio.h>int main(int argc, const char * argv[]) { //从二进制文件student.data(160)个字节 //读取第二个学生的信息 // 先定义结构体 struct Student { char name[20]; char sex; int age; float score; }; // 定义结构体变量保存读取出来的学生信息 struct Student stu; //1、定义文件指针,并且打开文件 FILE *fp = fopen("student.data", "r"); //2、判断 if (fp!=NULL) { //3、移动文件内内部指针 fseek(fp, sizeof(stu)*2, SEEK_SET); //SEEK_SET也可以换成0 //4、读取 fread(&stu,sizeof(stu),1,fp); //5、显示出来 printf("%d,%c,%.2f,%s\n",stu.age,stu.sex,stu.score,stu.name); } //关闭文件指针 fclose(fp); return 0;}
6.内存分区
内存从高到低依次是:
栈: 存放临时创建的局部变量
堆:存放进程运行中被动态分配的内存段
BSS段:存放程序中未初始化的全局变量和静态变量
数据段:用来存放已初始化的全局变量和静态变量
代码段:存放程序执行代码的一块内存区域
7.综合应用:通讯录的实现
// main.c// C15-通讯录#include <stdio.h>//1、导入头文件#include <string.h>//定义宏(联系人数组的长度,姓名长度、电话号码长度)#define NAME_LEN 22#define TELNUM_LEN 16#define LEN 100//定义联系人结构体typedef struct { //定义联系人姓名 char name[NAME_LEN]; //定义联系人的电话号码 char telNum[TELNUM_LEN];} Person; //给结构体起一个别名//定义联系人数组Person contacts[LEN];//定义变量保存联系人个数int totalContactCount = 0;//定义变量保存文件的名称char *filePath = "telbook.data";//定义函数,并且声明void doAdd();void doDelete();void doUpdate();void doList();void doSearchByName();void init();void writeToFile();//选择不同的功能,调用不同的函数int main(int argc, const char * argv[]) { int num=0; //调用初始化方法 init(); int flag = 1; //退出标志 while (flag) { //编写控制程序 printf("\n\n**************************\n"); printf("****** 欢迎使用通讯录 ******\n"); printf("****** 1、添加联系人 ******\n"); printf("****** 2、删除联系人 ******\n"); printf("****** 3、修改联系人 ******\n"); printf("****** 4、查看所有联系人 ****\n"); printf("****** 5、搜索联系人 ******\n"); printf("****** 6、退出系统 ******\n"); printf("**************************\n\n"); printf("请输入1-6之间的序号,选择要执行的功能\n"); //接收用户输入的编号 scanf("%d",&num); //判断输入的序号是否合法 if(num<1 || num >6){ printf("输入错误!\n"); }else{ //根据用户输入的编号,执行不同的功能 switch (num) { case 1: doAdd(); break; case 2: doDelete(); break; case 3: doUpdate(); break; case 4: doList(); break; case 5: doSearchByName(); break; case 6: printf("正在退出系统...\n"); printf("系统已经退出!\n"); //return 0; flag = 0; break; default: break; } } } return 0;}/** * 添加联系人 1) 提示用户输入联系人信息 2)接收联系人信息 3)提示输入电话号码信息 4)接收电话号码 5)让用户再次确认添加联系人 1 确认 0 取消 6)保存联系人信息到 联系人数组中 7)让联系人的个数+1 8) 把最新的数组,重新保存到文件中 */void doAdd(){ printf("您正在执行的是添加联系人的操作:\n");// 1) 提示用户输入联系人信息 printf("请输入联系人姓名: [*联系人姓名中间不能有空格]\n");// 2)接收联系人信息 //contacts[1].name char name[NAME_LEN]; char telNum[TELNUM_LEN]; scanf("%s",name);// 3)提示输入电话号码信息 printf("请输入联系人电话号码: [*联系人号码中间不能有空格]\n"); //4)接收电话号码 scanf("%s",telNum);// 5)让用户再次确认添加联系人 1 确认 0 取消 int nn; printf("您确定要添加这个联系人吗? 0.取消 1.确认\n"); scanf("%d",&nn); if (nn) {// 6)保存联系人信息到 联系人数组中 strcpy(contacts[totalContactCount].name, name); strcpy(contacts[totalContactCount].telNum, telNum);// 7)让联系人的个数+1 totalContactCount++;// 8) 把最新的数组,重新保存到文件中 writeToFile(); } printf("联系人添加成功!\n");}/** * 删除联系人 1)提示用户输入一个要删除的联系人的编号 2)判断编号是否合法 3)再判断 要删除的元素 是否是数组的最后一个元素 如果是最后一个元素,总人数-1 如果不是最后一个元素,也就是中间的元素 移动元素 i = 编号 i< 总 i++ a[编号-1] = a[编号] 总人数-1 4)同步写入到文件中 */void doDelete(){ printf("您正在执行的是删除联系人的操作:\n"); doList();// 1)提示用户输入一个要删除的联系人的编号 int nn; printf("请输入一个要删除的联系人的编号:\n"); scanf("%d",&nn);// 2)判断编号是否合法 if (nn <1 || nn > totalContactCount) { //如果编号不合法,则return 返回了 return ; } int queren=0; printf("联系人删除后,无法恢复,请确认是否要删除: 0.取消 1.确认\n"); scanf("%d",&queren); if (queren) { // 3)再判断 要删除的元素 是否是数组的最后一个元素 if(nn == totalContactCount){ // 如果是最后一个元素,总人数-1 totalContactCount--; }else{ // 如果不是最后一个元素,也就是中间的元素 // 移动元素 // i = 编号 i< 总 i++ for (int i = nn; i<totalContactCount; i++) { //nn 是编号,编号比下标大1 // a[i-1] = a[i] contacts[i-1] = contacts[i]; } // 总人数-1 totalContactCount--; } // 4)同步写入到文件中 writeToFile(); }}/** * 修改联系人 1) 提示用户输入一个联系人的编号 2) 判断编号是否合法 3)让用户输入新的联系人姓名和电话 4) 接收用户的输入 5)让用户再次确认删除 6)把原来的姓名和电话进行更新 7)同步保存到文件中 */void doUpdate(){ printf("您正在执行的是修改联系人的操作:\n"); //显示所有的联系人 doList();// 1)提示用户输入一个要删除的联系人的编号 int nn; printf("请输入一个要修改的联系人的编号:\n"); scanf("%d",&nn);// 2)判断编号是否合法 if (nn <1 || nn > totalContactCount) { //如果编号不合法,则return 返回了 return ; } char name[NAME_LEN]; char telNum[TELNUM_LEN];// 3)让用户输入新的联系人姓名和电话 printf("请输入联系人姓名: [*联系人姓名中间不能有空格]\n");// 4) 接收用户的输入 scanf("%s",name); printf("请输入联系人电话号码: [*联系人号码中间不能有空格]\n"); scanf("%s",telNum);// 5)让用户再次确认删除 int queren = 0; printf("修改后联系人信息后,数据无法恢复,请确认修改:0.取消 1.确认\n"); scanf("%d",&queren); if (queren) {// 6)把原来的姓名和电话进行更新 strcpy(contacts[nn-1].name, name); strcpy(contacts[nn-1].telNum, telNum);// 7)同步保存到文件中 writeToFile(); }}/** * 查询所有的联系人 思路: 1)先判断 totalContactCount == 0 如果等于0 表示没有联系人,提示:通讯录空无一人 不等于0 打印所有的联系人 2)循环 3)遍历输出所有的联系人信息 */void doList(){ printf("您正在执行的是查询所有的联系人的操作:\n");// 1)先判断 totalContactCount == 0 if(totalContactCount == 0){// 如果等于0 表示没有联系人,提示:通讯录空无一人 printf("您的通讯录还很寂寞!\n"); }else{ printf("编号\t\t姓名\t\t\t电话\t\t\n");// 不等于0 打印所有的联系人 for (int i=0; i<totalContactCount; i++) { // 2)循环 // 3)遍历输出所有的联系人信息 printf("%d\t\t%s\t\t\t%s\t\t\n",i+1,contacts[i].name,contacts[i].telNum); } }}/** * 搜索联系人 1) 提示用户输入一个联系人的姓名 2)接收这个姓名 3)循环,遍历数组 //进行字符串的比较 //strcmp(contacts[i].name,name) == 0 //如果查找到了,输出这个联系人的电话号码 //如果没有查找到,提示:没有查找到 */void doSearchByName(){ printf("您正在执行的是搜索联系人的操作:\n");// 1) 提示用户输入一个联系人的姓名 char name[NAME_LEN]; printf("请输入联系人姓名: [*联系人姓名中间不能有空格]\n");// 2)接收这个姓名 scanf("%s",name);// 3)循环,遍历数组 int i; for (i=0; i<totalContactCount; i++) { //进行字符串的比较 //strcmp(contacts[i].name,name) == 0 if (strcmp(contacts[i].name, name)==0) { //如果查找到了,输出这个联系人的电话号码 printf("您要查找的联系人: %s 的电话是: %s \n",name,contacts[i].telNum); //查找到了以后,停止 break; } } //如果没有查找到,提示:没有查找到 if (i==totalContactCount) { printf("对不起,没有查找到%s这个人!",name); }}/** * 初始化函数 思路: 1)定义文件指针,并且(尝试)打开文件 2)如果能够打开这个文件(说明文件已经存在了) i.把文件中存放联系人数量读取出来 ii.根据联系人的数量,把联系人信息全部读取出来,放到联系人数组中 如果文件打开失败了 i.创建文件 ii.写入联系人数量 0 3)关闭文件指针 */void init(){ printf("系统正在初始化...\n");// 1)定义文件指针,并且(尝试)打开文件 FILE *fp = fopen(filePath, "r");// 2)如果能够打开这个文件(说明文件已经存在了)// if (fp!=NULL) {// i.把文件中存放联系人数量读取出来 fread(&totalContactCount, sizeof(totalContactCount), 1, fp);// ii.根据联系人的数量,把联系人信息全部读取出来,放到联系人数组中 for (int i=0; i<totalContactCount; i++) { //依次读取每个联系人的信息 //contacts[0] fread(&contacts[i], sizeof(Person), 1, fp); }// }else{// 如果文件打开失败了// // i.创建文件 fp = fopen(filePath, "w");// ii.写入联系人数量 0// totalContactCount fwrite(&totalContactCount, sizeof(totalContactCount), 1, fp); printf("通讯录数据文件创建成功!\n");// }// 3)关闭文件指针 fclose(fp); fp = NULL; printf("系统初始化完成!\n");}/** * 把数组的内容重新写入到文件中 1)打开文件,w 2)判断是否打开成功 3)先把联系人的数量写入到文件中 4)把每个联系人的数据,都写入到文件中 5)关闭文件 */void writeToFile(){// 1)打开文件,w FILE *fp = fopen(filePath, "w");// 2)判断是否打开成功 if (fp!=NULL) {// 3)先把联系人的数量写入到文件中 // 1 fwrite(&totalContactCount, sizeof(totalContactCount), 1, fp);// 4)把每个联系人的数据,都写入到文件中 for (int i=0; i<totalContactCount; i++) { //每次写入一个联系人数据 fwrite(&contacts[i], sizeof(Person), 1, fp); }// printf("数据更新完成!\n"); }// 5)关闭文件 fclose(fp);}
0 0
- c语言3月23日学习总结
- c语言3月3日学习总结
- c语言3月4日学习总结
- c语言3月5日学习总结
- c语言3月7日学习总结
- c语言3月10日学习总结
- c语言3月8日学习总结
- c语言3月12日学习总结
- c语言3月13日学习总结
- c语言3月14日学习总结
- c语言3月16日学习总结
- c语言3月17日学习总结
- c语言3月19日学习总结
- c语言3月20日学习总结
- c语言3月22日学习总结
- 2012年3月20日C语言学习笔记
- 2016年12月13日学习总结----C语言关键字总结
- 2016年11月21日学习总结----C语言标准
- OpenLayers 源码分析
- bootstrap的图标
- 让非root用户有权限访问USB设备。
- 快排
- GCD 深入理解(二)
- c语言3月23日学习总结
- 硕邗巾模浑搽绕篙瓤吐剡乱厂哑狮犯盈扳尿嫠孝题搪指拍鬯岿佛
- WPF中ListView使用GridViewColumn居中对齐的方法
- 逭愤墚颗珊锌磋禺誉帜谩祷拯症轨盯莨姨扭状乞
- aidl
- 呵止江埏逅摭萆镜盈舷莪捐泻它帅皑侮藤捎圄踩
- 解决rails4.0中send_file文件下载两次的问题
- static_cast, dynamic_cast, const_cast, reinterpret_cast的简单介绍
- 32bit 和 64bit系统的区别