首页 > 其他分享 >C语言之文件(下 · 重要)

C语言之文件(下 · 重要)

时间:2023-12-03 10:04:00浏览次数:27  
标签:fp 文件 file1 重要 函数 int C语言 printf

在上一篇文章中,我讲述了有关ASCII文件的读写,那二进制文件的读写又该怎么进行编码呢?

二进制文件的读写

二进制文件保存的是数据在机器内部的映像,将数据在机器内部的映像原式原样的写入文件可以用fwrite函数;将文件中的二进制比特串原式原样写入某个变量可以用函数fread。

fwrite函数

fwrite函数用于写二进制文件,它可以将一个变量或一个数组在内存中的表示原式原样地写到文件中去。

fwrite函数的格式为:

fwrite(buffer,size,count,fp);

其中,buffer是需要写入的变量在内存中的起始地址;size是变量类型占据的字节数;count是写入变量的个数;fp是文件指针。

如果要将整型变量x写入文件,可用如下语句:

fwrite(&x,sizeof(int),1,fp);

如果要将一个10个元素的整型数组a中的所有元素写入文件,可用如下语句:

fwrite(a,sizeof(int),10,fp);

案例:设计一个程序,将整数1~10依次写入一个空的二进制文件file1。

#include<stdio.h>
int main(){
	FILE *fp;
	int i; 
	if((fp=fopen("D:\\file1","wb"))==NULL){
		printf("Can't open the file!'");
		return 1;
	}
	for(i=1;i<=10;i++){
	fwrite(&i,sizeof(int),1,fp);
	}
	fclose(fp);
	return 0;
}

如果直接用文本编辑器打开,则会显示一堆乱码。但通过观察文件的大小,我们发现,file1占据了4×10=40个字节。

C语言之文件(下 · 重要)_数据

fread函数

fread函数用于读二进制文件。它可以从文件中读入一个变量或一组同类的变量在内存中的表示。

fread函数的格式为:

fread(buffer,size,count,fp);

其中,buffer是读入数据中的存放地址;size是变量类型占据的字节数;count是写入变量的个数;fp是文件指针。

案例:从二进制文件file1读入10个整数。

#include<stdio.h>
int main(){
	FILE *fp;
	int i,a; 
	if((fp=fopen("D:\\file1","rb"))==NULL){
		printf("Can't open the file!'");
		return 1;
	}
	for(i=1;i<=10;i++){
	fread(&a,sizeof(int),1,fp);
	printf("%d ",a);
	}
	fclose(fp);
	return 0;
}

C语言之文件(下 · 重要)_#include_02

文件的顺序访问

什么是文件的顺序访问

按文件中的内容顺序进行读写称为顺序访问。

写文件时,把数据按顺序写在一个空文件中或从文件尾开始写;读文件时,从文件的第一个数据开始往后依次读取一定数量的数据或读取文件的全部数据。

案例:读取file1文件中的第5个和第6个整数,并将它们显示在显示器上。

#include<stdio.h>
int main(){
	FILE *fp;
	int i,x; 
	if((fp=fopen("D:\\file1","rb"))==NULL){
		printf("Can't open the file!'");
		return 1;
	}
	for(i=0;i<4;i++){
	fread(&x,sizeof(int),1,fp);
	}
	fread(&x,sizeof(int),1,fp);
	printf("%d ",x);
	fread(&x,sizeof(int),1,fp);
	printf("%d ",x);
	fclose(fp);
	return 0;
}

C语言之文件(下 · 重要)_数据_03

该代码中,当需要读取第k个数时,需要先读前面k-1个整数。如果文件很大,包含了成千上万个整数,读取k个整数将会花费大量的时间,所以更好的解决方案是采用文件的随机访问。

feof函数

大多数情况下,读文件时往往并不知道文件中有多少信息。那么如何知道该调用教程fread()读文件的函数才能保证文件中的数据全部读完呢?

函数名称

判断(是否全部读完)的依据

fgetc()函数读取ASCII文件

读到文件尾时返回值是EOF

fgets()函数读ASCII文件

读到文件尾时返回值是NULL

fscanf()/fread()函数

读到文件尾时会返回NULL

fscanf()/fread()函数(通用的判断方法)

使用feof()函数

案例1:从ASCII文件file中读取所有整数。

#include<stdio.h>
int main(){
	FILE *fp;
	int k; 
	if((fp=fopen("D:\\file","r"))==NULL){
		printf("Can't open the file!'");
		return 1;
	}
	while(1){
		fscanf(fp,"%d",&k);
		if(feof(fp)) break;
		printf("%d\t",k);
	}
	fclose(fp);
	return 0;
}

案例2:从二进制文件file1中读取所有整数。

#include<stdio.h>
int main(){
	FILE *fp;
	int k; 
	if((fp=fopen("D:\\file1","rb"))==NULL){
		printf("Can't open the file!'");
		return 1;
	}
	while(1){
		fread(&k,sizeof(int),1,fp);
		if(feof(fp)) break;
		printf("%d\t",k);
	}
	fclose(fp);
	return 0;
}

运行结果如下:

C语言之文件(下 · 重要)_#include_04

文件的随机访问

随机读写文件中某个位置的数据称为文件的随机访问。

文件定位指针

每个文件指针指向的FILE类型的变量中都保存了一个下一次读写的位置,这个位置称为文件定位指针。既然文件读写的位置是由文件定位指针指定,只要能设置文件定位指针的值,就能实现文件的随机访问。

C语言提供了3个与文件定位指针操作有关的函数,分别是:

  • rewind
  • fseek
  • ftell
rewind函数

rewind函数的作用是将文件定位指针重新返回到文件的开头,即第0个字节。这个函数没有返回值。

案例:从二进制文件file1中读取所有整数显示在显示器上以及写入ASCII文件file2。

#include<stdio.h>
int main(){
	FILE *fp1,*fp2;
	int k; 
	if((fp1=fopen("D:\\file1","rb"))==NULL){
		printf("Can't open the file!'");
		return 1;
	}
	while(1){
		fread(&k,sizeof(int),1,fp1);
		if(feof(fp1)) break;
		printf("%d ",k);
	}
	rewind(fp1);
	if((fp2=fopen("D:\\file2.txt","rb"))==NULL){
		printf("Can't open the file!'");
		return 1;
	}
	while(1){
		fread(&k,sizeof(int),1,fp1);
		if(feof(fp1)) break;
		fprintf(fp2,"%d ",k);
	}
	fclose(fp1);
	fclose(fp2);
	return 0;
}

运行结果:

C语言之文件(下 · 重要)_数据_05

fseek函数

fseek函数用于设置文件定位指针的值,它的格式为:

fseek(fp,n,start);

其中,fp是文件指针;n是文件定位指针移动的字节数;start表示从何处开始移动。start的值如下表所示:

起始点

符号常量

对应的值

文件开始

SEEK_SET

0

文件定位指针当前位置

SEEK_CUR

1

文件末尾

SEEK_END

2

将文件定位指针移到文件头,可用如下语句:

fseek(fp,0,SEEK_SET);

将文件定位指针移到文件尾,可用如下语句:

fseek(fp,0,SEEK_END);

将文件定位指针移到当前位置后面第10个字节,可用如下语句:

fseek(fp,10,SEEK_CUR);

将文件定位指针移到当前位置前面第10个字节,可用如下语句:

fseek(fp,-10,SEEK_CUR);

案例:从二进制文件file1中读取第5、第6整数。

#include<stdio.h>
int main(){
	FILE *fp;
	int x; 
	if((fp=fopen("D:\\file1","rb"))==NULL){
		printf("Can't open the file!'");
		return 1;
	}
	fseek(fp,4 * sizeof(int),SEEK_CUR);
	fread(&x,sizeof(int),1,fp);
	printf("%d\n",x);
	fread(&x,sizeof(int),1,fp);
	printf("%d\n",x);
	
	fclose(fp);
	return 0;
}

C语言之文件(下 · 重要)_C语言_06

ftell函数

ftell函数的作用是获取文件定位指针的值。格式为:

ftell(fp);

案例:读取二进制文件file1的所有数据及位置。

#include<stdio.h>
int main(){
	FILE *fp;
	int k,pos; 
	if((fp=fopen("D:\\file1","rb"))==NULL){
		printf("Can't open the file!'");
		return 1;
	}
	while(1){
		pos = ftell(fp);
		fread(&k,sizeof(int),1,fp);
		if(feof(fp)) break;
		printf("%d %d\n",pos,k);
	}
	
	fclose(fp);
	return 0;
}

执行程序,运行结果如下:

C语言之文件(下 · 重要)_C语言_07

整型数在文件中占了四个字节的空间。

2023年过去的11个月中,你过得怎样?对过往,别纠缠;对未来,别焦虑;对感情,别辜负。愿你的2023,不负所寄,不留遗憾。

标签:fp,文件,file1,重要,函数,int,C语言,printf
From: https://blog.51cto.com/u_16174658/8664244

相关文章

  • C语言-运算符和分支循环语句
    extern: 表示声明。没有内存空间。不能提升。const: 限定一个变量为只读变量。volatile: 防止编译器优化代码。 volatileintflg=0;register: 定义一个寄存器变量。没有内存地址。 registerinta=10; 字符串: C语言中,用双引号引着的一串字符,称之为字符串。一定有一个......
  • Linux中文件权限和所有权
    在Linux中,设计与文件和目录相关联的权限的目的是防止用户访问其他用户的私有文件以及保护重要的系统文件。针对每个文件的权限所分配的九位(权限位)定义了你和其他用户对你文件的访问权。普通文件的权限通常为-rwxrwxrwx。对于不同的项目,前面的“-”是不同的,有可能看到d(针对目录)、l......
  • 表达式-C语言-2023/12/2
    首先介绍表达式:......
  • C语言【交换两变量值】
    C语言【交换两变量值】//1、临时变量intx=10,y=20;inttemp=x;x=y;y=temp;//2、相加再减的方法inta=10,b=20;a=a+b;b=a-b;a=a-b;//3、异或的方法,利用A^A=0,A^0=A的特性inti=10,j=20;i^=j;j^=i;i^=j;注意:如果存在两个指针......
  • SAP UI5 开发项目 package.json 文件里的 @sap/ux-specification 依赖
    如下图所示:在SAPUI5中,@sap/ux-specification是一个由SAP提供的库,旨在帮助开发人员实现符合SAPFiori设计准则的用户界面(UI)。该库提供了一系列工具、资源和指南,以确保UI5应用程序的设计和实现符合SAPFiori标准,从而提供一致、易用且美观的用户体验。@sap/ux-specification主......
  • 循环,字符串,基础文件操作的用法
    Task06:循环Loopand字符串string循环Loopfor循环defsumFromMToN(m,n):total=0#注意:range(x,y)是左闭右开区间,包含x,不包含yforxinrange(m,n+1):total+=xreturntotarange(m,n)左开右闭从m遍历到n-1sumFromMToN(5,10)45r......
  • 学习C语言必备的基础知识详解
    (⽬录)前言学习C语言的第一步,肯定是要先去学习了解一下相关的概念和符号,我们写的代码就是由一堆规定好的有特殊含义的符号组成的。1、数据类型C语言的数据类型细分出来会有很多种,每种数据类型占内存大小都不同,对于刚接触编程语言的人来说,确实很让人头疼。其实存在这么多的类型,......
  • ABAP Draft handling 在 SAP 现代 Fiori 应用中的重要作用
    在SAPABAP开发中,"Drafthandling"(草稿处理)是指一种处理业务对象的机制,使用户能够在事务过程中保存未提交的更改,以便随时回到之前的状态或者在适当的时候提交更改。这个机制的实现允许用户在长时间的事务中保存中间状态,而不必担心数据的不一致性或者丢失。"Drafthandling"的核......
  • c语言作业_1
    作业标题(649)从大到小输出作业内容写代码将三个整数数按从大到小输出。例如:输入:231输出:321#include<stdio.h>intmain(){inta=2;intb=3;intc=1;scanf("%d%d%d",&a,&b,&c);//从大到小输出3个整数abcif(a<b){inttm......
  • c语言作业_2
    作业标题(659)分数求和作业内容计算1/1-1/2+1/3-1/4+1/5……+1/99-1/100的值,打印出结果#include<stdio.h>intmain(){ inti=0; doublesum=0.0; intflag=1; for(i=1;i<=100;i++) { sum+=flag*1.0/i; flag=-flag; } printf("%lf\n",sum);......