文件操作--文件的随机读写、标准输入输出重定向

news2024/12/28 19:10:12

目录

一、文件的随机读写

二、便准输入输出重定向


一、文件的随机读写

        前面的例程执行的都是顺序文件处理(Sequential File Processing)。在顺序文件处理过程中,数据项是一个接着一个进行读取或者写入的。例如,如果想读取文件中的第5个数据项,那么使用顺序存取方法必须先读取前4个数据项才能读取第5个数据项。不同于顺序读写的是,文件的随机访问(Random Access)允许在文件中的随机定位,并在文件的任何位置直接读写数据。

        为了实现文件的定位,在每一个打开的文件中,都有一个文件位置指针(File Location Pointer),也称文件位置标记,用来指向当前读写文件的位置,它保存了文件中的位置信息。当对文件进行顺序读写时,每读完一个字节后,该位置指针自动移到下一个字节的位置。当需要随机读写文件数据时,则需要强制移动文件位置指针指向特定的位置。那么如何定位文件的位置指针呢?C语言提供了如下两个函数来定文件位置指针。

        int fseek(FILE *fp , long offset, int fromwhere);

        void rewind(FILE *fp); 

其中,函数fseek()的功能是将fp的文件位置指针从fromwhere开始移动offset个字节,指示下一个要读取的数据的位置。

        offset是一个偏移量,它告诉文件位置指针要跳过多少个字节。offset为正时,向后移动,为负时,向前移动。ANSI C要求位移量offset是长整型数据(常量数据后要加L)。这样当文件的长度大于64kb是不至于出问题。

        fromwhere用于确定偏移量计算的起始位置,它的可能取值有3中:

1、SEEK_SET或0,代表文件开始处;

2、SEEK_CUR或1,代表文件当前位置;

3、SEEK_END或2,代表文件结尾处。

        通过指定fromwhere和offset的值,可使位置指针移动到文件的任意位置,从而实现文件的随机读取。如果函数fseek()调用成功,则返回0值,否则返回非0值。

        函数rewind()的功能是将文件位置指针指向文件首字节,即重置位置指针到文件首部。

        C语言还提供了一个用来读取当前文件位置指针的函数,其函数原型为:

        long ftell (FILE *fp);

        若函数调用成功,则返回文件的当前读写位置,否则返回-1L。函数ftell()用相对于文件起始位置的字节偏移量来表示返回的当前文件位置指针。

注意:缓冲区为文件传输读写提高了速度,但是也有一些副作用。

例如,在缓冲区内容还未写入磁盘时,计算机突然死机或掉电,数据就会丢失,永远也找不回来。再如,缓冲区被写入无用的数据时,如果不清除,其后的文件读操作都首先会读取那些无用的数据。那么如何解决这个问题呢?

        为了解决这个问题,C语言提供了如下的函数:

        int  fflush (FILE *fp);

fflush()的功能是无条件地把缓冲区中地所有数据写入物理设备。这样,程序员可自己决定再何时清除缓冲区中的数据,以确保输出缓冲区中地内容写入文件。

例题:编程从文件student.txt中随机读取第k条记录地数据并显示到屏幕上,k由用户从键盘输入。

#include <stdio.h>
#include <stdlib.h>
typedef struct date
{
	int year;
	int month;
	int day;
}DATE;
typedef struct student
{
	long studentid;
	char studentname[10];
	char studentsex;
	DATE birthday;
	int score[4];
	float aver;
}STUDENT;
void searchinfile(char filename[],long k);
int main(void)
{
	long k;
	printf("Input the searching record number:");
	scanf("%ld",&k);
	searchinfile("student.txt",k);
	return 0;
 } 

void searchinfile(char filename[],long k)
{
	FILE *fp;
	int j;
	STUDENT stu;
	if((fp = fopen(filename,"r"))==NULL)
	{
		printf("Failure to open %s!\n",filename);
		exit(0);
	}
	fseek(fp,(k-1)*sizeof(STUDENT),SEEK_SET);
	fread(&stu,sizeof(STUDENT),1,fp);
	printf("%10ld%8s%3c%6d/%02d/%02d",stu.studentid,stu.studentname,stu.studentsex,stu.birthday.year,stu.birthday.month,stu.birthday.day);
	for(j=0;j<4;j++)
	{
		printf("%4d",stu.score[j]);
	 } 
	printf("%6.lf\n",stu.aver);
	fclose(fp);
}

 

         程序第28~49行定义的函数searchinfile()的功能是从文件filename中查找并显示第k条记录的数据,函数serchinfile()的第1个形参filename是字符数组,用于存放需要读取的文件名,程序第24行将文件名字符串“student.txt”作为实参传递给形参filename,函数searchinfile()的第2个形参k是长整型变量,表示要读取的记录号,为了在文件中直接读取第k条记录,程序第38行用函数fseek()将文件位置指针从文件开头向后移动(k-1)*sizeof(STUDENT)个字节。

        关于偏移量,这里之所以这样计算偏移量,是因为fseek()的第2个参数要给出文件位置指针所需跳过的字节数,二每条记录的长度是sizeof(STUDENT)个字节。

        同理,因函数ftell()返回的文件位置使用字节偏移量表示的,所以必须通过除以sizeof(STUDENT)才能换算成当前的记录号,例如,若在本例题中:

        printf ("record number = %d\n",ftell(fp)/sizeof(STUDENT)+1);

 

        这说明在执行第38行语句后文件位置指针指向了第2条记录,而用函数fread()读取一条记录数据后,文件位置指针又指向了吓一条记录,即第3条记录。 

二、便准输入输出重定向

        前面程序对数据的输入/输出是通过终端设备来完成的,看似与文件毫无瓜葛,但实际上,对于终端设备,系统自动会打开3个标准文件:标准输入、标准输出和标准错误输出。

相应的,系统定义了3个特别的文件指针常数:stdin、stdout、stderr,分别指向便准输入、输出和错误文件,这3个文件都以标准终端设备作为输入/输出对象。在默认情况下,标准输入设备是键盘,输出设备是屏幕。

1.fprintf是printf的文件操作版,二者的差别就在于fprintf多一个FILE *类型的参数fp。

2.fputc和putchar差别跟fprintf和printf的差别差不多。

例如:

putchar(c);    fputc(c,stdout);

3.getchar();  ==  fgetc(stdin);

4.puts(str);   ==  fputs(str,stdout);

5.fgets()比gets()多一个参数size。

char *fgets(char *s,int size,FILE *stream);

char *gets(char *s);

例如:

gets(buffer);

fgets(buffer, sizeof(buffer),stdin);

        虽然系统隐含的标准I/O文件是指终端设备,但其实标准输入和标准输出是可以重新定向的,操作系统可以重定向它们到其他文件或具有文件属性的设备,只有标准错误输出不能重定向。(简单描述:没有显示器屏幕,重定向后可以通过打印机输出)

这里,用“<”表示输入重定向,用“>”表示输出重定向。

例如:假设exefile是可执行程序的文件名,指向该程序时,需要输入数据,现在如果要求从文件file.in中读取数据,而非键盘输入,那么DOS命令提示符下,只要键入如下命令即可:

C:\exefile.exe<file.in

于是,exefile的便准输入就被重定向到了file.in,此时程序exefile只会专心致志地从文件file.in中读数据,而不再理会你此后按下的任何一个按键。

freopen()可用于指定模式将输入或输出重定向到另一个文件。

常见地使用方式:

freopen("D:\\in.txt","r",stdin);//将输入流定位到in.txt

freopen("CON","r",stdin); //将输入流还原到键盘

freopen("D:\\out.txt","w",stdout);//将输出流定位到out.txt

freopen("CON","w",stdout);//将输出流还原到屏幕 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/747199.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HarmonyOS学习路之开发篇—流转(多端协同 一)

多端协同开发 场景介绍 开发者在应用FA中通过调用流转任务管理服务、分布式任务调度的接口&#xff0c;实现多端协同。 主要流程如下&#xff1a; 设备A上的应用FA向流转任务管理服务注册一个流转回调。 Alt1-系统推荐流转&#xff1a;系统感知周边有可用设备后&#xff0c;主…

Leangoo领歌敏捷管理工具标签升级,企业级标签组上线

在Leangoo领歌敏捷工具中&#xff0c;标签通常用作对任务的分类&#xff0c;或任务的优先级区分等。这次我们发布了大家期待已久的“企业级标签组”功能&#xff0c;标签可以统一管理啦&#xff5e; 之前&#xff0c;Leangoo领歌的标签功能只限于单个看板使用&#xff0c;需要…

视频孪生赋能智慧交通综合管理系统的数智化升级

交通是重大民生工程,涉及公共安全和人民群众切身利益,必须树牢安全发展理念,强化企业主体责任落实。根据国家标准《城市轨道交通公共安全防范系统工程技术规范》中要求&#xff1a; 未来的智慧交通系统要建立在安防集成平台的应用上&#xff0c;对各类重要部位进行视频图像与三…

CUDA编程实战(使用Sobel算子对rgb图片进行边缘检测)

写在前面&#xff0c;本篇文章为一个CUDA实例&#xff0c;使用GPU并行计算对程序进行加速。如果不需要看环境如何配置&#xff0c;可以直接到看代码部分:点击直达 关于如何更改代码和理解代码写在这个地方:点击直达 运行环境&#xff1a; 系统:windows10专业版 显卡:NVIDIA …

sharding-jdbc分库连接数优化 | 京东物流技术团队

一.背景: 配运平台组的快递订单履约中心(cp-eofc)及物流平台履约中心(jdl-uep-ofc)系统都使用了ShardingSphere生态的sharding-jdbc作为分库分表中间件, 整个集群采用只分库不分表的设计,共16个MYSQL实例,每个实例有32个库,集群共512个库. 当每增加一台客户端主机,一个MYSQl实…

AE/PR/OFX插件-Mocha Pro 2023 v10.0.2 Win 专业平面/三维跟踪摄像机反求插件

插件简介 Mocha Pro是用于VFX视觉特效和后期制作强大的平面跟踪工具&#xff0c;这里提供的是AE和PR的插件版。具有GPU加速的跟踪和对象去除功能&#xff0c;具有边缘捕捉功能的高级遮罩&#xff0c;稳定功能&#xff0c;镜头校准&#xff0c;3D摄像头求解器&#xff0c;立体3…

Win32 汇编在对话框上画线

参阅前文&#xff0c;首先要有一个基本的对话框&#xff1b; 把对话框资源文件里的控件定义都删除&#xff0c;得到的一个rc文件&#xff0c;test.rc&#xff1b; #include <resource.h>#define DLG_MAIN 1DLG_MAIN DIALOG 193, 180, 130, 150 STYLE DS_MODALFRAME | …

在win32 asm中了解intel浮点运算

看老罗的书中有如下一段&#xff0c; ...... fild dwRadius fild _dwDegree fldpi fmul ;角度*Pi fild dwPara180 fdivp st(1),st ;角度*Pi/180 fsin ;Sin(角度*Pi/180) fild …

038、TiDB特性_聚簇索引和非聚簇索引

聚簇表 表中的行数据才能出顺序与主键存储的顺序一致表的主键即为KV映射中Key的一部分通过主键访问行记录时&#xff0c;可以直接获取行记录 create table t( a biging primary key clustered ,b varchar(255)); # a列为主键列&#xff0c;聚簇列聚簇表&#xff08;且ID为主键…

TortoiseGit 入门指南05:推送和拉取

本节所讲内容均涉及到 远端版本库。 版本库 的概念在《TortoiseGit 入门指南02&#xff1a;创建和克隆仓库》中提到过&#xff0c;它是工作目录下面的一个名为 .git 的隐藏目录&#xff0c;我们每一次提交、每一个分支都会保存在版本库中。这个版本库就在我们电脑上的某个文件…

windows开机启动nginx(服务方式启动)

提示&#xff1a;本文章介绍如何借助Windows Service Wrapper小工具&#xff0c;将Nginx转换为Windows服务&#xff0c;在服务中心配置自启动&#xff0c;从而在开机时windows自行启动Nginx服务 Nginx是什么 官方链接&#xff1a;nginx下载 Nginx 是一个高性能的HTTP和反向代理…

Kotlin基础(五):类和接口

前言 本文主要讲解类和接口&#xff0c;主要包括类的声明、构造器、类成员、修饰符、类的继承、接口、抽象类。 Kotlin文章列表 Kotlin文章列表: 点击此处跳转查看 目录 1.1 类的声明 在 Kotlin 中&#xff0c;类的声明使用关键字 class。下面是一个简单的类声明的示例&…

感受C++模版的所带来的魅力

一、泛型编程思想 首先我们来看一下下面这三个函数&#xff0c;如果学习过了 C函数重载 和 C引用 的话&#xff0c;就可以知道下面这三个函数是可以共存的&#xff0c;而且传值会很方便 void Swap(int& left, int& right) {int temp left;left right;right temp; }…

三、Exsi安装虚拟机win10系统

Exsi安装虚拟机win10系统 1、新建虚拟机2、选择存储(直接下一步)3、自定义设置3.1 设置cpu3.2 设置内存3.3 设置硬盘3.4 设置网卡3.5 设置驱动3.6 设置BIOS 4、完成安装 1、新建虚拟机 2、选择存储(直接下一步) 3、自定义设置 3.1 设置cpu 3.2 设置内存 3.3 设置硬盘 3.4 设置…

python搭建文件服务

python -m http.server 访问8000端口&#xff0c;可分享或下载命令启动文件夹下文件。

美国访问学者的申请条件

作为一个富有学术活力和创新精神的国家&#xff0c;美国吸引着世界各地的学者前往交流和研究。对于希望成为美国访问学者的人来说&#xff0c;了解申请条件是至关重要的。下面知识人网小编将介绍一些常见的美国访问学者申请条件。 1. 学术背景与研究计划&#xff1a;作为申请者…

安全测试方法介绍(上)静态源代码审查

软件开发完成之后&#xff0c;我们需要进行安全验证&#xff0c;验证我们的软件是不是符合安全要求。软件安全测试主要有以下几个方面&#xff1a;确定软件的安全特性实现是否与预期设计一致的过程&#xff1b;有关验证软件安全等级和识别潜在安全缺陷的过程&#xff1b;查找软…

采集发布到WordPress网址(OneNav主题-WordPress主题)

WordPress系统的一导航主题&#xff08;OneNav主题&#xff09;是集网址、资源、资讯于一体的导航主题。 要将采集的数据批量自动发布到一导航主题&#xff08;OneNav主题&#xff09;的网址要怎么设置&#xff1f; 普通的文章采集器一般只能发布为wordpress文章类型&#xff…

echarts折线图横向渐变填充

这种情况&#xff0c;需要后端去计算&#xff0c;如何把不同分段的值赋予不同的颜色&#xff0c;然后组合成下面我们需要的格式就可以实现 drawLine1() {if (document.getElementById(s1) ! null) {var that thislet heightNum (this.porosityList.maxDepth-this.porosityLis…

网络安全—综合渗透实验

一、 实验名称 综合实验 二、 实验目的 【实验描述】 随着互联网的普及和快速发展&#xff0c;互联网产品多样化、迭代快的特点为一些企业赢得了机会&#xff0c;同样也给企业带来了众多安全问题。如网络安全、系统安全、web安全、数据安全等。 本实验模拟企业复杂网络、复…