C/C++文件操作(细节满满,part2)

news2025/7/16 0:20:43

该文章上一篇:C/C++文件操作(细节满满,part1)_仍有未知等待探索的博客-CSDN博客

个人主页:仍有未知等待探索_C语言疑难,数据结构,小项目-CSDN博客

专题分栏:C语言疑难_仍有未知等待探索的博客-CSDN博客

目录

 

一、引言

二、文件的顺序

1、输入流和输出流

2、fputc

1.功能

2. 参数

3.用法

4.注意 

3、fgetc

1.功能 

2.参数

3.用法

4、fputs 

1、功能 

2、参数

3、用法

5、fgets 

​编辑 1、功能 

2、参数

3、用法

4、注意 

6、fprintf

1、功能 

2、参数

3、用法 

7、fscanf 

1、功能

2、参数

3、 用法

8、fwrite

​编辑

1、功能

2、参数

3、用法

4、注意 

9、fread 

1、功能

2、参数

3、用法

4、注意 

三、文件的随机读写

1、fseek

2、ftell 

3、rewind 

四、二进制文件和文本文件

五、文件读取结束的标志

1、文本文件读取结束标志

2、二进制文件读取结束标志

六、文件缓冲区


 

一、引言

通过上篇文章,已经了解了什么是文件打开和关闭文件的操作流的概念等。

如果对于上述的内容感到有点陌生了,不妨去看一看,文章链接在开头。

这篇文章的内容将会包含写文件的基本操作。

文件的顺序读写:是每次从第一个字符开始读和写。

文件的随机读写:是每次可以从任意一个位置读和写。

二、文件的顺序

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

1、输入流和输出流

流相当于是一个过渡的过程。怎么判上述函数是输入流还是输出流呢?

我们可以站在内存的视角来看,如果是数据流向内存,我们就可以看作是输入流。反之,则是输出流。

就以fgetc和fputc为例:

2、fputc

1.功能

将一个字符character写进stream流中。

2. 参数

character:字符(字符的本质就是ASCII码值,是整数)。

stream:文件指针。

3.用法

#include<stdio.h>
int main()
{
    //以‘只写’的方式打开文件
	FILE* pf = fopen("test.txt", "w");
    if (pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	//处理
	//输入
	for (int i = 'a'; i <= 'z'; i++)
		fputc(i, pf);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

4.注意 

用什么方式打开文件就只能完成该功能。就比如说,以‘只写’的方式打开文件,就不能进行读取操作。

如果对于打开方式模糊了,请点击下面链接,查看上一篇的内容:

C/C++文件操作(细节满满,part1)_仍有未知等待探索的博客-CSDN博客

3、fgetc

1.功能 

 从stream流中获取数据。

2.参数

文件指针类型的stream流。

3.用法

如果获取失败,函数将返回EOF

//以‘只读’的方式打开文件
	FILE* pf = fopen("test.txt", "r");
    if (pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	//处理
	//输出
	int ch;
	while((ch=fgetc(pf))!=EOF)
    {
        printf("%c ",ch);
    }
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

4、fputs 

1、功能 

将一个字符串写入流中。

2、参数

str:需要写入文件的参数。

stream:文件流。

3、用法

如果没有‘\n’的话,他会把数据输入在一行。 

如果把文件指针pf换成stdout的话,程序会把数据打印在屏幕上。

#include<stdio.h>
int main()
{
	//以‘只写’的方式打开文件
	FILE* pf = fopen("test.txt", "w");
    if (pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	//处理
	fputs("abcd", pf);//不换行写法
	fputs("abcd\n", pf);//换行写法
    fputs("abcd", stdout);//将数据打印在屏幕上
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

5、fgets 

 1、功能 

从流中获取字符串。

2、参数

str:字符串。

num:读取的个数。

stream:文件流。

3、用法

如果获取失败,函数将返回EOF

#include<stdio.h>
int main()
{
	//以‘只读’的方式打开文件
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	//处理
	char str[20];
	fgets(str, 10, pf);
	printf("%s", str);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

4、注意 

  1. 函数最多只会读取一行的数据。
  2. 当数据足够多时,参数为num,函数只会读取num-1个数据。

6、fprintf

1、功能 

将格式化数据写入文件流中。

2、参数

通过将fprintf和printf的参数相比较,会发现,fprintf的参数就比printf的参数多了一个文件指针。 

3、用法 

#include<stdio.h>
struct S
{
	float f;
	char ch;
	int n;
};
int main()
{
	struct S s = { 4.14f,'w',1 };
	//以‘只 写’的方式打开文件
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	//处理
	printf("%f %c %d\n", s.f, s.ch, s.n);
	fprintf(pf,"%f %c %d\n", s.f, s.ch, s.n);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

7、fscanf 

1、功能

从流中读取数据。

2、参数

fscanf和scanf的参数差不多,多了一个文件流stream。

3、 用法

#include<stdio.h>
struct S
{
	float f;
	char ch;
	int n;
};
int main()
{
	struct S s = { 4.14f,'r',1 };
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	//处理
	fscanf(pf, "%f %c %d", &(s.f), &(s.ch), &(s.n));
	printf("%f %c %d", s.f, s.ch, s.n);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

8、fwrite

1、功能

将ptr中的数据写入流中,大小为size,个数为count。

2、参数

ptr:指向要写入文件流中的数据的指针。

size:每个数据的大小。

count:数据个数。

stream:要写入的文件流中。

3、用法

#include<stdio.h>
int main()
{
	FILE* pf = fopen("test.txt", "wb");//abcdef
	if (pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	//处理
	char str[] = "abcd";
	fwrite(str, sizeof(char), sizeof(str) / sizeof(str[0]), pf);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

4、注意 

文件的打开方式要和函数匹配,要用二进制的写的方式

9、fread 

1、功能

从文件流中读取数据。

2、参数

ptr:指向文件流中的数据所要存到的位置的指针。

size:每个数据的大小。

count:数据个数。

stream:文件流。

3、用法

#include<stdio.h>
int main()
{
	FILE* pf = fopen("test.txt", "rb");//abcdef
	if (pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	//处理
	char str[20];
	fread(str, sizeof(char), sizeof(str) / sizeof(str[0]), pf);
	printf("%s", str);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

4、注意 

文件的打开方式要和函数匹配,要用二进制的读的方式

三、文件的随机读写

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

文件指针当前位置
SEEK_SETBeginning of file
SEEK_ENDCurrent position of the file pointer
SEEK_CUREnd of file

1、fseek

 功能是改变文件指针的位置。

#include<stdio.h>
int main()
{
	FILE* pf = fopen("test.txt", "r");//abcdef
	if (pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	//处理
	int ch;
	ch = fgetc(pf);//a
	printf("%c\n", ch);
	ch = fgetc(pf);//b
	printf("%c\n", ch);
	ch = fgetc(pf);//c
	printf("%c\n", ch);
	fseek(pf, -1, SEEK_CUR);
	ch = fgetc(pf);
	printf("%c\n", ch);//c
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

2、ftell 

功能是返回文件当前指针的偏移量。

#include<stdio.h>
int main()
{
	FILE* pf = fopen("test.txt", "r");//abcdef
	if (pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	//处理
	int ch;
	ch = fgetc(pf);//a
	printf("%c\n", ch);
	ch = fgetc(pf);//b
	printf("%c\n", ch);
	ch = fgetc(pf);//c
	printf("%c\n", ch);
	int pos = ftell(pf);
	printf("%d", pos);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

3、rewind 

功能是将文件指针返回起始位置。

#include<stdio.h>
int main()
{
	FILE* pf = fopen("test.txt", "r");//abcdef
	if (pf == NULL)
	{
		perror("fopen");
		return 0;
	}
	//处理
	int ch;
	ch = fgetc(pf);//a
	ch = fgetc(pf);//b
	ch = fgetc(pf);//c
	int pos = ftell(pf);
	printf("%d\n", pos);
	rewind(pf);
	pos = ftell(pf);
	printf("%d", pos);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

四、二进制文件和文本文件

根据数据的存储形式,文件可以分为二进制文件和文本文件。

数据在文件中以二进制存储,就是二进制文件。

数据在文件中以ASCII码值存储,就是文本文件。

五、文件读取结束的标志

在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。

1、文本文件读取结束标志

fgetc——判断是否为EOF

fgets——判断是否为NULL

2、二进制文件读取结束标志

fread——判断返回值是否小于实际要读的个数。

六、文件缓冲区

谢谢大家支持! 

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

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

相关文章

AGI 黑客松收官,Zilliz 向量数据库助力34支参赛队伍角逐大模型时代的Killer App

紧张的 72 小时、34 组 AGI 前沿玩家、天马行空的创意、一场酣畅淋漓的黑客松比赛&#xff01; 近期&#xff0c;由 Zilliz、Founder Park、智谱 AI 联合主办的 AGI Playground Hackathon 在北京圆满落幕。作为此次大赛的主办方之一&#xff0c;Zilliz 为选手提供了开箱即用的向…

Tuxera NTFS2024Mac电脑磁盘读写工具

NTFS是一种广泛用于Windows系统的文件系统&#xff0c;但是如果你想在Mac系统中读写NTFS格式的硬盘或U盘&#xff0c;你会发现Mac系统并不支持NTFS读写。这时&#xff0c;NTFS for Mac就变得非常有用了。本文将介绍NTFS for Mac有什么用&#xff0c;NTFS for Mac怎么用。 一、…

Java8实战-总结42

Java8实战-总结42 用Optional取代null应用 Optional 的几种模式默认行为及解引用 Optional 对象两个 Optional 对象的组合使用 filter 剔除特定的值 用Optional取代null 应用 Optional 的几种模式 默认行为及解引用 Optional 对象 采用orElse方法读取这个变量的值&#xff0…

接口自动化测试持续集成,Soapui接口功能测试参数化

按照自动化测试分层实现的原理&#xff0c;每一层的脚本实现都要进行参数化&#xff0c;自动化的目标就是要实现脚本代码与测试数据分离。当测试数据进行调整的时候不会对脚本的实现带来震荡&#xff0c;从而提高脚本的稳定性与灵活度&#xff0c;降低脚本的维护成本。Soapui最…

手撕Vue-编译指令数据

经过上一篇的分析&#xff0c;完成了查找指令和模板的功能&#xff0c;接下来就是编译指令的数据了。 所以本章节主要处理的方法则是 buildElement 方法&#xff0c;我们先分析一下我们所拿到的数据在进行编码&#xff0c;这样会更加清晰一些。 我将 name, value 打印出来&…

常规动态网页爬取

1.抓取动态网页“http://www.ptpress.com.cn”内容&#xff0c;将新书推荐中生活板块的书籍书名、价格和作者爬取并保存。 import requests import json import openpyxlurl https://www.ptpress.com.cn/recommendBook/getRecommendBookListForPortal?bookTagIdd5cbb56d-09ef…

Linux友人帐之Emacs文本编译器

一、概述 Emacs是一款功能强大、可定制、可扩展的文本编辑器&#xff0c;可以用于各种用途&#xff0c;如编程、文档处理和配置文件编辑。 安装 sudo yum install emacs 二、基础入门 2.1emacs基本文件操作 emacs -nw命令 emacs -nw命令是在终端中以无界面&#xff08;非图…

CANoe.Diva配置模板的使用

文章目录 前言一、CDD导入二、保存配置三、使用配置模板 前言 DiVa 是一种 CANoe 选项&#xff0c;用于对 ECU 中的诊断软件实施进行自动化测试。 可以通过CDD文件自动生成测试用例&#xff0c; CANoe 自动执行这些测试用例并生成结论性测试报告。 一、CDD导入 在新建Diva工程…

解决QT中文乱码

选中文本带有中文字符的文件&#xff0c;然后按如下点击 弹出对话框&#xff0c;选择当前操作系统的编码格式&#xff0c;选择Save with Encoding 中文字符前用u8进行标识

【知识】超详细! 论文相关知识科普大全

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] CSDN上粘贴有点问题&#xff0c;请前往原文查看&#xff0c;以便点击链接&#xff1a; 【知识】超详细! 论文相关知识科普大全 - 小锋学长生活大爆炸

C++数据结构X篇_16_二叉树的拷贝和释放(采用递归的方法)

在上篇的基础上&#xff0c;本篇介绍如何进行二叉树的拷贝和释放。从代码中可以看到采用递归方式进行的拷贝、释放操作&#xff0c;基本套路都是一样的。 文章目录 1. 二叉树的拷贝2. 二叉树的释放 1. 二叉树的拷贝 #include <iostream> using namespace std;//定义二叉…

美国经济危机历史与展望

目录 美国一战靠做两边的军火生意快速成长 门罗主义 咆哮的二十年 经济繁荣发展 经济大衰退前期 当时美国发生经济危机的时候&#xff0c;为什么很多乳制品加工商宁愿把牛奶导入河中&#xff0c;也不卖&#xff0c;为了保持商品的价值&#xff0c;为什么不能贱卖呢&#xf…

Linux性能优化--性能追踪2:延迟敏感的应用程序

11.0 概述 本章包含了一个例子&#xff1a;如何用Linux性能工具在延迟敏感的应用程序中寻找并修复性能问题。 阅读本章后&#xff0c;你将能够&#xff1a; 在延迟敏感的应用程序中用ltrace和oprofile弄清楚哪里产生了延迟。对“热点”函数的每个调用&#xff0c;用gdb生成栈…

spring java 动态获取consul K/V

spring java 动态获取consul K/V 1.springConsul配置kv路径 spring:cloud:consul:enabled: ${CONSUL_ENABLED:true}host: ${CONSUL_HOST:localhost}port: ${CONSUL_PORT:8500}config:prefix: ${CONSUL_CONFIG_PREFIX:config} #consul kv前缀fail-fast: ${CONFIG_FAIL_FAST:fa…

优秀案例 | 以虚拟人IP“科普熊猫”,为2023成都市全国科普日注入新活力

成都科普IP | 全国首个科普数字虚拟形象大使 虚拟人IP“科普熊猫” 2023成都市全国科普日启动仪式上&#xff0c;成都市科学技术协会现场发布了成都市科普熊猫数字虚拟形象大使——虚拟人“科科”。在2023成都世界科幻大会即将召开之际&#xff0c;结合了3D动作捕捉技术以及AR技…

【Java 进阶篇】JavaScript DOM Element 对象详解

JavaScript是一门广泛用于网页开发的脚本语言&#xff0c;而DOM&#xff08;文档对象模型&#xff09;是JavaScript在网页中操作HTML和XML文档的核心。DOM以树状结构表示文档&#xff0c;允许开发者以编程方式访问、操作和修改文档的内容和结构。在DOM中&#xff0c;Element对象…

MySQL查询优化看一篇就够了

关联查询优化 数据准备 #分类 CREATE TABLE IF NOT EXISTS type( id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, card INT(10) UNSIGNED NOT NULL, PRIMARY KEY ( id ) );#图书 CREATE TABLE IF NOT EXISTS book(bookid INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,cardINT(10…

从自动化到测开,测试人员逆袭之路从此起步

在当今竞争激烈的软件测试行业中&#xff0c;近期的招聘市场确实面临一些挑战。大量的求职者争相涌入岗位&#xff0c;许多热衷于功能测试的人士甚至难以找到理想的工作机会。更不幸的是&#xff0c;连自动化测试和性能测试这些专业领域也受到了测试开发人员的竞争压力。然而&a…

Springboot 启动报错@spring.active@解析错误

Caused by: org.yaml.snakeyaml.scanner.ScannerException: while scanning for the next token found character that cannot start any token. (Do not use for indentation)in reader, line 10, column 13:active: spring.active^查看是否勾选

uni-app--》基于小程序开发的电商平台项目实战(六)

&#x1f3cd;️作者简介&#xff1a;大家好&#xff0c;我是亦世凡华、渴望知识储备自己的一名在校大学生 &#x1f6f5;个人主页&#xff1a;亦世凡华、 &#x1f6fa;系列专栏&#xff1a;uni-app &#x1f6b2;座右铭&#xff1a;人生亦可燃烧&#xff0c;亦可腐败&#xf…