C语言文件操作:打开关闭,读写

news2025/1/20 15:43:38

程序文件

源程序文件(后缀为.c)
目标文件(Windows环境后缀为.obj)
可执行文件(Windows环境后缀为.exe)

fputc

	FILE* pf = fopen("test.txt","w");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}

	//写文件
	char i = 0;
	for (i = 'a'; i <= 'z'; i++)
	{
		fputc(i, pf);
	}

fgetc

	FILE* pf = fopen("test.txt","r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}

	//读文件
	int ch = 0;
	while ((ch=fgetc(pf)) != EOF)
	{
		printf("%c ",ch);

	}

fputs

	FILE* pf = fopen("test.txt","w");  //w在文件打开的时候就清理掉数据了
	 //写文件的时候,如果有内容,会销毁再重新写数据
	//FILE* pf = fopen("test.txt", "a");  写a可以实现追加

	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}

	//写一行数据
	fputs("hello world\n", pf);

fgets

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

	//读一行数据
	char arr[20];
	fgets(arr, 5, pf); //读5个字符,但自己加一个\0,实际读四个
	printf("%s\n", arr);  //hello中只读了hell

fprintf


struct s
{
	char arr[10];
	int age;
	float score;

};
int main()
{	
	struct s s = { "zs",22,23.3f };

	FILE* pf = fopen("test.txt","w");  
	if (pf == NULL)
	{
		perror("fopen"); //fopen是自己加的
		return 1;
	}

	
	fprintf(pf,"%s %d %f", s.arr, s.age, s.score);

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

	return 0;
}

fscanf
格式化输入函数

struct s s = { 0 };

	FILE* pf = fopen("test.txt","r");  
	if (pf == NULL)
	{
		perror("fopen"); //fopen是自己加的
		return 1;
	}


	fscanf(pf, "%s %d %f", s.arr, &(s.age), &(s.score));
	printf("%s %d %f", s.arr, s.age, s.score);

任何一个c程序,只要运行起来,就会默认打开三个流
它们的类型都是FILE*
FILE* stdin - 标准输入流 (键盘)
FIEL* stdout - 标准输出流(屏幕)
FILE* stderr - 标准错误流(也是屏幕)

	fprintf(stdout,"%s %d %f", s.arr, s.age, s.score);  //打印到屏幕上去

fwrite
以二进制的形式写进文件中

	struct s s = {"zhangsan",25,50.5f};

	FILE* pf = fopen("test.txt","wb");  
	if (pf == NULL)
	{
		perror("fopen"); 
		return 1;
	}


	fwrite(&s, sizeof(struct s), 1, pf);

fread
以二进制的方式读

struct s s = {0};

	FILE* pf = fopen("test.txt","rb");  
	if (pf == NULL)
	{
		perror("fopen"); 
		return 1;
	}


	fread(&s, sizeof(struct s), 1, pf);
	printf("%s %d %f", s.arr, s.age, s.score);

scanf是针对标准输入的格式化输入语句
printf是针对标准输入的格式化输出语句
fscanf是针对所有输入流的格式化输入语句
fprintf是针对所有输入流的格式化输出语句
sscanf从一个字符串中转化成一个格式化的数据 (序列化)
sprintf 把一个格式化的数据转化成字符串(反序列化)

	struct s s = {"zhangsan",20,55.5f};
	struct s tmp = { 0 };
	char buf[100] = { 0 };
	sprintf(buf, "%s %d %f", s.arr, s.age, s.score);
	//sprintf 把一个格式化的数据写到字符串中,本质是把一个格式化的数据转换成字符串
	printf("%s\n", buf);
	sscanf(buf, "%s %d %f", tmp.arr, &(tmp.age), &(tmp.score)); //从字符串中获取一个格式化的数据到tmp中
	printf("%s %d %f\n", tmp.arr, tmp.age, tmp.score);

在这里插入图片描述
fseek定位文件指针,ftell计算当前文件指针的偏移量

	fseek(pf, 2 ,SEEK_SET); //文件内容abcdef  直接定位到c

	int ch = fgetc(pf); 
	printf("%c ", ch);
	printf("%d\n", ftell(pf)); //3

	fseek(pf, 2, SEEK_CUR); //文件内容abcdef  直接定位到f

	ch = fgetc(pf);
	printf("%c ", ch);
	printf("%d\n", ftell(pf)); //6

	fseek(pf, -1, SEEK_END);
	ch = fgetc(pf);
	printf("%c ", ch);
	printf("%d\n", ftell(pf)); //6

rewind让文件指针位置回到文件起始位置

	rewind(pf);
	ch = fgetc(pf);
	printf("%c ", ch); //a

feof应用于当文件读取结束的时候,判断是读取失败结束还是文件尾结束

文本文件读取是否结束判断,判断返回值是否为EOF或者NULL
fgetc判断是否为EOF
fgets判断返回值是否为NULL

二进制文件的读取结束判断判断返回值是否小于实际要读的个数
fread判断返回值是否小于实际要读的个数

	//判断是什么原因结束的
	if (ferror(pf))
	{
		puts("I?O error when reading ");
	}
	else if (feof(pf))
	{
		puts("end of the file reached successfully");
	}

文件缓冲区
因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件
如果不做,可能导致读写文件的问题

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

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

相关文章

scp:Linux系统本地与远程文件传输命令

scp 是Linux系统中用于在本地主机和远程主机之间进行文件传输的命令。 详细说明&#xff1a; scp 命令用于安全地将文件从一个主机传输到另一个主机&#xff0c;所有传输数据都是加密的。语法&#xff1a; scp [参数] [源文件路径] [目标主机:目标路径] 参数说明&#xff1a…

977. 有序数组的平方 - 力扣

1. 题目 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 2. 示例 3. 分析 我们当然可以遍历数组平方元素&#xff0c;然后再使用sort排序&#xff0c;但这里时间复杂度就为 O(logN) 了。 我…

appium元素定位工具_uiautomatorviewer.bat

特点&#xff1a; uiautomatorviewer是android-sdk自带的元素定位工具uiautomatorviewer只能用于安卓系统&#xff1b;它是通过截屏分析XML布局文件方式&#xff0c;来提供控件信息的查看服务 uiautomatorviewer.bat 基本使用 路径&#xff1a;这个工具是Android SDK中自带&…

php反序列化学习(3)

1、session 当session_start()被调用或者php.ini中session.auto_start为1时&#xff0c;php内部调用会话管理器&#xff0c;访问用户session被序列化后&#xff0c;存储到指定目录&#xff08;默认为/tmp&#xff09;。 漏洞产生&#xff1a;写入格式与读取格式不一致 处理器…

蓝桥杯2024国赛--备赛刷题题单

1.游戏&#xff08;单调队列&#xff09; 注意如果结果是分数&#xff0c;直接设置变量为double&#xff0c;最好不要使用把int类型乘1.0变成分数来计算。 #include <iostream> #include <queue> using namespace std; const int N1e510; //滑动窗口大小为k,最大值…

运维开发.Kubernetes探针与应用

运维系列 Kubernetes探针与应用 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263…

HTML静态网页成品作业(HTML+CSS)——企业装饰公司介绍网页(4个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有4个页面。 二、作品演示 三、代…

【C++】C++11新特性:列表初始化、声明、新容器、右值引用、万能引用和完美转发

目录 一、列表初始化 1.1 { } 初始化 1.2 std::initializer_list 二、声明 2.1 auto 2.2 decltype 2.3 nullptr 三、新容器 四、右值引用和移动语义 4.1 左值和左值引用 4.2 右值和右值引用 4.3 左值引用与右值引用比较 4.4 右值引用使用场景和意义&#xff1a;移…

chap5 CNN

卷积神经网络&#xff08;CNN&#xff09; 问题描述&#xff1a; 利用卷积神经网络&#xff0c;实现对MNIST数据集的分类问题 数据集&#xff1a; MNIST数据集包括60000张训练图片和10000张测试图片。图片样本的数量已经足够训练一个很复杂的模型&#xff08;例如 CNN的深层…

Visual Studio Code使用(C++项目新建,运行)

VS Code 直接在官网下载安装。 接下来安装插件&#xff0c;下图是C所需的对应插件 1.新建项目 VS Code下载安装完成后&#xff0c;直接进入欢迎页&#xff1a; 在访达/文件夹中新建一个文件夹&#xff0c;欢迎页点击【打开】&#xff0c;选择刚刚新建的文件夹。点击第一个图…

MT8781安卓核心板_MTK联发科Helio G99核心板规格参数

MT8781安卓核心板采用先进的台积电6纳米级芯片生产工艺&#xff0c;配备高性能Arm Cortex-A76处理器和Arm Mali G57 GPU&#xff0c;加上LPDDR4X内存和UFS 2.2存储&#xff0c;在处理速度和数据访问速度上都有着出色的表现。 MT8781还支持120Hz显示器&#xff0c;无需额外的DSC…

vue3学习(六)

前言 接上一篇学习笔记&#xff0c;今天主要是抽空学习了vue的状态管理&#xff0c;这里学习的是vuex&#xff0c;版本4.1。学习还没有学习完&#xff0c;里面有大坑&#xff0c;难怪现在官网出的状态管理用Pinia。 一、vuex状态管理知识点 上面的方式没有写全&#xff0c;还有…

QT软件界面的设计与启动方法

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、Q T界面设计的重要性 二、QT软件的启动与配置 三、QT软件的启动路径设置 四、QT软件启…

Linux--EXT2文件系统

参考资料&#xff1a; linux之EXT2文件系统--理解block/block group/索引结点inode/索引位图_一个块组中索引节点表和数据块区最多占用字节-CSDN博客 linux环境&#xff1a; Linux version 5.15.146.1-microsoft-standard-WSL2 (root65c757a075e2) (gcc (GCC) 11.2.0, GNU ld…

Llama改进之——分组查询注意力

引言 今天介绍LLAMA2模型引入的关于注意力的改进——分组查询注意力(Grouped-query attention,GQA)1。 Transformer中的多头注意力在解码阶段来说是一个性能瓶颈。多查询注意力2通过共享单个key和value头&#xff0c;同时不减少query头来提升性能。多查询注意力可能导致质量下…

C++双层Vector容器详解

双层Vector容器 关于C中二维vector使用 双层vector的运用细节 插入元素 //正确的插入方式 vector<vector<int> > A; //A.push_back里必须是vector vector<int> B; B.push_back(0); B.push_back(1); B.push_back(2); A.push_back(B); B.clear(); B.push_back…

AI边缘计算盒子在智慧交通的应用

方案背景 随着经济增长&#xff0c;交通出行需求大幅增长&#xff0c;但道路建设增长缓慢&#xff0c;交通供需矛盾日益显著&#xff0c;中心城区主要道路高峰时段交通拥堵严重&#xff0c;道路交通拥堵逐渐常态化&#xff0c;成为制约城市可持续发展的重要因素之一。 痛点问题…

python移位操作符(左移位操作符<<、右移位操作符>>)(允许开发者对整数进行位操作,乘2或除2)(左移操作、右移操作)(位掩码操作|=)

文章目录 Python 中的移位操作符详解移位操作符简介左移位操作符 (<<)语法和使用示例代码输出 右移位操作符 (>>)语法和使用示例代码输出 移位操作符的应用场景快速乘除运算&#xff1a;使用移位操作符代替传统的乘法和除法运算&#xff0c;可以提高计算速度。位掩…

3位新加坡华人交易员分享:交易策略、风险管理与心态

交易与投资似乎是一对“双胞胎”,它们都是金融市场中获得收益的重要途径。 区别在于投资者购买自以为长期将有出色业绩的资产组合&#xff0c;并且长期持有这些资产组合&#xff0c;交易者依靠交易技巧借助资产工具价格瞬息波动在短期内产生利润。交易资产的手段有&#xff0c…

MySQL统计字符长度:CHAR_LENGTH(str)

对于SQL表&#xff0c;用于计算字符串中字符数的最佳函数是 CHAR_LENGTH(str)&#xff0c;它返回字符串 str 的长度。 另一个常用的函数 LENGTH(str) 在这个问题中也适用&#xff0c;因为列 content 只包含英文字符&#xff0c;没有特殊字符。否则&#xff0c;LENGTH() 可能会返…