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

目录

  • 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()方法重置流的状态,特别是在读取到流的末尾后。这样可以确保流处于一个干净的状态,准备好进行下一次读写操作。

其他一些用法

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

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

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

相关文章

【网站项目】基于SSM的263货物进销管理系统

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Java项目:基于ssm框架实现的电影评论系统(ssm+B/S架构+源码+数据库+毕业论文)

一、项目简介 本项目是一套ssm826基于ssm框架实现的电影评论系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#x…

Elasticsearch:2023 年 Lucene 领域发生了什么?

作者&#xff1a;来自 Elastic Adrien Grand 2023 年刚刚结束&#xff0c;又是 Apache Lucene 开发活跃的一年。 让我们花点时间回顾一下去年的亮点。 社区 2023 年&#xff0c;有&#xff1a; 5 个次要版本&#xff08;9.5、9.6、9.7、9.8 和 9.9&#xff09;&#xff0c;1 …

【CSP-J/S】复赛注意事项 上机文件组织形式

每年 CSP-J/S 复赛都有很多同学因为一些小失误导致一年的努力付之东流。Tony老师整理了一些复赛容易踩坑的点&#xff0c;或许对你有帮助&#xff01; 一、文件的输入输出 CSP、NOIP复赛与我们平时在Online Judge做题形式会有一些区别&#xff0c;需要我们将文件放入规定的地…

基于模糊PID控制器的风力温度控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 模糊逻辑控制原理 4.2 PID控制原理 4.3 模糊PID控制器原理 4.4 整体系统概述 5.完整工程文件 1.课题概述 当房间的温度不能保持目标温度时&#xff0c;这个系统中的某个部件肯定出现问题了&#x…

flink学习之窗口处理函数

窗口处理函数 什么是窗口处理函数 Flink 本身提供了多层 API&#xff0c;DataStream API 只是中间的一环&#xff0c;在更底层&#xff0c;我们可以不定义任何具体的算子&#xff08;比如 map()&#xff0c;filter()&#xff0c;或者 window()&#xff09;&#xff0c;而只是…

怎么缩小动图的大小?一分钟快速压缩gif体积

GIF动图是一种使用GIF文件格式创建的动画图像。GIF是一种常见的图像文件格式&#xff0c;它支持多帧图像以形成连续播放的动画效果。与其他图像格式只能表示静态图像不同&#xff0c;GIF格式可以存储多个图像帧&#xff0c;并通过在特定时间间隔内循环播放这些帧来创建动画效果…

Instagram被停用怎么办?2024年ins停权最新解决方法

大家有没有遇到过 Instagram 账号突然无缘无故消失的情况&#xff1f;这很有可能是 Instagram 无故禁用了你的账号&#xff0c;面对 Instagram 账号突然被停用的情况&#xff0c;许多用户都感到困惑和无助。这个问题可能影响到你的社交生活&#xff0c;甚至是商业活动。但别担心…

写给不耐烦程序员的 JavaScript 指南(五)

第七部分&#xff1a;集合 原文&#xff1a;exploringjs.com/impatient-js/pt_collections.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 下一步&#xff1a;30 同步迭代 三十、同步迭代 原文&#xff1a;exploringjs.com/impatient-js/ch_sync-iteration.htm…

【开源】基于JAVA的人事管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 管理员功能模块2.2 普通员工功能模块2.3 答辩文案 三、系统展示四、核心代码4.1 查询职称4.2 新增留言回复4.3 工资申请4.4 工资审核4.5 员工请假 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的人…

制造领域 物料清单(BOM)与零件明细表的区别

有许多人分不清物料清单(BOM)与零件明细表的区别,其实它们在企业的生产管理软件中起着不同的作用,各有各的特色,但是却有不尽相同。接下来我们就来区分一下吧 物料清单(BOM)&#xff0c;是详细记录一个项目所用到的所有下阶材料及相关属性&#xff0c;亦即母件与所有子件的从属…

【2024-01-22】某极验3流程分析-滑块验证码

声明&#xff1a;该专栏涉及的所有案例均为学习使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;如有侵权&#xff0c;请私信联系本人删帖&#xff01; 文章目录 一、前言二、抓包流程分析1.刷新页面2.点击按钮进行验证…

第二证券:暴跌超24%!美农产品贸易巨头一夜蒸发超600亿

当地时刻1月22日&#xff0c;美股三大股指集体收涨&#xff0c;道指与标普500指数再创前史新高&#xff0c;道指初次收在38000点上方。到收盘&#xff0c;道指涨0.36%&#xff0c;标普500指数涨0.22%&#xff0c;纳指涨0.32%。 大型科技股涨跌不一&#xff0c;其中&#xff0c…

Netty篇章(1)—— 核心原理介绍

终于进入到Netty框架的环节了&#xff0c;前面介绍了大量的Java-NIO的内容&#xff0c;核心的内容Selector、Channel、Buffer、Reactor掌握了&#xff0c;那么学起来Netty也是水到渠成的事情。如果没有掌握前面的内容那么学Netty会非常吃力&#xff0c;下面讲解Netty核心原理与…

Python - argparse模块

python中的argparse模块&#xff0c;用于命令后参数解析&#xff0c;方便测试&#xff0c;是python中自带的模块。 可以自动生成帮助文档&#xff0c;和使用手册。而且当用户在执行程序的时候&#xff0c;输入无效的参数时&#xff0c;会给出对应的错误信息。 使用方法&#…

C++学习笔记——指针

1&#xff0c;指针的基本概念 指针的作用&#xff1a;可以通过指针间接访问内存 内存的编号是从0开始记录的&#xff0c;一般用十六进制数字表示可以利用指针变量保存地址 上图中的p就是a变量的指针&#xff0c;也可以记作*a 2&#xff0c;指针变量的定义和使用 指针变量定…

k8s使用ingress实现应用的灰度发布升级

v1是1.14.0版本nginx ,实操时候升级到v2是1.20.0版本nginx&#xff0c;来测试灰度发布实现过程 一、方案&#xff1a;使用ingress实现应用的灰度发布 1、服务端&#xff1a;正常版本v1&#xff0c;灰度升级版本v2 2、客户端&#xff1a;带有请求头versionv2标识的请求访问版…

头条文章采集ChatGPT4.0改写软件环境配置教程步骤

大家好&#xff0c;我是淘小白~ 下面给大家整理一下&#xff0c;ChatGPT4.0改写软件环境配置教程 下面是我们拿到的环境配置软件&#xff0c;分别是&#xff1a;117版本的谷歌浏览器&#xff0c;谷歌浏览器驱动&#xff0c;notepad&#xff08;用于打开config.ini&#xff0c…

由于找不到msvcp140.dll无法继续执行的5种解决方法

在计算机系统中&#xff0c;如果未能成功找到或加载msvcp140.dll这个动态链接库文件&#xff0c;可能会引发一系列运行问题和功能障碍。msvcp140.dll是Microsoft Visual C Redistributable Package的一部分&#xff0c;对于许多基于Windows的应用程序来说&#xff0c;它是至关重…

ASP.NET Core 高级之使用Redis缓存

阅读本文你的收获 了解Redis基本作用及其使用场景学会安装Redis服务端和客户端及简单的命令行操作学习在ASP.NET Core WebAPI项目中如何操作Redis缓存 一、Redis介绍 Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键…