C语言文件操作与类型转换:进阶编程必备技能

张开发
2026/4/12 2:47:55 15 分钟阅读

分享文章

C语言文件操作与类型转换:进阶编程必备技能
根据您的要求只修改了致命的逻辑错误feof误用部分其他内容一字未改。以下是修改后的博客全文C语言文件操作与类型转换进阶编程必备技能一、文件操作概述1.1 为什么需要文件操作在前面的学习中我们使用变量和数组来存储数据但这些数据在程序结束后就会丢失。如果希望数据持久保存就需要使用文件。文件可以将数据存储在磁盘上供程序长期使用或与其他程序共享。1.2 C语言中的文件概念在C语言中文件被抽象为流Stream。C标准库提供了一套完整的文件操作函数使用时需要包含stdio.h头文件。C语言将所有设备都当作文件来处理键盘是标准输入文件stdin屏幕是标准输出文件stdout。二、文件的打开与关闭2.1 FILE类型C语言使用FILE类型来表示文件信息区FILE*fp;// 定义一个指向FILE的指针FILE是一个结构体类型包含了文件的各种信息如文件位置、缓冲区状态等。2.2 fopen函数——打开文件FILE*fopen(constchar*filename,constchar*mode);参数说明filename要打开的文件名mode打开模式打开模式模式含义“r”只读文件必须存在“w”只写文件不存在则创建存在则清空“a”追加文件不存在则创建“r”读写文件必须存在“w”读写文件不存在则创建存在则清空“a”读写和追加文件不存在则创建示例#includestdio.hintmain(){FILE*fp;// 打开文件用于写入fpfopen(test.txt,w);if(fpNULL){printf(文件打开失败\n);return1;}printf(文件打开成功\n);// 操作文件...fclose(fp);// 关闭文件return0;}2.3 fclose函数——关闭文件intfclose(FILE*fp);关闭文件释放相关资源fclose(fp);// 关闭文件指针fp指向的文件重要打开文件后一定要关闭三、文件的读写3.1 字符读写函数fputc函数——写入一个字符intfputc(intc,FILE*fp);#includestdio.hintmain(){FILE*fpfopen(test.txt,w);if(fpNULL)return1;fputc(H,fp);fputc(e,fp);fputc(l,fp);fputc(l,fp);fputc(o,fp);fclose(fp);return0;}fgetc函数——读取一个字符intfgetc(FILE*fp);#includestdio.hintmain(){FILE*fpfopen(test.txt,r);if(fpNULL)return1;intch;while((chfgetc(fp))!EOF)// EOF表示文件结束{putchar(ch);}fclose(fp);return0;}3.2 字符串读写函数fputs函数——写入字符串intfputs(constchar*s,FILE*fp);#includestdio.hintmain(){FILE*fpfopen(test.txt,w);if(fpNULL)return1;fputs(Hello, World!\n,fp);fputs(Welcome to C Programming!,fp);fclose(fp);return0;}fgets函数——读取字符串char*fgets(char*s,intn,FILE*fp);读取最多n-1个字符遇到换行符或文件结束停止自动添加字符串结束符’\0’#includestdio.hintmain(){charbuffer[100];FILE*fpfopen(test.txt,r);if(fpNULL)return1;while(fgets(buffer,sizeof(buffer),fp)!NULL){printf(%s,buffer);}fclose(fp);return0;}3.3 格式化读写函数fprintf函数——格式化写入intfprintf(FILE*fp,constchar*format,...);#includestdio.hintmain(){FILE*fpfopen(data.txt,w);if(fpNULL)return1;fprintf(fp,姓名%s\n,张三);fprintf(fp,年龄%d\n,20);fprintf(fp,成绩%.1f\n,95.5);fclose(fp);return0;}fscanf函数——格式化读取intfscanf(FILE*fp,constchar*format,...);#includestdio.hintmain(){charname[20];intage;floatscore;FILE*fpfopen(data.txt,r);if(fpNULL)return1;fscanf(fp,姓名%s,name);fscanf(fp,年龄%d,age);fscanf(fp,成绩%f,score);printf(%s %d %.1f\n,name,age,score);fclose(fp);return0;}3.4 二进制读写函数fread函数——二进制读取size_t fread(void*ptr,size_tsize,size_tnmemb,FILE*fp);fwrite函数——二进制写入size_tfwrite(constvoid*ptr,size_tsize,size_tnmemb,FILE*fp);#includestdio.hstructStudent{charname[20];intage;floatscore;};intmain(){structStudentstu{张三,20,95.5};FILE*fpfopen(student.dat,wb);if(fpNULL)return1;// 写入二进制数据fwrite(stu,sizeof(structStudent),1,fp);fclose(fp);// 读取二进制数据fpfopen(student.dat,rb);if(fpNULL)return1;structStudentstu2;fread(stu2,sizeof(structStudent),1,fp);printf(%s %d %.1f\n,stu2.name,stu2.age,stu2.score);fclose(fp);return0;}四、文件定位4.1 fseek函数——移动文件位置指针intfseek(FILE*fp,longoffset,intwhence);offset偏移量whence起始位置| whence | 含义 ||-------|------|| SEEK_SET | 文件开头 || SEEK_CUR | 当前位置 || SEEK_END | 文件末尾 |#includestdio.hintmain(){FILE*fpfopen(test.txt,w);fprintf(fp,Hello World!);// 定位到文件开头fseek(fp,0,SEEK_SET);// 定位到第6个字符W的位置fseek(fp,6,SEEK_SET);charchfgetc(fp);printf(%c\n,ch);// 输出Wfclose(fp);return0;}4.2 rewind函数——回到文件开头voidrewind(FILE*fp);rewind(fp);// 等价于 fseek(fp, 0, SEEK_SET);4.3 ftell函数——获取当前位置longftell(FILE*fp);返回距离文件开头的字节数#includestdio.hintmain(){FILE*fpfopen(test.txt,w);fprintf(fp,Hello);longposftell(fp);printf(当前位置%ld\n,pos);// 输出5fclose(fp);return0;}4.4 feof函数——检测文件结束intfeof(FILE*fp);#includestdio.hintmain(){FILE*fpfopen(test.txt,r);if(fpNULL)return1;intch;while((chfgetc(fp))!EOF)// 读取直到文件结束{putchar(ch);}fclose(fp);return0;}五、类型转换概述C语言中的类型转换分为两种隐式类型转换和强制类型转换。六、隐式类型转换6.1 隐式类型转换的发生时机隐式类型转换是编译器自动进行的不需要程序员干预赋值运算时算术运算时函数调用时参数传递函数返回值时6.2 隐式类型转换的规则1. 窄类型转宽类型提升短类型转换为长类型shorts10;intis;// short自动转换为int2. 不同类型混合运算inta5;doubleb3.14;doubleresultab;// a自动转换为double转换方向按优先级从低到高char → short → int → long → float → double3. 赋值类型转换赋值时右边的值会自动转换为左边变量的类型inta3.14;// 3.14转换为3 10; // 10转换为10.doubleb0七、强制类型转换7.1 强制类型转换的语法(类型名)表达式7.2 强制类型转换的使用#includestdio.hintmain(){// 强制转换为int截断小数部分inta(int)3.14;printf(a %d\n,a);// 输出a 3// 强制类型转换的优先级高于算术运算doubleb10/3.0;// 输出3.333333doublec(double)10/3;// 输出3.333333doubled10/(double)3;// 输出3.333333// 指针类型转换inti10;int*pii;void*pv(void*)pi;// int * 转换为 void *return0;}7.3 强制类型转换的注意事项数据丢失从宽类型转窄类型时可能丢失数据精度降低浮点数转整数时丢失小数部分指针类型转换需要谨慎使用// 危险示例doubled3.1415926;int*p(int*)d;// 将double的位模式当作int*解释八、类型转换的原则8.1 一句话总原则避免不必要的类型转换特别是在指针操作中。8.2 实际编程建议尽量避免混合类型运算使用相同的类型进行运算强制类型转换要谨慎特别是指针类型注意数据范围避免溢出使用括号明确优先级// 推荐明确类型inta10;intb3;doubleresult(double)a/b;// 明确将a转换为double// 不推荐隐式转换intresulta/b;// 整数除法结果为3九、本章小结本章我们详细介绍了C语言的文件操作与类型转换文件操作部分文件的基本概念FILE类型和文件指针文件的打开与关闭fopen和fclose文件的读写字符、字符串、格式化、二进制读写文件定位fseek、rewind、ftell、feof类型转换部分隐式类型转换编译器自动进行强制类型转换使用(type)语法类型转换的原则谨慎使用避免数据丢失写在最后恭喜你通过这十篇博客的学习已经完成了C语言基础知识的学习。这些内容覆盖了C语言的核心知识点基础概念与环境配置数据类型与常量变量运算符与表达式输入输出函数程序控制结构数组与字符串函数指针结构体与联合文件操作与类型转换学习编程是一个循序渐进的过程建议你多加练习每学完一个知识点要多写代码练习调试程序学会使用调试器解决程序中的问题阅读源码多阅读优秀的C语言代码学习编程技巧解决问题尝试解决实际编程中的问题积累经验祝你在编程之路上越走越远本系列博客内容基于作者C语言学习笔记整理欢迎在评论区交流讨论。

更多文章