首页 > 编程语言 >C++知识点总结全系列 (05):IO 类的详细总结和分析

C++知识点总结全系列 (05):IO 类的详细总结和分析

时间:2024-07-01 16:00:17浏览次数:3  
标签:总结 知识点 What ch cout 文件 05 std 输入

1、基类 istream 和 ostream

(1)istream

A.What

输入流的抽象类,是所有输入流类的基类

B.Why(输入流的作用)

用于从数据源(如文件、标准输入设备等)读取数据

(2)ostream

A.What

输出流的抽象类,是所有输出流类的基类

B.Why(输出流的作用)

输出流用于将数据写入到目标位置,例如文件或标准输出设备(通常是屏幕)

(3)输入输出流的状态

A.Which

goodbit:表示流处于正常状态,可以进行正常的输入和输出
eofbit:表示已经到达文件末尾或流的结束位置,当文件读取完毕时,eofbit会被设置为1
failbit:表示流操作失败,如尝试将字符写入只读文件、尝试从空文件中读取数据
badbit:表示流已经崩溃或数据出现问题,如打开不存在的文件、内存不足等

stream.good();
stream.eof();
stream.fail();
stream.bad();

B.How(如何操作流状态)

获取流的状态:stream.rdstate()

if(istream.rdstate() & std::ios_base::badbit)
{ 
	std::cout<<"badbit error!"<<std::endl;
}

复位流状态位:goodbit设置为1,其它设置为0

istream.clear();

设置指定状态位:但 stream.setstate(goodbit)不合法

istream.setstate(std::ios_base::failbit | std::ios_base::eofbit);

2、派生类fstream

(1)fstream

A.What

C++ 标准库中用于文件输入输出操作的文件流类

B.Why

实现对文件的输入和输出操作

C.文件打开方式

模式说明
in以读的方式打开文件
out以写的方式打开文件,写数据后原文件将被覆盖
out | trunc当以 trunc 模式打开文件时,如果该文件存在, 则先清空,后写入新数据。如果文件不存在,则创建
out | app每次写操作均定位到文件末尾
binary二进制形式打开文件(in&out)
ate打开文件后立即定位到文件末尾(in&out)

(2)ifstream

A.What

文件输入流类,是istream的派生类

B.Why

用于实现从文件中读取数据

C.How

std::string strFilePth = "D:\\Desktop\\a.txt";
// 以读的方式打开文件
std::ifstream inStream;
inStream.open(strFilePth);
if (!inStream.is_open())
{
	std::cerr << "Failed to open file" << std::endl;
	return;
}
char ch[10];
while (inStream.read(ch, 10))
{
	
	std::cout << ch << std::endl;
}
inStream.close();

(3)ofstream

A.What

文件输出流类,是ostream的派生类

B.Why

用于向文件中写入数据

C.How

std::string strFilePth = "D:\\Desktop\\a.txt";
// 以写的方式打开文件
std::ofstream outStream;
outStream.open("D:\\Desktop\\a.txt", std::ios_base::app);
if (!outStream.is_open())
{
	std::cerr << "Failed to open file" << std::endl;
	return;
}
// 向文件中写入数据
int i = 0;
while (!outStream.eof())
{
	outStream << "wodeshijie" << std::endl;
	++i;
	if (i >= 10)
	{
		outStream.setstate(std::ios_base::eofbit);
		
	}
}
outStream.close();

3、流缓冲

(1)What(什么是流缓冲)

本质是一个内存中的缓冲区,每个输入或输出流对象都管理一个缓冲区,用来保护读写数据

(2)刷新缓冲

将数据真正写入到文件或输出设备中

(3)When(什么时候刷新缓冲)

  • 程序正常结束时
  • 缓冲区满时
  • 使用操作符endl、ends、flush时:flush表示主动刷新缓冲区
  • 一个流关联到另一个流时:

如默认情况下 cin 和 cerr 都关联到 cout,因此读 cin 或写 cerr 都会导致 cout 的缓冲区被刷新

4、格式化输入和输出

(1)What

标准库定义了一组操纵符(本质是函数或对象)来修改流的格式状态 当操作符改变流的格式状态时,通常改变后的状态对所有后续 IO 都生效

(2)Which

A.控制布尔值的格式

bool bFlag = true;
std::cout<<std::boolalpha<<bFlag<<std::endl; //打印:true
std::cout<<std::noboolalpha<<bFlag<<std::endl; //打印:1

B.控制整型值进制的格式

cout<<"default:"<<20<<" "<<1024<<endl;
cout<<"octal:"<<oct<<20<<" "<<1024<<endl;
cout<<"hex:"<<hex<<20<<" "<<1024<<endl;
cout<<"decimal:"<<dec<<20<<" "<<1024<<endl;

输出结果:
default:20 1024
octal:24 2000
hex:14 400
decimal:20 1024

C.控制浮点数的格式

// 浮点数格式 
double a = 12.123456789; 
cout << cout.precision() << endl; // 打印:6 (默认精度为 6) 
cout << a << endl; // 打印:12.1235
// 浮点数精度设置——precision
cout.precision(12); cout << a << endl; // 打印:12.123456789
// 是否显式为 0 的小数——showpoint noshowpoint(默认) double b = 12.000000;
cout << b << endl; // 打印:12 
cout << std::showpoint << b << endl; // 打印:12.000000 
// 科学计数格式——scientific
double c = 123456.123456; 
cout << std::scientific << c << endl; // 打印:1.234561234560e+05

4、非格式化输入和输出

(1)What

主要是使用流对象函数实现输入和输出

(2)单字节操作

在这里插入图片描述

char ch; while (cin.get(ch))
{
cout.put(ch); }int ch;
while ((ch = cin.get()) != EOF)
{
}
cout.put(ch)

(3)多字节操作

在这里插入图片描述

// 输入流对象函数使用:get(char_arr,max_len,delim) 
instream.clear();
cout << instream.tellg() << endl; // 打印:247 
instream.seekg(0, std::ios::beg); // 设置流的当前指针 
cout << instream.tellg() << endl; // 打印:0
const int MAX_LEN = 1000; char wch[MAX_LEN]; // 应该比读取的最大长度要大 
instream.get(wch, MAX_LEN, '\0'); // 读取最大长度为 MAX_LEN 的字符 
cout << wch << endl; // 打印:所有文本
// 输入流对象函数使用:getline(char_arr,max_len,delim) 
instream.clear();
instream.seekg(0, std::ios::beg);
char ch_arr02[MAX_LEN];
instream.getline(ch_arr02, MAX_LEN, '\0'); 
cout << ch_arr02 << endl;
// 输入流对象函数使用:read (char_arr,max_len) 
instream.clear();
instream.seekg(0, std::ios::beg); 
char ch_arr03[MAX_LEN];
instream.read(ch_arr03, MAX_LEN / 5); 
cout << instream.gcount() << endl; // 打印:200 
cout << instream.tellg() << endl; // 打印:208 
cout << ch_arr03 << endl;

(4)流的随机访问

在这里插入图片描述

instream.clear(); instream.seekg(0, std::ios::beg); 
for (int i = 0; i < MAX_LEN; ++i) {
	instream >> std::noskipws >> ch; 
	if (instream.fail()) break;
	instream.seekg(i); cout << ch;
}

标签:总结,知识点,What,ch,cout,文件,05,std,输入
From: https://blog.csdn.net/qq_42279379/article/details/140096923

相关文章

  • 猫头虎 2024年上半年个人总结:科技自媒体的进击与突破
    猫头虎......
  • 工创赛总结与改进——选型建议
    任务目标扫描二维码平面移动定位拿取物料色环定位放置物料比赛总体只有这么些执行要点,每个部分都需要重视,随着序号顺序其重要性降序!最重要的就是扫二维码和移动以及拿物料,一步步进行,才能得分,根据顺序执行,哪个部分寄掉,后面的环节大概率也要寄。下面对每个环节所需要的主要......
  • 工创赛总结与改进——选型建议
    任务目标扫描二维码平面移动定位拿取物料色环定位放置物料比赛总体只有这么些执行要点,每个部分都需要重视,随着序号顺序其重要性降序!最重要的就是扫二维码和移动以及拿物料,一步步进行,才能得分,根据顺序执行,哪个部分寄掉,后面的环节大概率也要寄。下面对每个环节所需要的主要......
  • 打卡信奥刷题(205)用Scratch图形化工具信奥P8588 [普及组]『JROI-8』雷雨天特别行动科
    『JROI-8』雷雨天特别行动科题目背景“天使可没有假期”“啊,又来了……还是不要勉强自己会比较好哦”已获得转载授权。题目描述对于非负整数变量xxx,记以下为一......
  • 题目集7~8总结性blog
    一、前言作为本学期学习完面向对象程序设计之后的最后一个总结性blog,我学到的知识点有很多,也包括对本两次大作业的知识点的总结面向对象程序设计课程是计算机科学中的重要一课,它是一种编写计算机程序的方式,采用的是面向对象的技术。在学习此课程之前,我们需要先学习一些基本的编......
  • 题目集7~8的总结性Blog
    前言:这两次的题目集和以前相比没有很多新学的知识, 但是难度都明显上来了很多,主要考验学生综合能力运用问题,所以这两次编程的不是很理想,需要我对于逻辑和各种情况上细致分析,需要学生具备很强的设计和修改能力;我在写最后一次题目集时,花费了很长时间,但是依然毫无所获,非常遗憾,自己的......
  • PTA题目集7、8的总结
    **前言**1.第七次题目集的7-1在家居强电电路模拟程序-2的基础上新增了一些内容,控制设备增加了一个互斥开关,比较麻烦的是互斥开关不同的引脚相接其电阻并不相同,而且要从输入信息中读取互斥开关的状态也有点难度,与其他设备不同的是,互斥开关可以出现在一个或两个串联电路中,更加考验......
  • 深度学习CUDA Out of Memory原因总结和方法
    CUDAOutofMemory原因总结和方法原因总结显存不足:深度学习模型(尤其是大型模型)在训练或推理时需要大量的显存。如果显存容量不足,会导致CUDAOutofMemory错误。批处理大小过大:在训练过程中,批处理(batch)大小设置过大时,会占用过多的显存,导致显存溢出。模型过大:模型......
  • 题目集7~8的总结性Blog
    7-7家居强电电路模拟程序-3分数70退出全屏作者 蔡轲单位 南昌航空大学智能家居是在当下家庭中越来越流行的一种配置方案,它通过物联网技术将家中的各种设备(如音视频设备、照明系统、窗帘控制、空调控制、安防系统、数字影院系统、影音服务......
  • MySQL 索引之外的相关查询优化总结
    在这之前先说明几个概念:1、驱动表和被驱动表:驱动表是主表,被驱动表是从表、非驱动表。驱动表和被驱动表并非根据from后面表名的先后顺序而确定,而是根据explain语句查询得到的顺序确定;展示在前面的是驱动表,后面的是非驱动表。2、关联查询的类型非为:内连接(innerjoin)、......