C语言:文件操作(二)

news2025/1/19 3:33:19

目录

前言

4、文件的顺序读写

4.1fputc

4.2 fgetc

4.3 fputs

4.4 fgets

 4.5 fprintf

4.6 fscanf

4.7 fread和fwrite

结(二)


前言

        接者“C语言:文件操作(一)”往下讲。

        本篇文章将介绍C语言的文件操作,在后面的内容讲到:为什么使用文件;什么是文件;文件的打开和关闭;文件的顺序读写;文件的随机读写;文本文件和二进制文件;文件读取和结束的判定;文件缓冲区。详细讲述了C语言的文件操作。此内容将分成三篇讲解,这是第二篇。

4、文件的顺序读写

        顾名思义,按照顺序对文件进行读写,就是文件的顺序读写。下面会具体讲解。我们先来看看主要的函数:

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

4.1fputc

        fputc的参数有两个,第一个参数是要输入的字符的ASCII码,第二个参数是要输入文件的文件指针。

        下面举一个例子:

#include<stdio.h>
#include<string.h>
#include<errno.h>
int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (NULL == pf)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	//写文件
	char i = 0;
	for (i = 'a';i <= 'z';i++)
	{
		fputc(i, pf);
	}
	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

        这样的代码运行,我们发现在程序的路径下会多出一个文件:

        这个文件打开后发现内容正式我们在程序中对文件的输入。

        这是因为本身我们程序路径下是没有文件“test.txt”的,所以当我们以写的形式(“w”)去打开文件时,电脑就会在当前路径下创建一个文件“test.txt”,然后我们在后面利用fputc函数将“a”到“z”的字符输入到了该文件,因此文件内的内容就是“a”到“z”。

        fputc就讲到这,下面讲它相对的一个函数,fgetc。

4.2 fgetc

         fgetc的参数只有个就是文件指针,这个函数功能就是按顺序输出文件的内容,当输出失败时返回EOF。利用这个特性我们可以写一个函数。

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

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (NULL == pf)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	//读文件
	int ch = 0;
	while ((ch  = fgetc(pf)) != EOF)
	{
		printf("%c ", ch);
	}
	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

        效果如下:

        我们读取了刚刚用fputc创建的文件“test.txt”,然后再通过fgetc的特性:在没有输出时返回EOF。我们将循环的条件改为,当fgetc返回值为EOF时停止,这样就能访问文件的所有内容。于是就产生的上面这样的效果。

4.3 fputs

        fputs的参数有两个,和foutc类似,只不过第一个参数是要输入的字符串的首地址而不是字符的ASCII码。第二个参数是要输入的文件的文件指针。

        看代码:

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

int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (NULL == pf)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	//写文件
	fputs("hello world", pf);
	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

        效果就是在当前路径下的文件“tese.txt”的内容改成hello world

        没错,它会销毁文件之前的内容(之前本来内容是“a”到“z”),如果想在原来文件内容不变的情况下进行追加内容,那适用fopen函数时,应该以"a"的形式打开文件(追加形式)。

4.4 fgets

        读一行fgets有两个参数,第一个参数是读取的内容要存放的空间(这个要提前给创建好),第二个参数是要读取得字符个数,第三个参数是要读取得文件的文件指针。

        下面看例子:

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (NULL == pf)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	//读文件
	char arr[20] = { 0 };
	fgets(arr, 5, pf);

	printf("%s", arr);
	
	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

        效果:

        发现只读了四个字符,这是因为需要有一个字符放'\0',所以,读n个字符,得到的其实n-1个字符加一个'\0'。

 4.5 fprintf

        我们发现不管用fputc还是fputs,都只能对字符进行一个写入,如果要对其他类型进行写入的话,我们就需要用到fprintf。

        fprintf的参数类比printf,比printf在最前面多一个参数:FILE*类型的参数。其实就是在原来printf函数前补充一个文件指针,下面看个例子就明白了:

        

#include<stdio.h>
#include<string.h>
#include<errno.h>
struct S
{
	char arr[10];
	int age;
	float score;
};

int main()
{
	struct S s = { "zhangsan",25,50.5f };

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

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

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

	return 0;
}

        这个例子,我先创建了一个结构体struct S,然后初始化了一个结构体变量s,后通过fprintf函数将其三个内容写入文件“test.txt”,我们发现fprintf其实就是比printf多加一个参数文件指针,就可以把内容打印到文件当中去,效果如下:

4.6 fscanf

        同理,fscanf和scanf很像,就是在它前面加了一个文件指针的参数。

        下面看一个例子:

        

#include<stdio.h>
#include<string.h>
#include<errno.h>
struct S
{
	char arr[10];
	int age;
	float score;
};

int main()
{
	struct S s = { 0 };

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

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

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

	return 0;
}

        利用一下我们刚刚创建好的文件,看看效果:

        我们这样就把文件的内容读出来了。

        剩下的两个函数:fread和fwrite是二进制的读和写,将数据转化为二进制之后进行读写。且对象只能是文件。

4.7 fread和fwrite

        先看fwrite:

        这里有四个参数,首先知道第四个参数是文件指针,然后我们来看第一个参数,第一个参数是要写入的内容的地址,第二个参数是要写入的数据大小,第三个参数是要写入的数据个数。

        下面看程序:

#include<stdio.h>
#include<string.h>
#include<errno.h>
struct S
{
	char arr[10];
	int age;
	float score;
};

int main()
{
	struct S s = { "zhangsan" , 25, 50.5f };

	FILE* pf = fopen("test.txt", "wb");
	if (NULL == pf)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	//写文件
	fwrite(&s, sizeof(struct S), 1, pf);

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

	return 0;
}

        这里要注意:我们打开文件的方式应该是wb:以二进制的方式打开。

        看效果:

        我们发现有些东西我们看不懂,这是因为我们放进去的是二进制,所以我们无法看懂,但由于“zhgangsan”我们以文本和以二进制的方式放进去是一样的,所以显示出来我们看得懂。

        虽然我们看不懂这个函数,但我们可以用fread把他读取出来,fread正好可以读取二进制的数据。

        fread:

        fread有四个参数,其实我们发现fread和fwrite的参数是一样的,只是作用相反。

        看代码:

#include<stdio.h>
#include<string.h>
#include<errno.h>
struct S
{
	char arr[10];
	int age;
	float score;
};

int main()
{
	struct S s = { 0 };

	FILE* pf = fopen("test.txt", "rb");
	if (NULL == pf)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	//读文件
	fread(&s, sizeof(struct S), 1, pf);
	printf("%s %d %f", s.arr, s.age, s.score);

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

	return 0;
}

        效果:

        虽然二进制方式放进去我们看不懂,但是我们可以用fread把他读出来。

        二进制写进去文件可能会小一些,但也不一定,看情况,所以按什么方式放数据到文件里面,需要我们自己根据情况去判断。

结(二)

        C语言:文件操作(二)的内容,就到此,后续会继续讲解后面的内容。希望本篇文章对你有所帮助。

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

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

相关文章

【数字图像处理matlab系列】空间域处理之亮度变换(imadjust函数使用)

【数字图像处理matlab系列】空间域处理之亮度变换(imadjust函数使用) 在空间域中&#xff0c;图像处理就是直接对图像的像素进行操作 imadjust 是 MATLAB 中用于调整图像强度值或颜色图的函数。它可以改变图像的对比度&#xff0c;使得图像更清晰或更易于分析。以下是 imadju…

【MATLAB源码-第178期】基于matlab的8PSK调制解调系统频偏估计及补偿算法仿真,对比补偿前后的星座图误码率。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 在通信系统中&#xff0c;频率偏移是一种常见的问题&#xff0c;它会导致接收到的信号频率与发送信号的频率不完全匹配&#xff0c;进而影响通信质量。在调制技术中&#xff0c;QPSK&#xff08;Quadrature Phase Shift Keyi…

4.2总结

了解了部分Api的使用并学习了接口的API API API包含了较多种类&#xff08;System,Runtime等&#xff09; System其实就是一个工具类&#xff0c;提供了一些与系统相关的方法 下面有一些常间的System方法 方法名说明public static void exit (int status)终止当前运行的ja…

Android JNI 调用第三方SO

最近一个项目使用了Go 编译了一个so库&#xff0c;但是这个so里面还需要使用第三方so库pdfium, 首先在Android工程把2个so库都放好 在jni中只能使用dlopen方式&#xff0c;其他的使用函数指针的方式来调用&#xff0c;和windows dll类似&#xff0c;不然虽然编译过了但是会崩溃…

picGo图床搭建gitee和smms(建议使用)

picGoGitee 这个需要下载gitee插件, 因为官方频繁的检索文件类型, 有时候也会失效 如果没有特殊要求平时存个学习的要看图中文字的重要的图片建议就是smms, 免费也够用! 图片存本地不方便, 各种APP中来回传还会失帧损失画质, 所以你值得往下看 picGosmms 建议使用这个, sm…

为移动云数据实现基于可撤销属性组的加密:多代理辅助方法

参考文献为2023年发表的Achieving Revocable Attribute Group-Based Encryption for Mobile Cloud Data: A Multi-Proxy Assisted Approach 动机 对于目前的代理辅助的可撤销基于属性加密来说&#xff0c;外包解密存一些缺点。当多个具有相同属性的用户请求外包转换时&#x…

非写代码无以致远

标题党一下&#xff0c;本篇文章主要汇总了一些代码题&#xff0c;让大家写一些代码练习一下吧&#xff01; 变种水仙花_牛客题霸_牛客网 (nowcoder.com) #include<stdio.h> int main() {for (int i 10000; i < 99999; i) {int sum 0;for (int j 10; j < 1000…

业务网关的设计与实践

在过去的两年里&#xff0c;主要在做业务网关的开发。今年春节后选择转岗去做更偏近业务的开发。公司的业务是金融相关&#xff0c;一直觉得金融相关的业务是有一定门槛并且是对职业生涯有帮助的&#xff0c;所以趁这个机会来深入了解这块业务。 仔细回想&#xff0c;在做业务…

数据结构和算法:十大排序

排序算法 排序算法用于对一组数据按照特定顺序进行排列。排序算法有着广泛的应用&#xff0c;因为有序数据通常能够被更高效地查找、分析和处理。 排序算法中的数据类型可以是整数、浮点数、字符或字符串等。排序的判断规则可根据需求设定&#xff0c;如数字大小、字符 ASCII…

【算法】单单单单单调栈,接接接接接雨水

【算法】单单单单单调栈&#xff0c;接接接接接雨水 今天没有小故事。 参考以及题单来源&#xff1a; 代码随想录 (programmercarl.com) Part 1 啥是单调栈&#xff1f; 1.啥啥啥是单调栈&#xff1f; 栈的特性想必各位再熟悉不过了&#xff1a;先进后出。栈仅仅有一个出口&a…

递归算法讲解2

前情提要 上一篇递归算法讲解在这里 递归算法讲解&#xff08;结合内存图&#xff09; 没看过的小伙伴可以进去瞅一眼&#xff0c;谢谢&#xff01; 递归算法的重要性 递归算法是非常重要的&#xff0c;如果想要进大厂&#xff0c;以递归算法为基础的动态规划是必考的&…

Android安卓开发 - 简单介绍(一)

最近呢需要重构还有维护安卓项目&#xff0c;所以最近会从零开始梳理开发的一些知识点以及开发的内容 前面已经写了安装的教程&#xff0c;idea怎么安装&#xff0c;还有官方的开发工具Android Studio怎么安装 2024最新版Android studio安装入门教程&#xff08;非常详细&…

SpringBoot整合ELK8.1.x实现日志中心教程

目录 背景 环境准备 环境安装 1.JDK安装 2.安装Elasticsearch 3.安装zookeeper 4.安装Kafka 5.安装logstash 6.安装file beat 解决方案场景 1.日志采集 1.1 应用日志配置 1.1.1 创建logback-spring.xml文件 1.1.2 创建LoggerFactory 1.1.3 trace日志的记录用法 …

K8S- Deployment 的滚动更新 Rolling Update

滚动更新 这里的更新指的不是更新deployment 本身的属性(label/ replicas)等&#xff0c; 而是更新POD 的container 的版本 更新方法通常有两种 是直接update deployment配置&#xff0c; 注意只有update了template中的内容(与container相关) 才会触发更新用kubectl set ima…

C++ | Leetcode C++题解之第7题整数反转

题目&#xff1a; 题解&#xff1a; class Solution { public:int reverse(int x) {int rev 0;while (x ! 0) {if (rev < INT_MIN / 10 || rev > INT_MAX / 10) {return 0;}int digit x % 10;x / 10;rev rev * 10 digit;}return rev;} };

鸿宇多用户商城 scan_list.php SQL注入漏洞复现

0x01 产品简介 鸿宇多用户商城是一款支持各行业的多商家入驻型电商平台系统,商家版APP,微信商城,小程序及各种主流营销模块应有尽有,是一个功能强大的电子商务平台,旨在为企业和个人提供全面的在线购物解决方案。 0x02 漏洞概述 鸿宇多用户商城 scan_list.php 文件 data[fa…

Python 网络请求:深入理解Requests库

目录 引言 一、Requests库简介 二、安装与基本使用 三、requests库的特性与优势 四、requests库在实际应用中的案例 1.get请求 2.post请求 3.超时重试 4.headers设置 5.session会话 6.携带cookie​​​​​​​ 7.携带代理​​​​​​​ 8.携带身份认证​​​​​…

FLink学习(三)-DataStream

一、DataStream 1&#xff0c;支持序列化的类型有 基本类型&#xff0c;即 String、Long、Integer、Boolean、Array复合类型&#xff1a;Tuples、POJOs 和 Scala case classes Tuples Flink 自带有 Tuple0 到 Tuple25 类型 Tuple2<String, Integer> person Tuple2.…

InternLM2-lesson2作业

书生浦语大模型趣味 Demo 视频连接&#xff1a;https://www.bilibili.com/video/BV1AH4y1H78d/?vd_source902e3124d4683c41b103f1d1322401fa 目录 书生浦语大模型趣味 Demo一、基础作业二、进阶作业 一、基础作业 第一次执行&#xff1a; 第二次执行&#xff1a; 第一次执…

最新408试卷分析+备考经验分享

408出题再糟糕&#xff0c;你是不是还是要考&#xff1f; 别管出题人出多刁钻的题&#xff0c;大家拿到的卷子都是一样的&#xff0c;要难就都难&#xff0c;要刁钻就一起g... 所以再潜心钻研出题规律或出题套路&#xff0c;不如多花些时间去多复习巩固几遍知识点&#xff01…