第五十八天学习记录:C语言进阶:文件操作1

news2024/10/7 14:26:34

什么是文件

在程序设计中,一般有两种文件:程序文件、数据文件

程序文件

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

数据文件

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

文件

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

文件类型

根据数据的组织形式,数据文件被称为文本文件或者二进制文件
数据在内存中以二进制的形式存储,如果不加以转换的输出到外存,就是二进制文件
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

int main()
{
	int a = 10000;
	FILE* pf = fopen("test.txt", "wb");//wb用二进制的形式写
	fwrite(&a, 4, 1, pf);//二进制的形式写到文件中
	//写一个四字节的数据
	fclose(pf);
	pf = NULL;
	return 0;
}

该代码会在工程目录下生成如下文件
在这里插入图片描述
直接打开是乱码:
在这里插入图片描述
用VS二进制方式打开:
在这里插入图片描述
在这里插入图片描述
因为是小端模式,得出最终表现的十六进制形式是:27 10,转换成16进制就是10000

文件缓冲区

ANSIC标准采用缓冲文件系统处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。

在这里插入图片描述
上图转自比特科技。

文件指针

缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名FILE
在这里插入图片描述
在编写程序的时候,在打开文件的同时,都会返回一个FILE* 的指针变量指向该文件,也相当于建立了指针和文件的关系。
ANSIC规定使用fopen函数来打开文件,fclose来关闭文件。

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

打开方式如下:

文本使用方式含义如果指定文件不存在
“r”(只读)为了输入数据,打开一个已经存在的文本文件出错
“w”(只写)为了输出数据,打开一个文本文件建立一个新的文件
“a”(追加)向文本文件尾添加数据出错
“rb”(只读)为了输入数据,打开一个二进制文件出错
“wb”(只写)为了输出数据,打开一个二进制文件建立一个新的文件
“ab”(追加)向一个二进制文件尾添加数据出错
“r+”(读写)为了读和写,打开一个文本文件出错
“w+”(读写)为了读和写,建立一个新的文件建立一个新的文件
“a+”(读写)打开一个文件,在文件尾进行读写建立一个新的文件
“rb+”(读写)为了读和写打开一个二进制文件出错
“wb+”(读写)为了读和写,新建一个新的二进制文件建立一个新的文件
“ab+”(读写)打开一个二进制文件,在文件尾进行读和写建立一个新的文件
#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

int main()
{
	//打开文件test.txt
	//相对路径
	//..表示上一级路径
	//.表示当前路径
	//fopen("../../test.txt","r");
	//fopen("test.txt","r");
	//绝对路径写法
	fopen("F:\\aha\\test.txt","r");
	return 0;
}

问://fopen(“./test.txt”,“r”); //fopen(“test.txt”,“r”);有什么区别?
ChatAI答:
这两个语句的作用都是打开文件"test.txt",并以只读模式®进行访问。但它们的路径表示方式略有不同。

第一个语句 fopen("./test.txt", "r") 中的 “./” 表示当前路径,也就是表示在当前目录下寻找名为"test.txt"的文件。这个语句会在程序的当前工作目录下寻找"test.txt"这个文件,而不会去其他目录下查找。如果当前工作目录下不存在这个文件,则无法打开它。

第二个语句 fopen("test.txt", "r") 则表示在文件的相对路径中寻找名为"test.txt"的文件。如果这个相对路径中的文件存在,程序就会打开它。但是如果这个文件不存在,程序将无法打开它。

因此,当程序运行的环境有多个工作目录时,使用第一个语句可以更加确保打开正确的文件。而当程序运行的环境中只有一个工作目录时,这两个语句都可以正确地打开文件。

文件的顺序读写

文本使用方式函数名适用于
字符输入函数fgetc所有输入流
字符输出函数fputc所有输出流
字本行输入函数fgets所有输入流
文本行输出函数fputs所有输出流
格式化输入函数fscanf所有输入流
格式化输出函数fprintf所有输出流
二进制输入fread文件
二进制输出fwrite文件

写文件

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <errno.h>
#include <string.h>

int main()
{
	FILE* pfWrite=fopen("F:\\aha\\test.txt","w");
	if (pfWrite == NULL)
	{
		printf("%s\n", strerror(errno));
		return 0;
	}
	//写文件
	fputc('C', pfWrite);
	fputc('h', pfWrite);
	fputc('u', pfWrite);
	fputc('n', pfWrite);
	fputc('g', pfWrite);
	//关闭文件
	fclose(pfWrite);
	pfWrite = NULL;
	return 0;
}

读文件

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <errno.h>
#include <string.h>

int main()
{
	FILE* pfRead = fopen("F:\\aha\\test.txt", "r");
	if (pfRead == NULL)
	{
		printf("%s\n", strerror(errno));
		return 0;
	}
	//读文件
	printf("%c", fgetc(pfRead));
	printf("%c", fgetc(pfRead));
	printf("%c", fgetc(pfRead));
	printf("%c", fgetc(pfRead));
	printf("%c", fgetc(pfRead));
	//关闭文件
	fclose(pfRead);
	pfRead = NULL;
	return 0;
}

从键盘输入
输出到屏幕
键盘&屏幕都是外部设备

键盘-标准输入设备 stdin
屏幕-标准输出设备 stdout
是一个程序默认打开的两个流设备
stdin FILE*
stdout FILE*
stderr FILE*

问:介绍一下stdin stdout stderr
ChatAI答:
在C语言中,stdinstdoutstderr 是三个重要的流(stream)标准,它们都是预定义的指针,指向标准输入流、标准输出流和标准错误流。

  1. stdin:标准输入流。它是一种输入数据的终端,通常来自于键盘或其他输入设备。可以使用scanf()等函数从stdin中读取输入数据。

  2. stdout:标准输出流。它是一种输出数据的终端,通常是显示器或其他输出设备。可以使用printf()等函数将数据输出到stdout中。

  3. stderr:标准错误流。它用于输出错误信息和诊断信息。通常也是输出到显示器,但与stdout不同的是,stderr的输出不会被标准输出重定向到其他设备,而会直接输出到显示器。

这些流还可以通过文件重定向来实现输入/输出操作,例如,将标准输出重定向到文件中,将标准输入从文件中读取数据等等。这些流在很多操作系统的各种应用程序都是必不可少的,它们的使用使得进程的输入、输出和错误处理更加灵活和方便。

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

int main()
{
	int ch = fgetc(stdin);
	fputc(ch, stdout);
	return 0;
}

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

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

相关文章

TM7707 评估前做的功课

目录 硬件 模拟输入范围 转换速度与有效位数 数字电平匹配 建立时间 基准电压 软件 寄存器 硬件 MCU 3.3V 平台&#xff1b; ADC mclk 2.4576mhz 模拟输入范围 在非缓冲模式下&#xff0c;共模输入范围是从 GND 到 V DD 。模拟输入电压的绝对值处在 GND-30mV 和 …

SAP不停机做client copy ,把800数据覆盖到600,导致在600很多单据创建不出来

不停机做client copy &#xff0c;把800数据覆盖到600&#xff0c;但是因为没有停机&#xff0c;导致在800还在产生单据&#xff0c;以至于600的 number range 不对&#xff0c;很多单据都能保存成功但是查寻不到 涉及到的单据&#xff08;包括但不限于&#xff09; 采购订单 生…

GPT-4 太贵?试试这 6 个免费且优秀的替代方案

大家好&#xff0c;我是可夫小子&#xff0c;《小白玩转ChatGPT》专栏作者&#xff0c;关注AIGC、读书和自媒体。 目录 AutoGPT - 直接从您的浏览器使用 Bard - Google AI 的免费工具。 Bing - New Bing 已经支持GPT-4&#xff0c; Claude - Anthropic对标ChatGPT Hugging…

适合每个人的热门CSS工具

本文首发于微信公众号&#xff1a;大迁世界, 我的微信&#xff1a;qq449245884&#xff0c;我会第一时间和你分享前端行业趋势&#xff0c;学习途径等等。 更多开源作品请看 GitHub https://github.com/qq449245884/xiaozhi &#xff0c;包含一线大厂面试完整考点、资料以及我的…

Jenkins+Gogs自动远程Docker环境部署django项目

1.Jenkins安装或确认必要插件 jenkins安装或确认必要插件gitlab、Publish Over SSH。 Dashboard--Manage Jenkins--Plugin Manager 2.Publish Over SSH配置 jenkins配置SSH连接django服务部署的对象服务器 Dashboard--Manage Jenkins--Configure System&#xff0c;找到 Publ…

LIS和LIMS有什么区别?

术语“实验室信息系统”&#xff08;LIS&#xff09;和“实验室信息管理系统”&#xff08;LIMS&#xff09;经常会引起混淆&#xff0c;并且倾向于互换使用这些术语。通常&#xff0c;术语“ LIS”是指用于管理医院或医疗环境中的临床诊断测试的系统。另一方面&#xff0c;LIM…

基于C#的串口扫描枪通信实战

今天搞大事&#xff0c;观众们动起来&#xff0c;搞事的目的是 掌握串口通信及winform开发技术 硬件设备&#xff1a;1、串口激光扫描枪&#xff0c;注意是串口&#xff0c;不是USB口 2、USB转串口的连接线一根&#xff0c;如图连接所示 3、USB扩展器一个&#xff0c;如果你电…

图片优化: CssSprites与Base64编码

文章目录 1 css sprites1.1 CSS Sprites是什么1.2 为什么需要css sprites1.3 优势1.4 使用原理 2 图片Base64编码 1 css sprites 1.1 CSS Sprites是什么 CSS Sprites是一种网页图片应用处理方式。 又被解释为&#xff1a; CSS精灵CSS图像拼合CSS贴图定位CSS图片精灵CSS雪碧图…

快六一啦,学习CSS3实现一个冰淇淋动画特效

快六一啦&#xff0c;小时候顶多吃个小冰棍&#xff0c;或者是那种小冰袋&#xff0c;现在的小朋友真是好&#xff0c;动不动就能吃到冰淇淋&#xff0c;今天用CSS3实现一个冰淇淋的动画特效吧 目录 实现思路 桶身的实现 冰淇淋身体的实现 五彩颗粒的实现 HTML源码 CSS3源…

17 张程序员专属壁纸推荐

1、三思后再写代码&#xff01;&#xff01;&#xff01; 2、从世界上搜索喜欢你的人&#xff01;&#xff01;&#xff01; 3、代码没写完&#xff0c;哪里有脸睡觉&#xff01;&#xff01;&#xff01; 4、程序员的 Home 键&#xff01;&#xff01;&#xff01; 5、编程是…

【完整项目开发】Springboot+vue教学材料管理系统定制开发

Springbootvue 的专业建建设材料管理系统。 **大家好&#xff0c;今天分享最近做的一套系统。**起因源于小伙伴的需求 文末有的获取方式&#xff0c;如需定制系统&#xff0c;需求发来&#xff0c;我为你分忧&#xff0c;搞起 一、 项目介绍 基于各个专业&#xff0c;对教…

代码随想录算法训练营day56 | 583. 两个字符串的删除操作,72. 编辑距离,编辑距离总结篇

代码随想录算法训练营day56 | 583. 两个字符串的删除操作&#xff0c;72. 编辑距离&#xff0c;编辑距离总结篇 583. 两个字符串的删除操作解法一&#xff1a;动态规划解法二&#xff1a;计算最长公共子序列&#xff0c;然后用数组长度减掉子序列长度 72. 编辑距离解法一&#…

界面组件DevExpress ASP.NET Core v22.2 - UI组件升级

DevExpress ASP.NET Core Controls使用强大的混合方法&#xff0c;结合现代企业Web开发工具所期望的所有功能。该套件通过ASP.NET Razor标记和服务器端ASP.NET Core Web API的生产力和简便性&#xff0c;提供客户端JavaScript的性能和灵活性。ThemeBuilder工具和集成的Material…

【操作系统】01.操作系统概论

操作系统的发展历史 未配置操作系统 手工操作阶段 用户独占全机&#xff0c;人机速度矛盾导致系统资源利用率低 脱机输入输出方式 为了缓解主机cpu和IO设备之间速度不匹配的矛盾&#xff0c;出现了脱机IO技术 在外围机的控制下&#xff0c;通过输入设备&#xff0c;将数据输…

Spring事务和事务的传播机制

一、为什么需要事务 1.1事务定义 将一组操作封装成一个执行单元&#xff0c;要么全部成功要么全部失败。 1.2为什么要用事物 例如转账分为两个操作&#xff1a; 第⼀步操作&#xff1a;A 账户 -100 元。第⼆步操作&#xff1a;B 账户 100 元。 如果没有事务&#xff0c;第…

脱岗监测预警系统 yolov5

脱岗监测预警系统可以通过pythonyolov5网络模型深度学习算法&#xff0c;脱岗监测预警算法对现场人员岗位进行实时监测&#xff0c;自动识别是否存在脱岗行为&#xff0c;并及时发出警报。Yolo意思是You Only Look Once&#xff0c;它并没有真正的去掉候选区域&#xff0c;而是…

2023安卓逆向 -- 抓包环境设置(Charles+Postern)

一、下载Charles并设置代理 1、下载地址&#xff0c;一路下一步即可安装 https://www.charlesproxy.com/ 2、代理设置&#xff0c;抓取所有ip及所有端口的数据包&#xff0c;点击Proxy&#xff0c;选择SSL Proxying Settings 3、点击Add&#xff0c;Host和Port都填写*&#x…

chatgpt赋能python:Python中的升序降序sort解析

Python中的升序降序sort解析 在 Python 开发中&#xff0c;sort 方法是非常常用的方法&#xff0c;它可以对包含数字或字符串的列表进行排序&#xff0c;其中有两种排序方式&#xff0c;分别是升序和降序。本篇文章将会深入探讨 Python 中的 sort 方法&#xff0c;着重介绍升序…

【回顾经典AI神作】卷积神经网络CNN架构系列:LeNet,AlexNet,VGG,GoogLeNet,ResNet

卷积神经网络(CNN或ConvNet)是一种特殊的多层神经网络,旨在以最少的预处理直接从像素图像中识别视觉模式。ImageNet项目是一个大型视觉数据库,设计用于视觉对象识别软件研究。ImageNet 项目举办年度软件竞赛,即 ImageNet 大规模视觉识别挑战赛 (ILSVRC),软件程序竞相正…

企业客户管理难题都有哪些?CRM系统如何解决?

CRM系统在客户管理中的重要性不言而喻&#xff0c;它可以帮助企业提高销售效率&#xff0c;优化客户体验和忠诚度&#xff0c;增加市场份额和利润。那么&#xff0c;CRM客户管理系统如何解决大客户管理难题? 企业大客户管理难题都有哪些&#xff1a; 1、需求十分多变 大客户…