C语言【文件操作 2】

文章目录

  • 前言
  • 顺序读写函数的介绍
    • fputc && fgetc
      • fputc
      • fgetc
    • fputs && fgets
      • fputs
      • fgets
    • fprintf && fscanf
      • fprintf
      • fscanf
    • fwrite && fread
      • fwrite
      • fread
  • 文件的随机读写
    • fseek函数
    • 偏移量
    • ftell函数
    • rewind函数
  • 文件的结束判断
    • 被错误使用的feof
  • 结语

前言

在前面的文章我们讲解了文件操作的基础:点击此处浏览前文下面正式讲解文件的操作函数
注意:因为本章讲解的文件操作,所以大多数函数使用环境默认是文件!!!

顺序读写函数的介绍

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

上面说的适用与所有输入流一般指的是适用于标准输入流与其他输入流(例如文件输入流);所有输出流指的是适用于标准输出流与其他输出流(例如文件输出流)。

fputc && fgetc

fputc

将一个字符输出到文件

int fputc(int c, FILE* stream);

参数为什么是int类型呢?

因为传递的是ASCII码值

为什么会返回int类型的值呢?返回的是什么呢?
cpp网站是这样写的:

On success, the character written is returned.
If a writing error occurs, EOF is returned and the error indicator (ferror) is set.

大致意思就是:

如果写入成功,返回被写入的字符的ASCII码值
如果写入失败,返回EOF并设置错误提示符

例子:

#include<stdio.h>

int main()
{
	FILE* pf = fopen("text.txt", "w");//只写
	if (pf == NULL)
	{
		perror("fopen");//如果错误会在屏幕上打印错误原因
	}
	for (char c = 'A'; c <= 'Z'; c++)
	{
		fputc(c, pf);//将字符输入到文件中
	}
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

fgetc

从文件中读取一个字符

int fgetc(FILE* stream)

返回的是ASCII码值

关于fgetc的返回值cpp网站是这样写的

On success, the character read is returned (promoted to an int value).
The return type is int to accommodate for the special value EOF, which indicates failure:
If the position indicator was at the end-of-file, the function returns EOF and sets the eof indicator (feof) of stream.
If some other reading error happens, the function also returns EOF, but sets its error indicator (ferror) instead.

大致意思是:

如果读取成功,返回被读取字符的ASCII码值;
若读取失败或文件光标已经到了文件末尾(就是没字符可以读了),则会返回EOF

例子:

#include<stdio.h>
int main()
{
	FILE* pf = fopen("text.txt", "r");//只读
	if (pf == NULL)
	{
		perror("fopen");//如果错误会在屏幕上打印错误原因
	}
	int c;
	while ((c = fgetc(pf)) != EOF)
	{
		printf("%c ", c);
	}

	fclose(pf);
	pf = NULL;

	return 0;
}

在这里插入图片描述

fputs && fgets

fputs

将字符串输出到文件

int fputs ( const char * str, FILE * stream );

关于返回值

cpp网站是这样写的:

On success, a non-negative value is returned.
On error, the function returns EOF and sets the error indicator (ferror).

大致意思:

输出成功,返回一个非负数;
输出失败,返回EOF

例子:

#include<stdio.h>
int main()
{
	FILE* pf = fopen("text.txt", "w");//只写
	if (pf == NULL)
	{
		perror("fopen");//如果错误会在屏幕上打印错误原因
	}
	char str[100] = "Hello World";
	fputs(str, pf);//数组名是数组首元素地址
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

fgets

读取指定位置范围内的字符串

char * fgets ( char * str, int num, FILE * stream );

str:用于接收字符串
num:一次读num-1个字符(fgets会默认在第num处存放’\0’)

关于返回值
cpp网站是这样写的:

On success, the function returns str.
If the end-of-file is encountered while attempting to read a character, the eof indicator is set (feof). If this happens before any characters could be read, the pointer returned is a null pointer (and the contents of str remain unchanged).
If a read error occurs, the error indicator (ferror) is set and a null pointer is also returned (but the contents pointed by str may have changed).

大致意思就是:

读取成功,返回str的地址;
读取失败或文件已到末尾,返回NULL;

例子:

#include<stdio.h>
int main()
{
	FILE* pf = fopen("text.txt", "r");//只读
	if (pf == NULL)
	{
		perror("fopen");//如果错误会在屏幕上打印错误原因
		return;
	}
	char buf1[100] = { 0 };
	char* str1;
	str1 = fgets(buf1, 12, pf);//这是我明确知道文件有多少个元素
	printf("明确知道:");
	printf("%s", str1);

	printf("\n");
	rewind(pf);//将光标返回文件初始位置

	//假设我们不知道文件内有多少个元素
	char buf2[100] = { 0 };
	char* str2;

	printf("并不明确:");
	while ((str2 = fgets(buf2, 2, pf)) != NULL)
	{
		printf("%s", str2);
	}

	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

fprintf && fscanf

fprintf

将数据以格式化的形式输出到文件

int fprintf ( FILE * stream, const char * format, ... );

fprintfprintf很像,只是printf是输出到标准输出流(屏幕);而·printf是可以输出到指定输出流中

例子:

#include<stdio.h>
typedef struct st
{
	char _Name[20];
	int _Score;
	char _SId[17];
}Stu;

int main()
{
	Stu student = { "zhangsan" , 99, "202300002024" };
	FILE* pf = fopen("text.txt", "w");//只写
	if (pf == NULL)
	{
		perror("fopen");//如果错误会在屏幕上打印错误原因
	}

	fprintf(pf, "%s %d %s", student._Name, student._Score, student._SId);

	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

fscanf

从文件输出格式化的数据

int fscanf ( FILE * stream, const char * format, ... );

同理,fscanfscanf也是很相似的;只不过scanf是从标准输入流(键盘)得到数据,fscanf是从指定的输入流中得到数据

例子:

#include<stdio.h>
typedef struct st
{
	char _Name[20];
	int _Score;
	char _SId[17];
}Stu;

int main()
{
	FILE* pf = fopen("text.txt", "r");//只读
	if (pf == NULL)
	{
		perror("fopen");//如果错误会在屏幕上打印错误原因
	}
	Stu x = { 0 };
	fscanf(pf, "%s %d %s", x._Name, &(x._Score), x._SId);
	printf("%s %d %s", x._Name, x._Score, x._SId);

	fclose(pf);
	pf = NULL;

	return 0;
}

在这里插入图片描述
注意:上面的函数可以使用到任意的指定流中;
当然也要遵守语法:该是输出流给输出流,该是输入流给输入流

就拿fprintf举例

#include<stdio.h>
typedef struct st
{
	char _Name[20];
	int _Score;
	char _SId[17];
}Stu;
int main()
{
	Stu student = { "zhangsan" , 99, "202300002024" };
	FILE* pf = fopen("text.txt", "w");//只写
	if (pf == NULL)
	{
		perror("fopen");//如果错误会在屏幕上打印错误原因
	}

	fprintf(stdout, "%s %d %s", student._Name, student._Score, student._SId);
	//stdout是标准输出流

	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

fwrite && fread

这两个函数只能用文件流(也就是只能输入输出到文件)

fwrite

以二进制的形式输出数据到文件(只能输入到文件)

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

ptr->要输入的数据
size->数据的大小
count->数据的个数

例子:

#include<stdio/h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	FILE* pf = fopen("text.txt", "wb");//只写(以二进制形式)
	if (pf == NULL)
	{
		perror("fopen");//如果错误会在屏幕上打印错误原因
	}

	fwrite(arr, sizeof(arr[0]), 10, pf);

	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

fread

以二进制的形式从文件中读取数据

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

ptr->用于接收数据
size->数据的大小
count->数据的个数

关于返回值

cpp网站是这样写的

The total number of elements successfully read is returned.
If this number differs from the count parameter, either a reading error occurred or the end-of-file was reached while reading. In both cases, the proper indicator is set, which can be checked with ferror and feof, respectively.
If either size or count is zero, the function returns zero and both the stream state and the content pointed by ptr remain unchanged.
size_t is an unsigned integral type.

大致意思为:

如果读取成功,返回成功读取的元素个数。
如果这个数字与 count 参数不同,要么是发生了读取错误,要么是在读取过程中到达了文件终点。
如果 size 或 count 均为零,函数返回零,流状态和 ptr 指向的内容均保持不变。

例子:

#include<stdio.h>

int main()
{
	FILE* pf = fopen("text.txt", "rb");//只读(以二进制形式)
	if (pf == NULL)
	{
		perror("fopen");//如果错误会在屏幕上打印错误原因
	}
	int arr[10] = { 0 };
	fread(arr, sizeof(arr[0]), 10, pf);
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}

	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

文件的随机读写

fseek函数

根据文件指针的位置和偏移量来定位文件指针。

int fseek ( FILE * stream, long int offset, int origin );

偏移量

文件指针所指向的位置距离文件起始位置有多少个数据

文件起始位置有三种(下列表格在cpp网站的fseek函数中)

ConstantReference position
SEEK_SETBeginning of file
SEEK_CURCurrent position of the file pointer
SEEK_ENDEnd of file *

SEEK_SET:文件的开始位置
SEEK_CUR:文件指针当前的位置
SEEK_END:文件的末尾
如果fseek给的起始位置是SEEK_END,那么访问前面的元素,偏移量就要给负数

例子:

#include<stdio.h>
int main()
{
	FILE* pFile;
	pFile = fopen("text.txt", "w");
	fputs("This is an apple.", pFile);
	fseek(pFile, 9, SEEK_SET);
	fputs(" sam", pFile);
	fclose(pFile);
	return 0;
}

在这里插入图片描述
在这里插入图片描述
这是为什么呢?
我们来看图吧。
在这里插入图片描述

ftell函数

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

long int ftell ( FILE * stream );

例子:

#include<stdio.h>
int main()
{
	FILE* pf = fopen("text.txt", "r");//只读
	if (pf == NULL)
	{
		perror("fopen");//如果错误会在屏幕上打印错误原因
	}

	for (int i = 0; i < 5; i++)
	{
		fgetc(pf);
	}
	printf("偏移量为%d ",ftell(pf));
	fclose(pf);
	pf = NULL;

	return 0;
}

在这里插入图片描述

rewind函数

让文件指针返回到文件的起始位置

void rewind ( FILE * stream );

前面的例子也使用过:

#include<stdio.h>
int main()
{
	FILE* pf = fopen("text.txt", "r");//只读
	if (pf == NULL)
	{
		perror("fopen");//如果错误会在屏幕上打印错误原因
		return;
	}
	char buf1[100] = { 0 };
	char* str1;
	str1 = fgets(buf1, 18, pf);//这是我明确知道文件有多少个元素
	printf("明确知道:");
	printf("%s", str1);

	printf("\n");
	rewind(pf);//将光标返回文件初始位置

	//假设我们不知道文件内有多少个元素
	char buf2[100] = { 0 };
	char* str2;

	printf("并不明确:");
	while ((str2 = fgets(buf2, 2, pf)) != NULL)
	{
		printf("%s", str2);
	}

	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

文件的结束判断

被错误使用的feof

牢记:在文件读取的过程中,不能用feof函数的返回值来直接判断文件是否结束。
feof的作用是:当文件已经读取结束时,判断结束的原因是否为“遇到文件尾部结束”。

文本文件读取是否结束。判断返回值是否为EOF (fgetc),或NULL(fgets)。
二进制文件读取是否结束,判断返回值是否小于实际要读的数。

cpp的网站->https://cplusplus.com/

结语

最后感谢您能阅读完此片文章,如果有任何建议或纠正欢迎在评论区留言。如果您认为这篇文章对您有所收获,点一个小小的赞就是我创作的巨大动力,谢谢!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙开发接口Ability框架:【(StaticSubscriberExtensionAbility)】

StaticSubscriberExtensionAbility StaticSubscriberExtensionAbility模块提供静态订阅者扩展能力的类别的能力。 说明&#xff1a; 本模块首批接口从API version 9 开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 本模块接口仅可在Stage模型下…

多线程学习D10 收尾了应该

线程安全集合类概述 重点介绍java.util.concurrent.* 下的线程安全集合类&#xff0c;可以发现它们有规律&#xff0c;里面包含三类关键词&#xff1a;Blocking、CopyOnWrite、Concurrent Blocking 大部分实现基于锁&#xff0c;并提供用来阻塞的方法 CopyOnWrite 之类容器修改…

iOS 17 / iPad OS 17屏蔽更新

iOS 17 / iPad OS 17屏蔽更新 1&#xff0c;进入屏蔽iOS更新的描述文件下载链接 下载链接 wx 搜索 Geek 前端发送屏蔽更新进行获取 2&#xff0c;复制这段链接&#xff0c;在Safari浏览器中打开&#xff0c;注意打开后别点击下载&#xff01;要先改时间&#xff01; 3&#…

69、oak和华为atlas 200dk A2进行编解码测试

基本思想:将oak深度相机与atlas 200dk A2进行结合,测试其dvpp的编解码能力 cmakelist.txt cmake_minimum_required(VERSION 3.16) project(untitled10) set(CMAKE_CXX_FLAGS "-std=c++11") set(CMAKE_CXX_STANDARD 11) add_definitions(-DENABLE_DVPP_INTERFACE)i…

数据的输入和输出

早期的总线系统 为了解决通信的问题、主板上铺设了一条公共线路、各个设备都连接到这条线路上、不管谁要和谁通信、都能使用它来传输、这条线路就是总线。 总线上有CPU、内存、鼠标、键盘、硬盘、网卡、声卡、显卡等… 说是一条总线、实际上是包含了传输数据的数据总线、传输…

保研面试408复习 4——操作系统、计网

文章目录 1、操作系统一、文件系统中文件是如何组织的&#xff1f;二、文件的整体概述三、UNIX外存空闲空间管理 2、计算机网络一、CSMA/CD 协议&#xff08;数据链路层协议&#xff09;二、以太网MAC帧MTU 标记文字记忆&#xff0c;加粗文字注意&#xff0c;普通文字理解。 1、…

「C++ 内存管理篇 00」指针

目录 一、变量&#xff0c;变量名和指针 1. 什么是变量&#xff1f; 2. 变量名和指针 3. 使用指针获取数据 二、指针变量和数组变量 三、编译器对指针的等级有着严格的检查 四、指针的加减 1. 存放指针的变量的加减 2. 存放指针的变量的自增自减 3. 两个指针相减 一、变量&…

融知财经:期货交易的规则和操作方法

期货交易是指在未来的某一特定时期&#xff0c;买卖双方通过签订合约的方式&#xff0c;约定以某种价格买卖一定数量的某种商品或资产的行为。期货交易的规则和操作方法如下&#xff1a; 期货交易的规则和操作方法 1、双向交易&#xff1a; 期货市场允许投资者进行多头&#xf…

数据结构_栈和队列(Stack Queue)

✨✨所属专栏&#xff1a;数据结构✨✨ ✨✨作者主页&#xff1a;嶔某✨✨ 栈&#xff1a; 代码&#xff1a;function/数据结构_栈/stack.c 钦某/c-language-learning - 码云 - 开源中国 (gitee.com)https://gitee.com/wang-qin928/c-language-learning/blob/master/function/…

实战教程:个性化生鲜超市小程序制作与运营全解析

生鲜电商行业一直以来都备受关注&#xff0c;而如今&#xff0c;小程序商城成为了这个行业的新潮流。乔拓云平台提供了一个便捷的平台&#xff0c;让我们可以轻松地进入商城后台管理页面。 浏览器搜索【乔拓云】并登陆平台后&#xff0c;我们可以点击【小程序商城】模块&#x…

Redis学习汇总

目录 1.Linux环境下安装redis 2.redis的数据结构及命令 3.redis.conf配置文件常用配置 3.redis的事务操作 4.redis实现乐观锁 5.通过jedis操作redis 6.Springboot集成redis 7.自定义一个RedisTemplate 8.持久化策略 RDB和AOF 9.redis集群环境搭建 10.哨兵模式 11.缓…

Langchain实战

感谢阅读 LangChain介绍百度文心API申请申请百度智能云创建应用 LLMChain demo以及伪幻觉问题多轮对话的实现Sequential ChainsSimpleSequentialChainSequentialChainRouter Chain Documents ChainStuffDocumentsChainRefineDocumentsChainMapReduceDocumentsChainMapRerankDoc…

第09章 局域网技术(拓扑结构设计+FDDI工作机制)

9.1 本章目标 了解IEEE 802局域网标准掌握局域网拓扑结构了解10Base以太网了解快速以太网熟悉交换式以太网了解千兆位以太网了解其它种类的局域网局域网中的常用技术 9.2 局域网概述 罗伯特梅特卡夫个人简介 罗伯特梅特卡夫&#xff08;Robert Metcalfe&#xff0c;1…

第五节课《LMDeploy 量化部署 LLM 实践》

LMDeploy 量化部署 LLM-VLM 实践_哔哩哔哩_bilibili PDF链接&#xff1a;https://pan.baidu.com/s/1JFtvBWgEGFWJq8pHafvIUg?pwd6666 提取码&#xff1a;6666 https://github.com/InternLM/Tutorial/blob/camp2/lmdeploy/README.md 一、大模型部署背景 RAG范式开发大模型…

neo4j-5.11.0安装APOC插件or配置允许使用过程的权限

在已经安装好neo4j和jdk的情况下安装apoc组件&#xff0c;之前使用neo4j-community-4.4.30&#xff0c;可以找到配置apoc-4.4.0.22-all.jar&#xff0c;但是高版本neo4j对应没有apoc-X.X.X-all.jar。解决如下所示&#xff1a; 1.安装好JDK与neo4j 已经安装对应版本的JDK 17.0…

ABAP 第二代增强-采购申请子屏幕增强

文章目录 第二代增强-采购申请子屏幕增强需求实现过程创建项目运行效果客户屏幕的PBO全局变量获取数据更新数据运行效果查询底表修改数据 第二代增强-采购申请子屏幕增强 需求 实现过程 创建项目 运行效果 客户屏幕的PBO 全局变量 *&------------------------------------…

点击短信链接唤起Android App实战

一.概述 在很多业务场景中,需要点击短信链接跳转到App的指定页面。在Android系统中,想要实现这个功能,可以通过DeepLink或AppLink实现。二.方案 2.1 DeepLink 2.1.1 方案效果 DeepLink是Android系统最基础、最普遍、最广泛的外部唤起App的方式,不受系统版本限制。当用户…

《21天学通C++》(第二十章)STL映射类(map和multimap)

为什么需要map和multimap&#xff1a; 1.查找高效&#xff1a; 映射类允许通过键快速查找对应的值&#xff0c;这对于需要频繁查找特定元素的场景非常适合。 2.自动排序&#xff1a; 会自动根据键的顺序对元素进行排序 3.多级映射&#xff1a; 映射类可以嵌套使用&#xff0c;创…

typescript类型基础

typescript类型基础 枚举类型 enum Season {Spring,Summer,Fall,Winter }数值型枚举 enum Direction {Up,Down,Left,Right } const direction:Direction Direction.up每个数值型枚举成员都表示一个具体的数字&#xff0c;如果在定义一个枚举的时候没有设置枚举成员的值&…

5款智能写作工具,为大家一键生成原创文案

好的文案是能吸引眼球、传递信息&#xff0c;但对于许多人来说&#xff0c;写出好文案是一项耗时耗力的任务。而随着一些智能写作工具的出现&#xff0c;它为我们带来了很大的便利&#xff0c;无论是写作文案还是写作其它的内容&#xff0c;智能写作工具都能轻松帮助我们完成。…
最新文章