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

C语言文件操作总结

目录

字符方式读入文件

数据块方式读写文件

文件定位与随机读写

文件中数据的修改


字符方式读入文件

1.向文件中写入(输入字符)

        用 fputc 函数或 puts 函数可以把一个字符写到磁盘文件中去。

int fputc(int ch,FILE * fp)

        ch 是要输出的字符,他可以是一个字符常量,也可以是一个字符变量;fp是文件指针变量,已经指向了一个由fopen函数打开的文件。

        功能:fputc(ch,fp)函数将字符输入到fp所指向的流式文件中去。如果输出成功,返回值就是输入的字符,失败则返回EOF。

从键盘输入遗传字符,以回车符\n结束,然后输入到磁盘文件中去

#include<stdio.h>
#include<stdlib.h>
int main()	
{//从键盘输入遗传字符,以回车符\n结束,然后输入到磁盘文件中去FILE * fp;char ch;if((fp=fopen("output1.txt","w"))==NULL){printf("无法创建文件!");exit(0); }while((ch=getchar())!='\n'){fputc(ch,fp);}fclose(fp);return 0;
}

2.从文件中读出一个字符

        用 fgetc 函数或者 getc 函数可以从磁盘中读出一个字符。

int fgetc(FILE * fp)

        从磁盘文键逐个读入字符,并在终端输出

#include<stdio.h>
#include<stdlib.h>
int main()
{//从磁盘文键逐个读入字符,并在终端输出FILE * fp;char ch;if((fp=fopen("output1.txt","r"))==NULL){printf("无法打开文件!\n");exit(0);	} while((ch=fgetc(fp))!=EOF){putchar(ch);}fclose(fp);return 0;
}

3.向文件中写入一个字符串

        用 fputs 函数可以把一个字符串输入到指定的流式文件中,其原型为

int fputs(char * fp,FILE * stream)

        其中,string为字符串,stream为文件指针。

 把指针string所指向的字符串输出到文件指针stream所指向的文件中,但字符串结束符‘\0’不输出

 从键盘输入若干行字符,把他们输出到磁盘文件中保存起来。

#include<stdio.h>
#include<stdlib.h>
int main()
{//从键盘输入若干行字符,把他们输出到磁盘文件中保存起来。FILE * fp;char string[81];if((fp=fopen("data.txt","w"))==NULL){printf("未找到此文件!");exit(0);	} while(gets(string)!=NULL)//ctrl+Z结束 {fputs(string,fp);fputc('\n',fp);//在每个字符串后加一个换行符 }fclose(fp);return 0;
}

数据块方式读写文件

使用数据块的方式对二进制问价进行读写操作,涉及的函数有两个:fread() 和 fwrite() 。

建立学生档案文件,每个记录包括学生的姓名,性别,年龄和入学总分 

#include<stdio.h>
#include<stdlib.h>
struct student
{char name[10];char sex;int age;float score;
};
int main()
{FILE * fp;struct student stud;char str[80],ch='y';if((fp=fopen("stud2.rec","wb"))==NULL)//二进制只写方式打开 {printf("无法打开文件!\n");exit(0);}while(ch=='y'||ch=='Y'){printf("输入姓名:");gets(stud.name);printf("输入性别:");gets(str);stud.sex=str[0];printf("输入年龄:");gets(str);stud.age=atoi(str);//年龄:将字符串转换为整型 printf("输入分数:");gets(str);stud.score=atof(str);//分数:将字符串转换为浮点型fwrite(&stud,sizeof(stud),1,fp);//写入数据到文件do{printf("继续输入:(y/n)?  ");gets(str);ch=str[0];} while(!(ch=='y'||ch=='n'||ch=='Y'||ch=='N'));}fclose(fp);return 0;
}

从磁盘文件按记录读取数据,并显示读入的内容,直到文件尾

#include<stdio.h>
#include<stdlib.h>
struct student
{char name[10];char sex;//'M',或'F' int age;float score;
};
int main()
{//从磁盘文件按记录读取数据,并显示读入的内容,直到文件尾struct student stud;FILE * fp;if((fp=fopen("stud2.rec","rb"))==NULL)	{printf("无法打开文件stud2.rec!\n");exit(0); }while(fread(&stud,sizeof(stud),1,fp)==1){printf("\n姓名:%s",stud.name);printf("\n性别:%c",stud.sex);printf("\n年龄:%d",stud.age);printf("\n分数:%.2f",stud.score);} printf("\n");fclose(fp);return 0;
}

文件定位与随机读写

文件的定位:利用fesk()和ftell()函数编写程序测量一个文件的长度 

#include<stdio.h>
#include<stdlib.h> 
//文件的定位
//利用fesk()和ftell()函数编写程序测量一个文件的长度 
long filesize(FILE * fp)
{long curpos,length;//当前文件读写位置指针相当于文件开头的位移量 curpos=ftell(fp);//保存文件的当前读写位置指针 fseek(fp,0L,SEEK_END);//文件读写位置指针置于文件尾端length=ftell(fp);//求文件长度fseek(fp,curpos,SEEK_SET);//恢复文件的原读写位置的指针return length; 
}
long filesize(FILE * stream);
int main()
{FILE * stream;char filename[10];printf("\n输入文件名:");scanf("%s",filename);if((stream=fopen(filename,"rb"))==NULL){printf("无法打开文件:%s\n",filename);exit(0);}printf("%s的文件大小是%ld(byte)\n",filename,filesize(stream));fclose(stream);return 0;
}

随机读写: 

由之前建立的学生入学档案的磁盘文件stud.rec中,假设学生按照分数升序排列。
现要求设计一个程序,输入一个整型值给n,输出分数最高的n个学生记录,即排在尾部的n个学生记录 

#include<stdio.h>
#include<stdlib.h>
struct student
{char name[10];char sex;//'M',或'F' int age;float score;
};
//由之前建立的学生入学档案的磁盘文件stud.rec中,假设学生按照分数升序排列。
//现要求设计一个程序,输入一个整型值给n,输出分数最高的n个学生记录,即排在尾部的n个学生记录 
int main()
{FILE * fp;struct student stud;int n;if((fp=fopen("stud.rec","rb"))==NULL){printf("无法打开文件");exit(0);	} printf("\n请输入一个整数:");scanf("%d",&n);fseek(fp,-n*sizeof(stud),SEEK_END); //定位到倒数第n个学生记录while(fread(&stud,sizeof(stud),1,fp)==1){printf("\n姓名:%s",stud.name);printf("\n性别:%c",stud.sex);printf("\n年龄:%d",stud.age);printf("\n分数:%.2f",stud.score);	} return 0;
}

文件中数据的修改

将之前的成绩表中的女生成绩加五分

#include<stdio.h>
#include<stdlib.h>
struct student
{char name[10];char sex;//'M',或'F' int age;float score;
};
int main()
{//从磁盘文件按记录读取数据,并显示读入的内容,直到文件尾struct student stud;FILE * fp;if((fp=fopen("stud.rec","rb"))==NULL)	{printf("无法打开文件stud2.rec!\n");exit(0); }while(fread(&stud,sizeof(stud),1,fp)==1){printf("\n姓名:%s",stud.name);printf("\n性别:%c",stud.sex);printf("\n年龄:%d",stud.age);printf("\n分数:%.2f",stud.score);} printf("\n");fclose(fp);return 0;
}

输入一个学生的姓名,编写程序将stud.rec中该学生的记录删除 

#include<stdio.h>
#include<stdlib.h>
#include<string.h> 
struct student
{char name[10];char sex;//'M',或'F' int age;float score;
};
//输入一个学生的姓名,编写程序将stud.rec中该学生的记录删除 
int main()
{char name[10];FILE * fp_old,* fp_new;struct student stud;if((fp_old=fopen("stud.rec","rb"))==0)//读方式打开原数据文件 {printf("\n不能打开文件");exit(0); }if((fp_new=fopen("stud3.rec","wb"))==0)//写方式创建新数据文件 {printf("\n不能创建文件");exit(0); } printf("请输入要删除的学生姓名:");gets(name);while(fread(&stud,sizeof(stud),1,fp_old)==1){//在原文件中读取一个学生记录在stud中if(strcmp(stud.name,name)!=0){fwrite(&stud,sizeof(stud),1,fp_new);	} } fclose(fp_old);fclose(fp_new);remove("stud.rec");//删除原文件rename("stud3.rec","stud.rec"); //将新文件重命名 return 0;
}

向文件中插入数据

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct student
{char name[10];char sex;//'M',或'F' int age;float score;
};
int main()
{FILE * fp;struct student x,t={"Alex",'f',20,566};if((fp=fopen("stud.rec","a+b"))==0){printf("\n\t无法打开文件!\n");exit(0);}fread(&x,sizeof(struct student),1,fp);//从文件中读一条学生记录fseek(fp,0L,SEEK_END); fwrite(&t,sizeof(struct student),1,fp);//将t中的数据追加到文件尾rewind(fp);while(fread(&x,sizeof(struct student),1,fp)==1){printf("\n%15s%4c%8d%8.2f",x.name,x.sex,x.age,x.score);	} fclose(fp);return 0;
}

http://www.lryc.cn/news/158199.html

相关文章:

  • 原生js之dom如何进行事件监听(事件捕获/冒泡)
  • 使用SimPowerSystems并网光伏阵列研究(Simulink实现)
  • BUUCTF-WEB-[ACTF2020 新生赛]Includel
  • 算法通关村十四关:白银挑战-堆能高效解决的经典问题
  • 跨站请求伪造(CSRF)攻击与防御原理
  • 从0到1实现播放控制器
  • 【Vue-Element-Admin】导出el-table全部数据
  • MFC 更改控件的大小和位置
  • 【向量数据库】相似向量检索Faiss数据库的安装及余弦相似度计算(C++)
  • 教育培训小程序的设计与功能解析
  • 【ES】illegal_argument_exception“,“reason“:“Result window is too large
  • SpringBoot实现登录拦截
  • 浅谈泛在电力物联网、能源互联网与虚拟电厂
  • 深度学习框架安装与配置指南:PyTorch和TensorFlow详细教程
  • vue中属性执行顺序
  • 【代码随想录】Day 50 动态规划11 (买卖股票Ⅲ、Ⅳ)
  • PHP反序列化漏洞
  • 容器编排学习(一)k8s集群管理
  • js去除字符串空格的几种方式
  • Spring 自带工具——URI 工具UriComponentsBuilder
  • 优化案例5:视图目标列改写优化
  • Origin绘制彩色光谱图
  • 项目复盘:从实践中学习
  • 机器学习和数据挖掘02-Gaussian Naive Bayes
  • 【面试题精讲】Java Stream排序的实现方式
  • 浅谈Spring
  • Java 复习笔记 - 面向对象进阶篇
  • 微信小程序中识别html标签的方法
  • 02_常见网络层协议的头结构
  • ChatGLM学习