当前位置: 首页 > news >正文

网站建设企业 熊账号小程序h5页面

网站建设企业 熊账号,小程序h5页面,上海优化网站公司,中铁建设门户网登录赵伟#x1f525;博客主页#xff1a;小王又困了 #x1f4da;系列专栏#xff1a;C语言 #x1f31f;人之为学#xff0c;不日近则日退 ❤️感谢大家点赞#x1f44d;收藏⭐评论✍️ 目录 一、什么是文件 1.1程序文件 1.2数据文件 1.3文件名 二、文件的打开和关闭 2… 博客主页小王又困了 系列专栏C语言 人之为学不日近则日退  ❤️感谢大家点赞收藏⭐评论✍️ 目录 一、什么是文件 1.1程序文件 1.2数据文件 1.3文件名 二、文件的打开和关闭 2.1文件指针 2.2文件的打开和关闭 三、文件的顺序读写 3.1顺序读写函数介绍 四、文件的随机读写 五、文本文件和二进制文件  六、文件读取结束的判定 七、文件缓存区 八、通讯录文件版 8.1将信息写入文件 8.2将文件中信息添加到通讯录 8.3完整代码  前言写通讯录的程序可以给通讯录中增加、删除数据此时数据是存放在内存中当程序退出的时候通讯录中的数据自然就不存在了等下次运行通讯录程序的时候数据又得重新录入如果使用这样的通讯录就很难受。使用文件我们可以将数据直接存放在电脑的硬盘上做到了数据的持久化。下面就让我们学习文件操作。 一、什么是文件 磁盘上的文件是文件。 但是在程序设计中我们一般谈的文件有两种程序文件、数据文件从文件功能的角度来分类的。  1.1程序文件 包括源程序文件后缀为.c,目标文件windows环境后缀为.obj,可执行程序windows环境后缀为.exe。 1.2数据文件 文件的内容不一定是程序而是程序运行时读写的数据比如程序运行需要从中读取数据的文件 或者输出内容的文件。 我们本次学习的是数据文件。 在以我们处理数据的输入输出都是以终端为对象的即从终端的键盘输入数据运行结果显示到显示器上。然而我们本次学习是从文件中读数据最后结果可以写到文件中去。 1.3文件名 一个文件要有一个唯一的文件标识以便用户识别和引用。 文件名包含3部分文件路径文件名主干文件后缀 例如 c:\code\test.txt 为了方便起见文件标识常被称为文件名。 二、文件的打开和关闭 2.1文件指针 每个被使用的文件都在内存中开辟了一个相应的文件信息区用来存放文件的相关信息如文件的名字文件状态及文件当前的位置等。这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的取名FILE。 例如VS2013编译环境提供的 stdio.h 头文件中有以下的文件类型申明  struct _iobuf {char *_ptr;int _cnt;char *_base;int _flag;int _file;int _charbuf;int _bufsiz;char *_tmpfname;}; typedef struct _iobuf FILE; 一般都是通过一个FILE的指针来维护这个FILE结构的变量这样使用起来更加方便。 定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区是一个结构体变量。通过该文件信息区中的信息就能够访问该文件。也就是说通过文件指针变量能够找到与它关联的文件。 2.2文件的打开和关闭 文件在读写之前应该先打开文件在使用结束之后应该关闭文件。 在编写程序的时候在打开文件的同时都会返回一个FILE*的指针变量指向该文件也相当于建立了指 针和文件的关系。 ANSIC 规定使用fopen函数来打开文件fclose来关闭文件。 打开文件 FILE * fopen ( const char * filename, const char * mode ); 参数filename包含要打开的文件的名称的 C 字符串。其值应遵循运行环境的文件名规范并且可以包含路径。 mode:包含文件访问的模式。 返回值如果文件成功打开该函数将返回指向FILE对象的指针。 文件使用方式含义如果指定文件不存在“r”只读为了输入数据打开存在的文本文件出错“w”只写为了输出数据打开一个文本文件建立一个新的文件“a”追加向文本文件尾添加数据建立一个新的文件“rb”只读为了输入数据打开一个二进制文件出错“wb”  (只写)为了输出数据打开一个二进制文件建立一个新的文件“ab”  (追加)向一个二进制文件尾添加数据建立一个新的文件“r”读写为了读和写打开一个文本文件出错“w” (读写)为了读和写建议一个新的文件建立一个新的文件“a” (读写)打开一个文件在文件尾进行读写建立一个新的文件“rb” (读写)为了读和写打开一个二进制文件出错“wb” (读写)为了读和写新建一个新的二进制文件建立一个新的文件“ab” (读写)打开一个二进制文件在文件尾进行读和写建立一个新的文件 注意输入的模式要用双引号引起来这样就表示字符串传过去的就是地址。 关闭文件 int fclose ( FILE * stream ); 参数指向指定要关闭的流的FILE对象的指针。 返回值如果流成功关闭则返回零值。失败时将返回EOF。 打开、关闭函数的使用  int main() {FILE* p fopen(date.txt, r);if (p NULL);{perror(fopen);return 1;}//读文件//关闭文件fclose(p);p NULL;return 0; } 记住关闭文件后要将指针置为空指针。  三、文件的顺序读写 3.1顺序读写函数介绍 功能函数名适用于字符输入函数fgetc所有输入流字符输出函数fputc所有输入流文本行输入函数fgets所有输入流文本行输出函数fputs所有输入流格式化输入函数fscanf所有输入流格式化输出函数fprintf所有输入流二进制输入fread文件二进制输出fwrite文件 C语言程序只要运行起来默认打开三个流 标准输入流stdin              FILE*标准输出流stdout            FILE*标准错误流stderr            FILE* 要对文件操作时只要产生一个与文件相关的流就可以。 读写数据时我们把数据写入流中读数据时从流中读。 输入和输出的关系 输入和输出都是相对程序说的。  读写函数的使用 fputc        将字符写入流 int fputc ( int character, FILE * stream ); 参数 character:要输入的字符。 stream:指向标识输出流的FILE对象的指针。 说明p指向的文件缓冲区与文件相关并且p是FILE*类型所以是输出流。 想要打印在屏幕上我们只要将p改为stdout。 fgetc        从流中获取字符 int fgetc ( FILE * stream ); 返回值成功后将返回字符读取提升为 int 值。 返回类型为 int 以适应特殊值EOF 如果位置指示器位于文件末尾则该函数返回EOF 从文件中读  从键盘上读  传文件指针从文件中读传stdin从键盘上读。 fputs        将字符串写入流 int fputs ( const char * str, FILE * stream ); 参数 str包含要写入流的内容的 C 字符串。 stream指向标识输出流的 FILE 对象的指针。stdin可以用作从标准输入读取的参数 我们可以看到两串字符串打印在了同一行所以我们在使用 fputs 想打印在不同的行要自己加 ‘ \0 ’。 注意fputs 与 puts 的不同之处不仅在于可以指定目标流而且 fputs 不会写入其他字符而puts会自动在末尾附加换行符。 fgets        从流中获取字符串 char * fgets ( char * str, int num, FILE * stream ); 参数 str指向在其中复制字符串读取的字符数组的指针。 num要复制到到 str 的最大字符数包括终止空字符。 stream指向标识输入流的 FILE 对象的指针。stdin可以用作从标准输入读取的参数 注意从流中读取字符并将其作为 C 字符串存储到 str 中直到读取 num-1 个字符或到达换行符或文件末尾。 fprintf        将格式化数据写入流 int fprintf ( FILE * stream, const char * format, ... ); 我们对比 print f和 fprintf 发现 fprintf 比 printf 多一个流所以我们使用 fprintf 打印的格式加一个流。 struct S {int n;float m; };int main() {struct S s { 100,3.14f };FILE* p fopen(date.txt, w);if (p NULL){perror(fopen);return 1;}fprintf(p, %d %f, s.n, s.m);fclose(p);p NULL;return 0; } fscanf        从流中读取格式化数据 int fscanf ( FILE * stream, const char * format, ... ); struct S {int n;float m; };int main() {struct S s { 0 };FILE* p fopen(date.txt, r);if (p NULL){perror(fopen);return 1;}fscanf(p, %d %f, s.n, s.m);printf(%d %f, s.n, s.m);fclose(p);p NULL;return 0; } scanf        从标准输入流读格式化的数据 printf          向标准输出流写格式化的数据 fscanf       适用于所有输入流的格式化输入函数  fprintf        适用于所有输出流的格式化输出函数  sscanf        从字符串中读取格式化的数据  sprintf        将格式化的数据转化成字符串 fwrite        写入要流式传输的数据块 size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream ); 参数 ptr指向要写入的元素数组的指针转换为 const void*。 size要写入的每个元素的大小以字节为单位。 count元素数每个元素的大小为字节大小。 fread        从流中读取数据块 size_t fread ( void * ptr, size_t size, size_t count, FILE * stream ); 参数 ptr指向大小至少为 size*count 字节的内存块的指针转换为 void*。 size要读取的每个元素的大小以字节为单位。 count元素数每个元素的大小为字节大小。 四、文件的随机读写 4.1fseek        根据文件指针的位置和偏移量来定位文件指针 int fseek ( FILE * stream, long int offset, int origin ); 参数 offset二进制文件要从源偏移的字节数。            文本文件零或ftell返回的值。 origin用作偏移参考的位置。 SEEK_SET文件开头SEEK_CUR文件指针的当前位置SEEK_END文件结尾  4.2ftell         返回文件指针相对于起始位置的偏移量 long int ftell ( FILE * stream ); 4.3rewind         让文件指针的位置回到文件的起始位置 void rewind ( FILE * stream ); 五、文本文件和二进制文件  根据数据的组织形式数据文件被称为文本文件或者二进制文件。 数据在内存中以二进制的形式存储如果不加转换的输出到外存就是二进制文件。 如果要求在外存上以ASCII码的形式存储则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。 简单来讲我们看不懂的是二进制文件看得懂的就是文本文件。 一个数据在内存中是怎么存储的呢 字符一律以ASCII形式存储数值型数据既可以用ASCII形式存储也可以使用二进制形式存储。 例如有整数10000如果以ASCII码的形式输出到磁盘则磁盘中占用5个字节每个字符一个字节而 二进制形式输出则在磁盘上只占4个字节。 #include stdio.h int main() {int a 10000;FILE* pf fopen(test.txt, wb);fwrite(a, 4, 1, pf);//二进制的形式写到文件中fclose(pf);pf NULL;return 0; }六、文件读取结束的判定 牢记在文件读取过程中不能用feof函数的返回值直接来判断文件的是否结束。 feof 的作用是当文件读取结束的时候判断是读取结束的原因是否是遇到文件尾结束。 1. 文本文件读取是否结束判断返回值是否为 EOF fgetc 或者 NULL fgets 例如 fgetc 判断是否为 EOF .fgets 判断返回值是否为 NULL . 2. 二进制文件的读取结束判断判断返回值是否小于实际要读的个数。 例如 fread判断返回值是否小于实际要读的个数。 例子   #include stdio.h #include stdlib.h int main() {int c; // 注意int非char要求处理EOFFILE* fp fopen(test.txt, r);if (!fp) {perror(File opening failed);return EXIT_FAILURE;}//fgetc 当读取失败的时候或者遇到文件结束的时候都会返回EOFwhile ((c fgetc(fp)) ! EOF) // 标准C I/O读取文件循环{putchar(c);}//判断是什么原因结束的if (ferror(fp))puts(I/O error when reading);else if (feof(fp))puts(End of file reached successfully);fclose(fp);fp NULL;return 0; } 七、文件缓存区 ANSIC 标准采用“缓冲文件系统”处理的数据文件的所谓缓冲文件系统是指系统自动地在内存中为程序 中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区装 满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据则从磁盘文件中读取数据输入到内存缓 冲区充满缓冲区然后再从缓冲区逐个地将数据送到程序数据区程序变量等。缓冲区的大小根 据C编译系统决定的。  验证缓冲区存在  #include stdio.h #include windows.h //VS2013 WIN10环境测试 int main() {FILE* pf fopen(test.txt, w);fputs(abcdef, pf);//先将代码放在输出缓冲区printf(睡眠10秒-已经写数据了打开test.txt文件发现文件没有内容\n);Sleep(10000);printf(刷新缓冲区\n);fflush(pf);//刷新缓冲区时才将输出缓冲区的数据写到文件磁盘//注fflush 在高版本的VS上不能使用了printf(再睡眠10秒-此时再次打开test.txt文件文件有内容了\n);Sleep(10000);fclose(pf);//注fclose在关闭文件的时候也会刷新缓冲区pf NULL;return 0; } 八、通讯录文件版 我们希望退出程序之前录入的信息可以保存在文件中等下次打开程序还可以找到之前存放的信息。只要在销毁信息前将信息保存到文件中。 8.1将信息写入文件 void SaveContact(Contact* pc) {FILE* pf fopen(contact.txt, wb);if (pf NULL){perror(SaveContact);return 1;}//写数据int i 0;for (i 0; i pc-sz, i){fwrite(pc-date i, sizeof(PeoInfo), 1, pf);}//关闭文件fclose(pf);pf NULL;} 可以看到在退出通讯录存储的信息以二进制存放在文件中。 8.2将文件中信息添加到通讯录 我们要在初始化通讯的时候把文件中信息添加到通讯录。 一个一个的读取数据当没有读到数据返回0说明数据读完了。在放数据的时候我们也要判断空间是否充足。 void LoadContact(Contact* pc) {FILE* pf fopen(contact.txt, rb);if (pf NULL){perror(LoadContact);return 1;}//读数据PeoInfo tmp { 0 };while (fread(tmp, sizeof(PeoInfo), 1, pf)){if (0 CheckCapacity(pc)){return;}pc-date[pc-sz] tmp;pc-sz;}//关闭文件fclose(pf);pf NULL;} 8.3完整代码  contact.h #include stdio.h #include string.h #include assert.h #include stdlib.h#define MAX 100 #define DEFAULT_SZ 3 #define INC_SZ 2typedef struct PeoInfo {char name[20];int age;char sex[5];char tele[12];char addr[15]; }PeoInfo;//动态 typedef struct Contact {PeoInfo* date; //指向存放数据的空间int sz; //当前通讯录存储的信息的个数int cap; //通讯录当前最大容量 }Contact;enum OPTION {Exit,Add,Del,Serach,Modify,Show,Sort };//函数声明//初始化 void InitContact(Contact* pc);//增加联系人 void AddContact(Contact* pc);//显示联系人 void ShowContact(const Contact* pc);//删除联系人 void DelContact(Contact* pc);//查找联系人 void SearchContact(const Contact* pc);//修改联系人 void ModifyContact(Contact* pc);//排序 int cmp_by_name(const void* p1, const void* p2);//释放 void DestoryContact(Contact* pc);//保存函数 void SaveContact(Contact* pc); test.c #include contact.hvoid menu() {printf(------------------------------------\n);printf( 1. Add 2. Del \n);printf( 3. Search 4. Modify \n);printf( 5. Show 6. Sort \n);printf( 0. Exit \n);printf(------------------------------------\n); }void test() {int input 0;Contact con; //通讯录InitContact(con);do{menu();printf(请选择:);scanf(%d, input);switch (input){case Add:AddContact(con);break;case Del:DelContact(con);break;case Serach:SearchContact(con);break;case Modify:ModifyContact(con);break;case Show:ShowContact(con);break;case Sort://按名字排序qsort(con.date, con.sz, sizeof(PeoInfo), cmp_by_name);break;case Exit:SaveContact(con);DestoryContact(con);printf(退出通讯录\n);break;default:printf(输入错误请重新输入\n);break;}} while (input); }int main() {test();return 0; } contact.c #include contact.hint CheckCapacity(pc);void LoadContact(Contact* pc) {FILE* pf fopen(contact.txt, rb);if (pf NULL){perror(LoadContact);return 1;}//读数据PeoInfo tmp { 0 };while (fread(tmp, sizeof(PeoInfo), 1, pf)){if (0 CheckCapacity(pc)){return;}pc-date[pc-sz] tmp;pc-sz;}//关闭文件fclose(pf);pf NULL;}//动态 void InitContact(Contact* pc) {assert(pc);pc-date (PeoInfo*)malloc(DEFAULT_SZ * sizeof(PeoInfo));if (pc-date NULL){perror(InitContact);return;}pc-sz 0;pc-cap DEFAULT_SZ;LoadContact(pc); }int CheckCapacity(Contact* pc) {if (pc-sz pc-cap){PeoInfo* ptr (PeoInfo*)realloc(pc-date, (pc-cap INC_SZ) * sizeof(PeoInfo));if (ptr NULL){perror(CheckCapacity);return 0;}else{pc-date ptr;pc-cap INC_SZ;printf(增容成功\n);return 1;}}return 1; }//动态 void AddContact(Contact* pc) {assert(pc);if (0 CheckCapacity(pc)){return;}printf(请输入名字:);scanf(%s, pc-date[pc-sz].name);printf(请输入年龄:);scanf(%d, (pc-date[pc-sz].age));printf(请输入性别:);scanf(%s, pc-date[pc-sz].sex);printf(请输入电话:);scanf(%s, pc-date[pc-sz].tele);printf(请输入地址:);scanf(%s, pc-date[pc-sz].addr);pc-sz;printf(添加成功\n); }void ShowContact(const Contact* pc) {assert(pc);//打印标题printf(%-10s\t%-4s\t%-5s\t%-12s\t%-10s\n, 姓名, 年龄, 性别, 电话, 地址);int i 0;for (i 0; i pc-sz; i){printf(%-10s\t%-4d\t%-5s\t%-12s\t%-10s\n, pc-date[i].name,pc-date[i].age,pc-date[i].sex,pc-date[i].tele,pc-date[i].addr);} }int FindByname(Contact* pc, char name[]) {int i 0;for (i 0; i pc-sz; i){if (strcmp(pc-date[i].name, name) 0){return i;}}return -1; }void DelContact(Contact* pc) {assert(pc);if (pc-sz 0){printf(通讯录为空无法删除\n);}char name[20] { 0 };int flag 0;printf(要删除的联系人:);scanf(%s, name);int del FindByname(pc, name);if (del -1){printf(要删除的联系人不存在\n);return;}int i 0;for (i del; i pc-sz - 1; i){pc-date[i] pc-date[i 1];}pc-sz--;printf(成功删除联系人\n); }void SearchContact(const Contact* pc) {assert(pc);char name[20] { 0 };printf(请输入要查找人的名字:);scanf(%s, name);int pos FindByname(pc, name);if (pos -1){printf(要查找的人不存在\n);}else{printf(%-10s\t%-4s\t%-5s\t%-12s\t%-10s\n, 姓名, 年龄, 性别, 电话, 地址);printf(%-10s\t%-4d\t%-5s\t%-12s\t%-10s\n, pc-date[pos].name,pc-date[pos].age,pc-date[pos].sex,pc-date[pos].tele,pc-date[pos].addr);}}void ModifyContact(Contact* pc) {assert(pc);char name[20] { 0 };printf(请输入要修改的人的名字:);scanf(%s, name);int pos FindByname(pc, name);if (pos -1){printf(要修改的人不存在\n);}else{printf(请输入名字:);scanf(%s, pc-date[pos].name);printf(请输入年龄:);scanf(%d, (pc-date[pos].age));printf(请输入性别:);scanf(%s, pc-date[pos].sex);printf(请输入电话:);scanf(%s, pc-date[pos].tele);printf(请输入地址:);scanf(%s, pc-date[pos].addr);}printf(修改成功\n); }int cmp_by_name(const void* p1, const void* p2) {return strcmp(((PeoInfo*)p1)-name, ((PeoInfo*)p2)-name); }void DestoryContact(Contact* pc) {free(pc-date);pc-date NULL;pc-cap 0;pc-sz 0; }void SaveContact(Contact* pc) {FILE* pf fopen(contact.txt, wb);if (pf NULL){perror(SaveContact);return 1;}//写数据int i 0;for (i 0; i pc-sz; i){fwrite(pc-date i, sizeof(PeoInfo), 1, pf);}//关闭文件fclose(pf);pf NULL;} 本次的内容到这里就结束啦。希望大家阅读完可以有所收获同时也感谢各位读者三连支持。文章有问题可以在评论区留言博主一定认真认真修改以后写出更好的文章。
http://www.zqtcl.cn/news/602781/

相关文章:

  • 做网站找个人还是找公司wordpress jiathis
  • 淘宝客推广网站建设百度云wordpress转服务器
  • 网站构建代码模板怎么在云服务器上建设网站
  • 国内产品网站建设游戏创造器
  • 北京南站到北京站怎么走南宁美丽南方官方网站建设意见
  • 网站建设捌金手指专业5电商运营怎么推广一个新品
  • 医院网站建设企业走廊文化建设图片网站
  • 学网站建设培训机构公司网站建立费用
  • 阜宁网站制作服务商自学网站开发设计
  • 湖南建设监理工程网站设计类招聘网站
  • 门户网站建设的平台搭建长春专业网站建设推广
  • 网站建设宗旨怎么写网站建设公司外链怎么做
  • 绍兴市交通建设检测中心网站seo专业培训网络班
  • 设计国外网站有哪些玉环在哪里做网站
  • 设计网站思路如何写wordpress 修改登录
  • 网站开发php国外设计网站app吗
  • 智能响应式网站淳安县住房和城乡建设局网站
  • 招投标网站开发企业网站建设之后
  • 如何做好集团网站建设怎么做门淘宝网站
  • 医疗协助平台网站建设方案学生个人网页制作html报告
  • 专注于网站营销服务新浪云搭建wordpress
  • 免费自助建站代理鞍山招聘网最新招聘
  • 营销型类型网站有哪些类型php网站后台制作
  • 安全的网站制作公司百度app最新版本
  • 中小企业建站平台耐克网站建设策划方案
  • wordpress 后台加入链接后_网站显示是标签_不是链接wms智能仓储管理系统
  • 网站建设需要什么硬件和软件有哪些中考网络应用服务平台
  • 为什么网站权重会掉房地产开发网站建设
  • 大连seo整站优化酷播wordpress视频插件
  • 好的网页设计网站学编程要什么学历