文件读写(相关函数详解)

news2024/11/16 13:04:23

 1.文件的顺序读写

相关函数:

  

1.1 fputc函数

fputc的参数如下

它的功能是把字符character输出到stream指向的文件中,字符的本质就是它的ascll值所以这里用int类型接收。如果写入成功则返回写入的字符的ascll码失败则返回-1(即EOF)

示例代码:

#include<stdio.h>
#include<errno.h>
int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror(fopen);
		return 1;
	}
	for (char i = 'a'; i <= 'z'; i++)
	{
		fputc(i, pf);
	}
	fclose(pf);
	return 0;
}

注意:当不存在test.txt这个文件的时候,以写的形式打开(即"w")程序执行后会创建一个test.txt文件,但如果以读的形式打开(即"r")的话程序会报错 。

注意:如果test.txt这个文件存在的时候,以写的形式打开(即"w")程序执行后会把原有的数据清空再进行写入。

注意:不能以读的形式打开然后去写,也不能以写的形式打开然后去读。

一下方式可以找到这个被读写文件

1.2 fputs函数

fputs参数如下:

fputs的功能是把字符串str输出到stream指向的文件中,如果写入成功返回一个非负整数,写入失败,则返回-1(即EOF)

示例代码:

int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror(fopen);
		return 1;
	}
	fputs("1234567", pf);
	char s[] = "abcdef";
	fputs(s, pf);
	fclose(pf);
	return 0;
}

1.3 fgetc函数

fgetc的参数如下:

它的作用是返回stream对应的文件里面的一个字符(它的返回值),所以需要一个字符变量来接收,当读取失败时返回-1,虽然说是返回字符,但fgetc函数的返回类型是int,不过这没关系每个字符都有对应的ascll码值,它的ascll是int类型,这里返回类型用int接收也是为了对应当读取失败时返回的-1,每读取一次stream指向的文件内容,文件指针往后移动一位

示例代码

#include<stdio.h>
int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (!pf)
	{
		perror(fopen);
		return 1;
	}
	char c;
	while ((c = fgetc(pf))!=-1)
	{
		printf("%c", c);
	}
	fclose(pf);
	return 0;
}

1.4 fgets函数 

fgets参数如下:

fgets函数的功能是把stream指向的文件中的num个字符(即一个字符串)输入到str中,返回值是该字符串首字符的地址,当读取失败时返回NULL,每读取一次stream指向的文件内容,stream往后移动num位。

#include<stdio.h>
int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror(fopen);
		return 1;
	}
	char s[30] = { 0 };
	while(fgets(s,2,pf)!=NULL)
	{
		printf(s);
	}
	return 0;
}

1.5 fprintf函数

参数如下:

它的功能是把数据以格式化的形式输出到stream指向的文件

示例代码

#include<stdio.h>
#include<errno.h>
int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror(fopen);
		return 1;
	}
	int a = 6;
	char s[10] = "pupm";
	fprintf(pf, "%d %s", a, s);
	fclose(pf);
	return 0;
}

1.6 fscanf函数

参数如下:

它的作用是把stream指向的文件的内容格式化的输入到内存中。

示例代码

#include<stdio.h>
#include<errno.h>
int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror(fopen);
		return 1;
	}
	int a = 0;
	char s[10] = {0};
	fscanf(pf,"%d %s", &a, s);
	printf("%d %s", a,s);
	fclose(pf);
	return 0;
}

1.7 fwrite

fwrite的功能是把ptr指向的空间中的count个元素以二进制的形式写入stream所指向的文件中,其中参数size表示ptr指向的空间中的一个元素占的字节数,返回成功写入的元素个数

注意:文件要以"wb"的形式打开,表示以二进制形式写入。 

示例代码

int main()
{
	FILE* pf = fopen("test.txt", "wb");
	if (pf == NULL)
	{
		perror(fopen);
		return 1;
	}
	int arr[10] = {1,2,3,4,5,6,7,8,9,10};
	fwrite(arr, sizeof(arr[0]), 8, pf);
	fclose(pf);
	return 0;
}

因为是以二进制的形式写进去的,所以里面的内容是看不懂的 

1.8 fread

参数如下:

与fwrite函数相反该函数的功能是把stream所指向的文件内容的count个元素以二进制的形式读取到ptr所指向的空间,其中参数size表示ptr指向的空间中的一个元素占的字节数,返回成功读取到的元素个数

 注意:文件要以"rb"的形式打开,表示以二进制形式读取。

示例代码

int main()
{
	FILE* pf = fopen("test.txt", "rb");
	if (pf == NULL)
	{
		perror(fopen);
		return 1;
	}
	int arr[10] = { 0 };
	int i = 0;
	while (fread(&arr[i], sizeof(arr[0]), 1, pf) == 1)
	{
		printf("%d ", arr[i++]);
	}
	fclose(pf);
	return 0;
}

2.sprintf函数

参数如下:

功能是把格式的数据写入字符串str中

示例代码

#include<stdio.h>
int main()
{
	char s[10] = { 0 };
	int a = 42;
	char c='a';
	sprintf(s, "%d %c", a, c);
	printf("%s", s);
	return 0;
}

3.sscanf函数

sscanf的功能是在字符串s中数据以格式化的形式读取。

示例代码

#include<stdio.h>
int main()
{
	char s[10] = "4k";
	int a;
	char c;
	sscanf(s, "%d%c", &a, &c);
	printf("%d %c", a, c);
	return 0;
}

4.文件的随机读写:

相关函数

fseek     根据⽂件指针的位置和偏移量来定位⽂件指针

ftell        返回⽂件指针相对于起始位置的偏移量

rewind   让⽂件指针的位置回到⽂件的起始位置

4.1 fseek函数

该函数的作用是把文件指针stream指向距origin(起始位置)偏移量为offset的位置 

origin有3中选择:SEEK_SET,SEEK_CUR,SEEK_END三种

 示例代码

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror(fopen);
		return 0;
	}
	char a, b, c;
	fseek(pf, 5, SEEK_SET);
	a = fgetc(pf);
	printf("%c ", a);

	fseek(pf, 2, SEEK_CUR);
	b = fgetc(pf);
	printf("%c ", b);

	fseek(pf, -2, SEEK_END);
	c = fgetc(pf);
	printf("%c ", c);
	fclose(pf);
	return 0;
}

 test.txt文件内容

运行结果:

4.2 ftell函数

功能是返回文件指针相对于文件起始位置的偏移量。

 示例代码

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror(fopen);
		return 0;
	}
	fseek(pf, -1, SEEK_END);
	int ret = ftell(pf);
	printf("%d", ret);
	fclose(pf);
	return 0;
}

4.3 rewind函数

这个函数功能是让文件指针回到文件的起始位置

 示例代码

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

5.错误检测 

为什么要有错误检查呢

fgetc 如果读取正常,返回的是读取到字符的ascIl码值,如果读取的过程中遇到文件末尾,或者发生错误,都返回EOF(-1)。

fgets如果读取正常,返回的是存储读取到的字符串的字符数组的地址,如果读取的过程中遇到文件末尾,或者发生错误,都返回NULL。

所以我们是无法知道是因为什么原因文件读取结束的

5.1 feof函数

该函数用于判断当⽂件读取结束的时候,判断是读取结束的原因是否是:遇到⽂件尾结束(即是否是正常结束)

当是因为遇到⽂件尾而读取结束时返回非0值,否则返回0

5.2 ferror函数

该函数判断读取文件的时候是否发生错误。

读取文件的过程发生错误返回0,否则返回非0值。

 示例代码

#include<stdio.h>
#include<errno.h>
int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror(fopen);
		return 1;
	}
	char c;
	while ((c = fgetc(pf)) != EOF)
	{
		printf("%c", c);
	}
	if (feof(pf))
	{
		printf("\n遇到文件末尾,读取正常结束\n");
	}
	else if (ferror(pf))
	{
		perror(fgetc);
	}
	fclose(pf);
	return 0;
}

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

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

相关文章

【洛谷】P9236 [蓝桥杯 2023 省 A] 异或和之和

题目链接 P9236 [蓝桥杯 2023 省 A] 异或和之和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路 1. 暴力求解 直接枚举出所有子数组&#xff0c;求每个子数组的异或和&#xff0c;再对所有的异或和求和 枚举所有子数组的时间复杂度为O&#xff08;N^2&#xff09;&…

C++ 【原型模式】

简单介绍 原型模式是一种创建型设计模式 | 它使你能够复制已有对象&#xff0c;客户端不需要知道要复制的对象是哪个类的实例&#xff0c;只需通过原型工厂获取该对象的副本。 以后需要更改具体的类或添加新的原型类&#xff0c;客户端代码无需改变&#xff0c;只需修改原型工…

线程安全--深入探究线程等待机制和死锁问题

꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如需转…

影院座位选择简易实现(uniapp)

界面展示 主要使用到uniap中的movable-area&#xff0c;和movable-view组件实现。 代码逻辑分析 1、使用movable-area和movea-view组件&#xff0c;用于座位展示 <div class"ui-seat__box"><movable-area class"ui-movableArea"><movab…

C++ 内存分配时地址对齐

如果数据地址的对齐与CPU相兼容&#xff0c;那么CPU读写内存时性能会更高。 因此在C中&#xff0c;有时会希望在堆或栈中分配内存时&#xff0c;返回的地址能按照特定的长度对齐。 如果希望在栈中分配的内存时&#xff0c;返回地址按照特定长度对齐&#xff0c;可以使用 alig…

IVS模型解释

核心思路 【Implied volatility surface predictability: The case of commodity markets】 半参数化模型&#xff1a;利用各种参数(或者因子)对隐含波动率进行降维&#xff08;静态参数化因子模型&#xff09;&#xff0c;对参数化因子的时间序列进行间接的建模 基于非对称…

蓝桥杯 十一届C++A组 字符排序 21分(运行超时)

思路&#xff1a; 1. 此题考查的冒泡排序中的交换次数&#xff0c;其实就是考察当前数与后面的逆序对个数问题。而为了最大利用位数&#xff0c;应当使每一位都不小于后面的字符&#xff0c;否则会造成一次逆序对的浪费&#xff08;贪心&#xff0c;为了使总位数最少&#xff…

代码随想录算法训练营三刷 day45 | 动态规划 之 70. 爬楼梯 (进阶) 322. 零钱兑换 279.完全平方数

三刷day45 70. 爬楼梯 &#xff08;进阶&#xff09;1. 确定dp数组以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例来推导dp数组 322. 零钱兑换1. 确定dp数组以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组 279.完全平方…

01.IDEA中出现Cannot resolve symbol ‘SpringApplication异常

试了很多次&#xff0c;看了这篇文章终于发现了问题。IDEA解决springboot工程中Cannot resolve symbol SpringApplication异常-CSDN博客 我存在的问题在于Maven home path有误&#xff0c;改正之后就没有问题&#xff0c;不标红了。

逆向案例十二——看准网企业信息json格式的信息

网址&#xff1a;【全国公司排行|排名榜单|哪家好】-看准网 打开开发者工具——刷新——网络——XHR——下滑页面加载新的页面——找到数据包 发现参数加密&#xff0c;返回的数据也进行了加密 按关键字在下方搜索 kiv进入第一个js文件 ctrlf打开文件里面的搜索框继续搜kiv找到…

【机器学习入门】使用YOLO模型进行物体检测

系列文章目录 第1章 专家系统 第2章 决策树 第3章 神经元和感知机 识别手写数字——感知机 第4章 线性回归 第5章 逻辑斯蒂回归和分类 第5章 支持向量机 第6章 人工神经网络(一) 第6章 人工神经网络(二) 卷积和池化 第6章 使用pytorch进行手写数字识别 文章目录 系列文章目录前…

ECAI 2024投稿指南

诸神缄默不语-个人CSDN博文目录 ECAI也写一下&#xff0c;作为备胎。毕竟ECAI是CCF B会。 ECAI dblp官网&#xff1a;https://dblp.uni-trier.de/db/conf/ecai/index.html 征文网址&#xff1a;https://www.ecai2024.eu/calls/main-track ECAI 2024在西班牙开&#xff0c;如…

伦敦银行情上涨时投资盈利

在讨论如何根据伦敦银行情上涨时机投资盈利之前&#xff0c;投资者需要了解伦敦银的特性以及影响其价格波动的因素。伦敦银&#xff0c;即银的伦敦市场交易价格&#xff0c;是全球贵金属交易中的重要参考价。银的价格受到多种因素的影响&#xff0c;包括全球经济状况、货币政策…

FJSP:巨型犰狳优化算法(Giant Armadillo Optimization,GAO)求解柔性作业车间调度问题(FJSP),提供MATLAB代码

一、柔性作业车间调度问题 柔性作业车间调度问题&#xff08;Flexible Job Shop Scheduling Problem&#xff0c;FJSP&#xff09;&#xff0c;是一种经典的组合优化问题。在FJSP问题中&#xff0c;有多个作业需要在多个机器上进行加工&#xff0c;每个作业由一系列工序组成&a…

网络安全流量平台_优缺点分析

FlowShadow&#xff08;流影&#xff09;&#xff0c;Ntm&#xff08;派网&#xff09;&#xff0c;Elastiflow。 Arkimesuricata&#xff0c;QNSMsuricata&#xff0c;Malcolm套件。 Malcolm套件优点&#xff1a;支持文件还原反病毒引擎&#xff08;clamav/yara&#xff09;…

基于单片机冬季供暖室温调节控制系统

**单片机设计介绍&#xff0c;基于单片机冬季供暖室温调节控制系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的冬季供暖室温调节控制系统是一种集温度检测、控制和显示功能于一体的智能化系统。该系统以单片机为…

Kubernetes(k8s):Pod 的 Node Selector详解

Kubernetes&#xff08;k8s&#xff09;&#xff1a;Pod 的 Node Selector详解 1、什么是Node Selector&#xff1f;2、Node Selector的工作原理3、Node Selector的用法1、例如&#xff1a;给node01 、node02 分别打上标签2、使用标签调度Pod3、删除节点的标签 &#x1f496;Th…

SystemC入门学习Demo用例的工程化配置

背景&#xff1a;对不同的用例文件&#xff0c;使用CMakeLists.txt进行工程化管理的演示&#xff0c;这样开发者可以更加关注在代码开发上。 1&#xff0c;首先安装好系统环境的systemC库&#xff1a;ubuntu系统安装systemc-2.3.4流程-CSDN博客 2&#xff0c;准备好一个demo用…

Golang | Leetcode Golang题解之第12题整数转罗马数字

题解&#xff1a; 题解&#xff1a; var (thousands []string{"", "M", "MM", "MMM"}hundreds []string{"", "C", "CC", "CCC", "CD", "D", "DC", "…

Python最简单的图片爬虫

Python最简单的图片爬虫&#xff0c;20行代码带你爬遍整个网站-腾讯云开发者社区-腾讯云 (tencent.com) import urllib.parse import json import requests import jsonpath url https://www.duitang.com/napi/blog/list/by_search/?kw{}&start{} label 美女 label url…