C/C++读写文件和stringstream类

news2024/9/22 21:25:57

目录

  • C处理文件
    • 打开文件
      • 两种函数的区别
    • 读文件
      • 两种函数区别
      • 其它读操作的函数
        • fgetc:从文件中读取一个字符
        • fgets:从文件中读取一个字符串
        • fscanf:按格式从文件中读取指定内容,与scanf函数类似
    • 写文件
      • 其它的常用写操作函数
        • fputc:向文件中写入一个字符
        • fputs:向文件中写入一个字符串
        • fprintf:向文件中写入指定格式字符串,与pritnf函数类似
    • 关闭文件
  • C++处理文件
    • 通用类
  • sstream
    • 功能和用途
      • 可以把字符串根据空格分开
      • 多个字符串拼接
      • 用来string<-->int转换
      • stringstream的清空
        • clear() 方法
        • str("") 方法
      • 其他一些用法

本文主要详解C/C++对文件的所有常见方法汇总以及stringstream类用法

C处理文件

头文件

#include<cstdio> //或者#include<stdio.h>均可

注意:
C语言库中的函数,很多都存在安全隐患,就会存在一个相应的安全函数,一般对应的安全函数名称都是在原函数后添加_s后缀

相比较而言,安全函数会比标准函数使用更繁琐,所以很多情况下我们会习惯于使用标准函数,
但在VS环境下直接使用不安全的函数,会直接报错,编译无法通过,此时就必须要定义对应的宏才能正常使用
而安全函数则无需定义任何宏,可直接使用。

打开文件

//标准函数:
FILE* fopen(
const char * _FileName,//要打开的文件名,不指定路径,则在当前文件夹找
const char * _Mode //打开的模式 读r 写w 或追加a
);
//返回值:打开失败返回NULL,打开成功则返回指向文件的标识符

//安全函数
 errno_t fopen_s(
FILE**      _Stream, //保存打开文件后的标识符
const char * _FileName, //要打开的文件名,不指定路径,则在当前文件夹找
const char * _Mode //打开的模式 读r 写w 或追加a
            );
 //返回值:打开成功返回0,打开失败则返回对应错误代码	

在这里插入图片描述

两种函数的区别

#define _CRT_SECURE_NO_WARNINGS //vs环境下,必须定义该宏,否则报错
#include<cstdio>
using namespace std;
int main() {
	FILE* file = fopen("1.txt","r"); //以读的方式打开文件
	if (file == NULL) { //file为NULL,则打开文件失败,退出程序
		return -1;
	}
}
#include<cstdio>
using namespace std;
int main() {
	FILE* file;
	errno_t err=fopen_s(&file,"1.txt","r"); //以读的方式打开文件
	if (err != 0) { //err不为0,则打开文件失败,退出程序
		return -1;
	}
}

读文件

//标准函数:
size_t  fread(
void*  _Buffer, //读取到的内容存放空间
size_t _ElementSize, //每次读多少个字节
size_t _ElementCount, //读多少次
FILE*  _Stream //文件标识符
);
//返回值:实际读取的次数,注意,实际的取得字节数应该是该返回值和_ElementSize参数相乘,所以一般_ElementSize参数填1

//安全函数:
size_t fread_s(
void*  _Buffer,//读取到的内容存放空间
size_t _BufferSize, //第一个参数指示的缓存区大小
size_t _ElementSize,//每次读多少个字节
size_t _ElementCount,//读多少次
FILE*  _Stream //文件标识符
);
//返回值:实际读取的次数,注意,实际的取得字节数应该是该返回值和_ElementSize参数相乘,所以一般_ElementSize参数填1

注意:
在C和C++中,字符串的结束标志是空字符\0。当使用fread函数从文件中读取数据时,fread不会自动在缓冲区的末尾添加空字符。因此,需要手动添加一个空字符作为字符串的结束标志。

两种函数区别

在这里插入图片描述

#include<cstdio>
using namespace std;
int main() {
	FILE* file;
	errno_t err=fopen_s(&file,"1.txt","r"); //以读的方式打开文件
	if (err != 0) { //err不为0,则打开文件失败,退出程序
		return -1;
	}
	char buf[0xFF];  //定义存放读取内容的缓存区
	size_t size=fread_s(buf,sizeof(buf),1,100,file);//每次读一个字节,读100次
}

其它读操作的函数

fgetc:从文件中读取一个字符
int fgetc(
FILE* _Stream //文件标识符
);
//返回值:返回读取到的一个字符
#define _CRT_SECURE_NO_WARNINGS //vs环境下必须定义该宏,否则报错
#include<cstdio>
using namespace std;
int main() {
	FILE* file = fopen("1.txt","r"); //已只读方式打开
	if (file == NULL) {  //打开失败直接返回
		return -1;
	}
	char c=fgetc(file); //读取一个字符
}
fgets:从文件中读取一个字符串
char* __cdecl fgets(
char* _Buffer, //存放读到的字符缓冲区
 int   _MaxCount, //该缓存区的大小
FILE* _Stream //文件标识符
);
//返回值:成功为_Buffer指针,失败为NULL

在这里插入图片描述

fscanf:按格式从文件中读取指定内容,与scanf函数类似
int fscanf(
 FILE*       const _Stream,//文件标识符
 char const* const _Format, //指定读取格式,与printf格式相同
        ... //存放读取内容的缓存区
)

注意:
在C语言中,fscanf函数需要变量的地址作为参数,以便它能将读取到的值存储在这些变量中。

在这里插入图片描述

写文件

size_t fwrite(
void const* _Buffer, //要写入的内容
size_t _ElementSize, //元素大小
size_t  _ElementCount, //元素个数
FILE*   _Stream //文件标识
 );

该函数无安全函数。
在这里插入图片描述

其它的常用写操作函数

fputc:向文件中写入一个字符
int  fputc(
int   _Character,//要写入的字符
FILE* _Stream //文件标识符
);
#include<cstdio>
using namespace std;
int main() {
	FILE* file;
	errno_t err=fopen_s(&file,"1.txt","w");
	if (err != 0) {
		return -1;
	}
	int ret=fputc('c',file);//向file标识的文件写入一个c字符
}
fputs:向文件中写入一个字符串
int fputs(
char const* _Buffer,//要写入的内容
FILE* _Stream //文件标识符
);

在这里插入图片描述

fprintf:向文件中写入指定格式字符串,与pritnf函数类似
int fprintf(
 FILE* _Stream, //文件标识符
char const* const _Format, //写入格式 与printf使用方式相同
        ...
)

在这里插入图片描述

关闭文件

int fclose(
FILE* _Stream //文件标识符
);
#include<cstdio>
using namespace std;
int main() {
	FILE* file;
	errno_t err=fopen_s(&file,"1.txt","w");
	if (err != 0) {
		return -1;
	}
	fclose(file);//关闭文件
}

C++处理文件

通用类

头文件:

#include<fstream> //处理文件的头文件
using namespace std; //引用该命名空间,不引用将必须使用std::fstring 的方式使用该类

注意:
使用sizeof(buf)来确定写入文件的字节数可能导致乱码。sizeof操作符返回的是整个数组的大小,包括了字符串的结尾空字符\0。
要解决这个问题,可以通过使用strlen函数(而不是sizeof)来完成,strlen返回的是字符串的实际长度,不包括结尾的空字符。

在这里插入图片描述

模式选择:
在这里插入图片描述

sstream

<sstream>库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。它特别有用于处理复杂的字符串操作,比如当你需要从字符串中提取或向字符串中插入多种不同类型的数据时。它还为字符串和其他基本数据类型之间的转换提供了便捷的方法,这在进行数据处理和格式化时尤其有用。本文主要介绍一些实用用法。

istringstream类用于执行C++风格的串流的输入操作。
ostringstream类用于执行C风格的串流的输出操作。
stringstream类同时可以支持C/C++风格的串流的输入输出操作。

功能和用途

1.字符串拼接和分割:可以轻松地读取或写入变量,就像使用cin或cout那样,从而允许你进行复杂的字符串拼接和分割操作。
2.类型转换:stringstream可以方便地在字符串和其他数据类型(如int、float等)之间转换。
3.格式化字符串:可以用来格式化字符串数据,进行复杂的操作,比如插入特定格式的数据。

可以把字符串根据空格分开

在这里插入图片描述

多个字符串拼接

在这里插入图片描述

用来string<–>int转换

在这里插入图片描述
在这里插入图片描述

stringstream的清空

clear() 方法

用途:clear() 方法用于重置stringstream对象的状态标志(如错误标志),而不是清空其中的内容。这对于重新使用相同的stringstream对象进行新的输入/输出操作非常有用。
功能:它会将stringstream的状态设置回goodbit状态(即无错误状态)。如果之前的操作(例如读取或写入)在stringstream上设置了错误标志(如eofbit, failbit, badbit),clear()会清除这些标志,使对象可以再次正常使用。

str(“”) 方法

用途:str(“”) 方法用于设置stringstream对象的内部字符串。当使用空字符串""作为参数时,它实际上清空了stringstream中的内容。
功能:它不影响stringstream的状态标志,仅更改其存储的字符串内容。如果你想重新使用stringstream对象并需要清除之前存储的数据,这个方法会很有用。
在这里插入图片描述
当执行sstream >> first;后,由于已经读取到流的末尾,stringstream的内部状态将设置eofbit(表示已到达流的末尾)。这意味着流已经处于一种“用完”的状态。
如果接下来再尝试往这个stringstream对象写入新的数据(如sstream << true;),并尝试读取(如sstream >> second;),由于流的状态仍然是eofbit,这个写入操作将无法正确执行,导致接下来的读取操作也无法正常进行。
因此,在进行多次读写之前,需要使用clear()方法来重置流的状态。clear()方法会清除流的状态标志(包括eofbit),使流可以再次用于读写操作。

正确的做法是,在每次读写操作完成后使用clear()方法重置流的状态,特别是在读取到流的末尾后。这样可以确保流处于一个干净的状态,准备好进行下一次读写操作。

其他一些用法

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【LeetCode-135】分发糖果(贪心)

LeetCode135.分发糖果 题目描述 老师想给孩子们分发糖果&#xff0c;有 N 个孩子站成了一条直线&#xff0c;老师会根据每个孩子的表现&#xff0c;预先给他们评分。 你需要按照以下要求&#xff0c;帮助老师给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。…

js中找出两个数组中不同的元素

文章目录 一、题目二、方法2.1、方法一2.2、方法二2.3、方法三 三、最后 一、题目 两个数组 var A [1, 5, 6]; var B [2, 6, 7]&#xff0c;实现一个方法&#xff0c;找出仅存在于A 或者仅存在于B中的所有数字 二、方法 2.1、方法一 const filterArr (arr1, arr2) > …

5大免费代理IP合集,你的代理IP该换啦!

一连代理 代理IP提供平台&#xff0c;代理IP覆盖HTTP/HTTPS/SOCKS5协议&#xff0c;涵盖直连和隧道代理。一键操作可以随机更换IP&#xff0c;实现高效稳定的网络代理。支持在PC、iOS和安卓等平台上使用。当前免费试用选项&#xff0c;让用户能够在使用之前先了解服务的性能和效…

归并排序模板

模板在文末&#xff0c;以下步骤方便理解记忆。 先贴一张快速排序模板步骤&#xff0c;用于对比记忆 归并排序步骤&#xff1a; &#xff08;0&#xff09;如果数组左边界L ≥ 数组右边界&#xff0c;则不需要排序&#xff0c;直接return。 &#xff08;1&#xff09;直接取…

力扣第92题——反转链表 II(C语言题解)

题目描述 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left 2, right 4 输出&#xff1…

成绩等级分数段查询(python条件分支语句match...case...)

根据有效分数序列及等级差值&#xff0c;计算并打印等级相应分数区间。 (笔记模板由python脚本于2024年01月20日 23:57:32创建&#xff0c;本篇笔记适合会条件分支语句的初学者的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&…

python:socket基础操作(2)-《udp发送信息》

基础发送udp信息 1.导入socket模块 2.使用udp模块 3.发送内容 4.关闭套接字 很简单的4步就可以实现udp的消息发送 import socket # 导入模块udp_socket socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 使用ipv4 udp协议udp_socket.sendto(b"hello world",(&…

翻毛皮鞋脏了不会清洗怎么办?资深劳保鞋厂家来教你

劳保鞋皮面材质中除了常见的牛皮材质&#xff0c;翻毛皮也是频繁使用的材料&#xff0c;材质不同&#xff0c;在养护上也有区别&#xff0c;今天百华小编来和大家聊聊翻毛皮材质的鞋子清洁方法。 翻毛皮鞋清洗前的准备工作 1.除灰&#xff1a;对于表面灰尘&#xff0c;可以使用…

C语言第六弹---分支语句(下)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 分支语句 1、 逻辑操作符&#xff1a;&& , || , &#xff01;4.1、 逻辑取反运算符 &#xff01;4.2、 与运算符4.3、 或运算符4.4、 练习&#xff1a;闰…

磁悬浮人工心脏的不良事件分析:美国FDA数据库的启示

引言&#xff1a; 左心室辅助装置&#xff08;LVAD&#xff09;是治疗末期难治性心力衰竭&#xff08;HF&#xff09;患者的有效手段。磁悬浮人工心脏HeartMate-3&#xff08;磁悬浮人工心脏&#xff09;作为第三代LVAD&#xff0c;自2017年获得美国食品药品监督管理局&#x…

pygame入门学习(四)位图的使用

大家好&#xff01;我是码银&#x1f970; 欢迎关注&#x1f970;&#xff1a; CSDN&#xff1a;码银 公众号&#xff1a;码银学编程 载入图片 pygame.image.load( )&#xff0c;Pygame 可以通过pygame.image.load( )函数处理位图文件。 大致可以支持以下文件&#xff1a;JPG…

怎么给wordpress网站底部页脚添加备案号和链接?

以前“WordPress后台 >> 常规”最底部是有一个ICP备案号的&#xff0c;我们只需要填写备案号并保存更改即可让WordPress自带主题底部显示ICP备案号&#xff0c;但是现在新版本的WordPress已经没有了这个ICP备案号选项&#xff0c;而且也无法直接添加公安联网备案号&#…

前端基于XLSX实现数据导出到Excel表格,以及提示“文件已经被损坏,无法打开”的解决方法

文章目录 一、vue实现导出excel1、前端实现1、安装xlsx依赖2、引入3、方法4、使用4.1、将一个二维数组转成sheet4.2、将一个对象数组转成sheet4.3、合并单元格4.4、一次导出多个sheet 5、支持的文件格式 2、后端实现 二、导出文件损坏1、前端请求导出接口&#xff0c;增加返回类…

对称二叉树,力扣

题目地址&#xff1a; 101. 对称二叉树 - 力扣&#xff08;LeetCode&#xff09; 难度&#xff1a;简单 今天刷对称二叉树&#xff0c;大家有兴趣可以点上面链接&#xff0c;看看题目要求&#xff0c;试着做一下。 题目&#xff1a; 给你一个二叉树的根节点 root &#xff0c;…

区块链社交:Facebook在去中心化时代的探索

随着区块链技术的崛起&#xff0c;数字社交领域也正迎来一场革命。Facebook&#xff0c;作为全球最大的社交媒体平台之一&#xff0c;不甘落后&#xff0c;积极探索区块链的应用前景。本文将深入探讨Facebook在去中心化时代对区块链社交的探索&#xff0c;以及这一探索可能引发…

控制项目进展

优质博文 IT-BLOG-CN 假如一个项目准备工作做的非常周详&#xff0c;现在要做的就是监督项目的进展情况&#xff0c;理想状况下事情应当进展的很顺利&#xff0c;但实际上我们会发现项目永远不会完全按照经计划执行&#xff0c;我们必须进行项目控制。也就是我们需要不断进行调…

基于springboot+vue的在线文档管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 背景和意…

[ACM学习]自上而下树形dp

问题引入 设置dp状态&#xff0c;相比于更容易出错的贪心更...不易出错。 状态设计 如果选择父结点&#xff0c;就会使孩子结点不能被选择&#xff0c;我们会多开一维的dp&#xff0c;用来标记该点是否被标记过。 以1点举例&#xff0c;f[1][0]为不选它的状态&#xff0c;那么…

使用双异步后,如何保证数据一致性?

目录 一、前情提要二、通过Future获取异步返回值1、FutureTask 是基于 AbstractQueuedSynchronizer实现的2、FutureTask执行流程3、get()方法执行流程 三、FutureTask源码具体分析1、FutureTask源码2、将异步方法的返回值改为Future<Integer>&#xff0c;将返回值放到new…

Databend 开源周报第 129 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 支持标准流 标…