首页 > 其他分享 >C语言文件操作

C语言文件操作

时间:2025-01-12 14:30:51浏览次数:3  
标签:文件 NULL return C语言 pf FILE 操作 fopen

本文重点:

什么是文件

文件名

文件类型

文件缓冲区

文件指针

文件的打开和关闭

文件的顺序读写

文件的随机读写

文件结束的判定

什么是文件

磁盘上的文件是文件。

但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件

程序文件

包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀 为.exe)。

数据文件

文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内 容的文件。

本章讨论的是数据文件。

在以前各章所处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显示器上。 其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上 文件。

文件名

一个文件要有一个唯一的文件标识,以便用户识别和引用。 文件名包含3部分:文件路径+文件名主干+文件后缀 例如: c:\code\test.txt 为了方便起见,文件标识常被称为文件名。

文件类型

根据数据的组织形式,数据文件被称为文本文件或者二进制文件。 

数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。

如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。

以ASCII字符的形式存储的文件就是文本文件。 一个数据在内存中是怎么存储的呢?

字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。 如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而二进制形式输 出,则在磁盘上只占4个字节(VS2013测试)。

 db319423baff45379d33cdb9781b0434.png

dbb16e1afeac4a2e98f9c6c4fe1c9946.png

e935dc4ee8064a188b3966c494b53b7d.png

f5d52156bc7541e892cb5347103051e8.png

不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。 每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关 心细节。 一般都是通过一个FILE 的指针来维护这个 FILE 结构的变量,这样使用起来更加方便。 下面我们可以创建一个FILE*的指针变量:

 FILE* pf;//文件指针变量

定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文 件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件。 比如:

fad77cb08416436cb2d46eb4590a60f7.png文件的打开和关闭

文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。

在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的 关系。

ANSIC 规定使用fopen函数来打开文件,fclose来关闭文件

FILE * fopen ( const char * filename, const char * mode );
 int fclose ( FILE * stream );

5a5ba87675bf4535a886a5dbe21042b1.png

int main()
{   
	FILE* pf;
	pf = fopen("test.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	fclose(pf);
	pf = NULL;
	return 0;
}

注:使用w时会将原来文件的内容清空,相当于重新创造一个文件。

int main()
{   
	FILE* pf;
	pf = fopen("test.txt", "r");//可以在test前面加../意为访问上一级根目录文件
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	fclose(pf);
	pf = NULL;
	return 0;
}

文件的顺序读写

9ce25770f08947b0b61346746e68d265.png

int main()
{   
	FILE* pf;
	pf = fopen("test.txt", "w");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	fputc('a', pf);
	fputc('b', pf);
	fputc('c', pf);
	fputc('d', pf);
	//关闭文件
	fclose(pf);
	return 0;
}

56cb00947e7c4cf09baec21adbdd63c8.png

7c88c008550e4c358aba9ffa28e84ec2.png

int main()
{   
	FILE* pf;
	pf = fopen("test.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
        return 1;
	}
	int ch = fgetc(pf);
	printf("%c", ch);
	 ch = fgetc(pf);
	printf("%c", ch);
	 ch = fgetc(pf);
	printf("%c", ch);
	fclose(pf);
	pf = NULL;
	return 0;
}

 f80fdc115e2041e294353ce019de6ec6.png

可以看到fgetc读字符时是一个一个读的。同样fputs写入时也是一个一个写入的。

int main()
{   
	FILE* pf;
	pf = fopen("test.txt", "w");
	if (NULL == fopen)
	{
		perror("fopen");
        return 1;
 	}
	//写文件
	fputs("hello world\n", pf);
	fputs("hi\n", pf);
	return 0;
}

96614f003208455e90bf23a78ee065b0.png

int main()
{   
	FILE* pf= fopen("test.txt", "r");
	
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	char ch[20] = {0};
	fgets(ch,20,pf);
	printf("%s",ch);
	fgets(ch, 20, pf);
	printf("%s", ch);
	fclose(pf);
	pf = NULL;
	return 0;
}

a026c2651b7d46718173f61f9e1a34de.png

struct S
{
	char name[20];
	int age;
	float score;
};
int main()
{   
	struct S s = { "zhangsan",20,95.5 };
	FILE* pf = fopen("test.txt", "w");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	fprintf(pf,"%s %d %f",s.name,s.age,s.score);
	fclose(pf);
	pf = NULL;
	return 0;
}

 a4ab3dcb2ec04fe08b9aa834a0026abf.png

int main()
{
	struct S s = { 0 };
	FILE* pf = fopen("test.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	fscanf(pf, "%s %d %f", s.name, &(s.age), &(s.score));
	printf("%s %d %f", s.name, s.age, s.score);
	fclose(pf);
	pf = NULL;
	return 0;
}

 f6342924291341fd8a8960a5093c8c82.png

int main()
{   
	struct S s = { 0 };
	FILE* pf = fopen("test.txt", "rb");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	fread(&s,sizeof(struct S),1,pf);
	printf("%s %d %f\n", s.name, s.age, s.score);
	fclose(pf);
	pf = NULL;
	return 0;
}

 8fc69ef5073540fcb8a901fbabeea564.png

int main()
{
	struct S s = { "张三", 20, 98.5};
	FILE* pf = fopen("test.txt", "wb");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	fwrite(&s, sizeof(struct S), 1, pf);

	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

96752bba5cb14693b6c803cdae033453.png

int main()
{
	struct S s = {"zhangsan", 20, 98.5};
	char buf[100] = { 0 };
	sprintf(buf, "%s %d %f", s.name, s.age, s.score);
	printf("%s\n", buf);//按照字符串打印的

	struct S tmp = { 0 };
	sscanf(buf, "%s %d %f", tmp.name, &(tmp.age), &(tmp.score));
	printf("%s %d %f\n", tmp.name, tmp.age, tmp.score);//打印结构体数据

	return 0;
}

a27b872978ed4cbaacbe7d87be9cefe7.png

7c1d90a8770b4578b61e49316207eb98.png

67482146a2604beba0efd1ab9494bd79.png

7fec0067306047168f4e6d04444c88f8.png

5d868806e4264071b59a7f92890d4080.png

标签:文件,NULL,return,C语言,pf,FILE,操作,fopen
From: https://blog.csdn.net/hy____123/article/details/144915767

相关文章

  • C语言程序环境和预处理详解
    本章重点:程序的翻译环境程序的执行环境详解:C语言程序的编译+链接预定义符号介绍预处理指令#define宏和函数的对比预处理操作符#和##的介绍命令定义预处理指令#include预处理指令#undef条件编译 程序的翻译环境和执行环境在ANSIC的任何一种实现中,存在......
  • 【DMSQL系列】 达梦数据库写文件的方式探索
    前沿这篇文章整体算是......
  • 使用C语言构建简易视频聊天软件框架,一个基础指南
    在探索现代通信技术的过程中,视频聊天软件已成为人们日常沟通不可或缺的一部分。尽管C语言并非构建此类复杂应用的首选(通常选择更高层次的编程语言如C++、Java或利用特定的SDK),但了解其底层原理对于深入理解网络通信至关重要。本文将通过一个简化的例子,展示如何使用C语言构建一个基......
  • Sigrity System SI SerialLink模式进行USB3.0协议仿真分析操作指导-SuperSpeed_Rx_Dev
    SigritySystemSISerialLink模式进行USB3.0协议仿真分析操作指导-SuperSpeed_Rx_DeviceSigritySystemSISerialLink模式提供了10个协议合规性检查工具模板,用户可以将根据实际应用替换模板中的SPICE文件,然后进行协议仿真分析,同时软件还提供了目标结果的模板MASK以及该协议......
  • Sigrity System SI SerialLink模式进行USB3.0协议仿真分析操作指导-SuperSpeed_Tx_Hos
    SigritySystemSISerialLink模式进行USB3.0协议仿真分析操作指导-SuperSpeed_Tx_HostSigritySystemSISerialLink模式提供了10个协议合规性检查工具模板,用户可以将根据实际应用替换模板中的SPICE文件,然后进行协议仿真分析,同时软件还提供了目标结果的模板MASK以及该协议需......
  • 如何解决网站模板无法更新及后台操作异常的问题
    您好,根据您的描述,您遇到了以下两个主要问题:网站模板无法更新,即使删除旧模板并上传新模板后,仍然显示旧模板。登录网站后台后,部分系统板块无法点击,且栏目内容混乱。为了解决这些问题,请按照以下步骤进行排查和处理:一、网站模板无法更新清除浏览器缓存浏览器缓存可能导致您看......
  • 通过宝塔面板删除的文件或数据库还能恢复吗?
    在使用宝塔面板管理服务器时,难免会遇到误删文件或数据库的情况。幸运的是,宝塔面板提供了类似于Windows系统回收站的功能,可以帮助用户恢复误删的数据。以下是详细的恢复步骤和注意事项:文件恢复操作步骤说明确认回收站状态宝塔面板默认开启了回收站功能。如果之前关闭了......
  • FTP 畸形文件无法删除的解决办法
    在使用FTP工具进行文件管理时,有时会遇到无法删除某些文件或文件夹的情况。这些文件可能是由于权限问题、文件锁定或文件名包含特殊字符等原因导致的。特别是当网站被入侵或文件名包含点号(.)等特殊字符时,FTP客户端可能无法正常删除这些文件。本文将详细介绍如何解决这些问题。常......
  • 如何定期清理IIS的错误记录日志文件以防止磁盘空间不足?
    随着IIS组件的长期使用,错误日志文件会逐渐增大,可能导致磁盘空间被占满,进而影响服务器性能和网站正常运行。因此,定期清理IIS的错误记录日志文件非常重要。以下是详细的清理步骤和注意事项,帮助您有效管理日志文件,确保系统稳定运行:了解日志文件位置:IIS的错误日志文件通常存储在以......
  • 如何高效地将网站文件从服务器下载到本地进行备份
    当您需要将网站文件从服务器下载到本地进行备份时,可以采取以下几种方法来提高效率和便捷性:使用压缩打包工具:通过服务器控制面板或命令行工具(如tar、zip等),将网站的www目录进行压缩打包。压缩后的文件可以通过FTP或其他传输方式一次性下载到本地,减少多次传输的时间消耗。示例......