C语言文件操作总结

2023-11-05

目录

字符方式读入文件

数据块方式读写文件

文件定位与随机读写

文件中数据的修改


字符方式读入文件

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;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言文件操作总结 的相关文章

随机推荐

  • 解决Xampp中mysql无法启动的问题

    很突然的Xampp的mysql就打不开 很疑惑 之前一直可以打开的 然后刚才我启动了一下 就突然启动不了了 我想了一下 并没有出现端口号占用问题呀 而且报错也没有说端口号占用 报错写的很是通俗 然后我查看了日志文件 发现日志文件中也没有描述
  • 【无标题】chatgpt桌面化,桌面应用的安装

    前言 关于chatgpt最近来说可算是大火 不过在我使用过程中发现没事都要上openai的官网过于麻烦 而且卡顿 于是乎就在网上寻找一些方法 发现chatgpt可以桌面化 话不多说 直接上图 1 上github找这位大佬 2 主页往下番找到
  • 测试中BUG定义、测试BUG的等级划分、Bug流程以及Bug解决优先级

    一个优秀的软件测试师不仅仅能够发现软件中的bug 还能分析出bug产生的原因 总结了一些软件测试入门必须要了解和学习的BUG基础知识 主要包括BUG定义 测试BUG的等级划分 Bug流程以及Bug解决优先级等内容 下面一起来梳理一遍这些基础
  • ISE报错NgdBuild:604解决方法

    ISE报错NgdBuild 604解决方法 在使用ISE编写FPGA代码时 从其他地方导入 v文件 运行时会报图片中的错误 解决方法 在单纯的复制黏贴 v文件并且导入到 ISE 的同时 把 ngc文件拷贝过来 如下图所示 Rerun后即可解
  • python fastapi 向页面推送视频流,网站播放python获取的rtsp视频

    代码如下 import cv2 import uvicorn from fastapi import FastAPI Response from fastapi responses import StreamingResponse 创建一个
  • ubuntu安装软件一直0%

    ubuntu安装软件一直0 下载不了东西 更新版本库也不行 可能和dns解析错误有关系 可以修改 etc resolv conf文件 我填写的是北京联通的 请自行查阅自己的 nameserver 127 0 0 53 nameserver
  • 基于SpringBoot的CSGO赛事管理系统

    末尾获取源码 开发语言 Java Java开发工具 JDK1 8 后端框架 SpringBoot 前端 采用Vue技术开发 数据库 MySQL5 7和Navicat管理工具结合 服务器 Tomcat8 5 开发软件 IDEA Eclipse
  • win11安装gcc,g++,配置c++的编译环境

    MinGW Minimalist GNU for Windows download SourceForge net 下载并安装MinGW 可以直接鼠标点击操作 简单的很 选定gcc g 为待安装环境 然后开始安装就可以了 环境变量 右键计算
  • Java笔记-I/O流之比较器接口对象数组排序

    对象数组排序 内容介绍 1 对象数组直接调用sort 方法报错的原因 是因为没有定义比较的规则 需要自己定义 2 如何定义规则 看报错信息 ClassCastException demoCompare Person cannot be ca
  • 算法复杂度

    时间复杂度和空间复杂度 N 1个操作 O n O n O n O n N 2 1个操作 1 2 O n O n 2个单位的内存空间 O 1 常数的时间复杂度 两层循环O n 2 归并排序 T n 2 T n 2 n O n log n Ma
  • 10讲学会C语言之第四讲:循环结构

    文章目录 前言 一 求pi的近似值 二 统计整数的位数 三 判断素数 四 求阶乘和 五 循环结构编程 六 作业 前言 大家好 我是卷卷 本节课讲循环结构 for while和do while 主要包括六个部分 求pi的近似值 统计整数的位数
  • 1658 页的《Java 面试突击核心讲》在牛客网火了,完整版 PDF 开放下载!

    前言 我们都知道 在程序员的职业生涯中 有多个发展方向 不过就数据表明 近年来选择架构师方向的开发人员也越来越多 对于架构师的发展前途 我相信是已经没有争议的 但这个 概念 对于很多开发人员来说 并没有太清晰的认识 怎样才能成为架构师 是很
  • IDEA安装使用 VisualVM 及VisualVM 远程监视

    1 VisualVM是什么 按照VisualVM官网 http visualvm github io 上的介绍 VisualVM是一个集成命令行JDK工具和轻量级分析功能的可视化工具 专为开发和生产时间使用而设计 我们在jdk安装包中也可以
  • nmon的安装与使用

    author skate time 2011 08 06 nmon的安装与使用 1 下载 nmon http nmon sourceforge net pmwiki php n Site Download nmonanalyser http
  • Spring之循环依赖底层源码解析

    目录 一 循环依赖 二 解决循环依赖的思路 1 举例 AServiec依赖BService BService依赖AService 2 循环依赖的打破 三 三级缓存解析 1 三级缓存的通常叫法 2 三级缓存详情 一 循环依赖 1 循环依赖 很
  • ArcGIS Server 10.1 装配记录

    ArcGIS Server 10 1 安装记录 拿到了ArcGIS Server 10 1 的安装包 今天有时间上手安装试着用一下 记录过程如下 1 基础环境 在虚拟机下安装的 使用的是win2008 Server r2sp1系统 由于10
  • Verilog实现无源蜂鸣器发声

    要求 顺序循环发声 Do Re Mi Fa 时间间隔为0 5s 若输入为262Hz的方波 则蜂鸣器发Do的声音 以此类推 那如何向蜂鸣器输入262Hz的方波 假设系统时钟周期为50MHz 50MHz对应的一个周期为20ns 若占空比为50
  • CSS高级技巧

    声明 本人的所有博客皆为个人笔记 作为个人知识索引使用 因此在叙述上存在逻辑不通顺 跨度大等问题 希望理解 分享出来仅供大家学习翻阅 若有错误希望指出 感谢 CSS高级技巧 元素的显示与隐藏 类似网站广告 当我们点击关闭就不见了 但是我们重
  • 区块链平台架构分析

    区块链平台架构分析 数据层 网络层 账本层 共识层 合约层 应用层 一般说来 一个标准的区块链项目应该由数据层 网络层 共识层 激励层 合约层和应用层组成 每一层的具体介绍如下 数据层 数据层是区块链最底层的技术 主要的功能为数据存储 账户
  • C语言文件操作总结

    目录 字符方式读入文件 数据块方式读写文件 文件定位与随机读写 文件中数据的修改 字符方式读入文件 1 向文件中写入 输入字符 用 fputc 函数或 puts 函数可以把一个字符写到磁盘文件中去 int fputc int ch FILE