C++高级编程(8)

八、标准IO库

1.输入输出流类

1)非格式化输入输出

2)put

#include <iostream>
#include <string>
​
using namespace std;
int main()
{string str = "123456789";for (int i = str.length() - 1; i >= 0; i--) {cout.put(str[i]); //从最后一个字符开始输出}cout.put('\n');return 0;
}

3)write

#include <iostream>
using namespace std;
​
int main() 
{const char * str = "www.cplusplus.com";cout.write(str, 4);return 0;
}

4)格式化输入/输出

  • C++提供了大量的用于执行格式化输入/输出的流操纵符和成员函数。

  • 功能:

    • 打印地址: cout << (void*)a;

    • 整数流的基数:dec、oct、hex和setbase

    • 设置浮点数精度:precision、setprecision

    • 设置域宽:setw、width

  • 注:如果用到了含参数的流操纵算子,则必须包含头文件< iomanip >。

5)<<运算符重载

class Complex
{double real,imag;
public:Complex( double r=0, double i=0):real(r),imag(i){ };friend ostream & operator<<( ostream & os,const Complex & c);
};
​
ostream & operator<<( ostream & os,const Complex & c)
{os << c.real << "+" << c.imag << "i";return os;
}
​
int main()
{Complex c(3, 5);int n = 220;cout << c << "," << n;return 0;
}

6)hex、oct、dec和setbase

#include <iostream>
#include <iomanip>
using namespace std;
​
int main()
{int number;cout << "Enter a decimal number: ";cin >> number;cout << number << " in hexadecimal is: " << hex<< number << endl;cout << dec << number << " in octal is: " << oct << number << endl;cout << setbase(10) << number << " in decimal is: " << number << endl;return 0;
}
​
/*
输出结果:
Enter a decimal
number: 20
20 in hexadecimal is:14
20 in octal is: 24
20 in decimal is: 20
*/

7)浮点精度(precision,setprecision)

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
​
int main()
{double root2 = sqrt( 2.0 );int places;// use fixed point formatcout << fixed;for ( places = 0; places <= 9;places++ ){cout.precision( places );cout << root2 << endl;}for ( places = 0; places <= 9; places++ ){cout << setprecision( places ) <<root2 << endl;}return 0;
}

8)域宽(width,setw)

#include <iostream>
#include <iomanip>
using namespace std;
​
int main()
{int widthValue = 4;char sentence[ 10 ];cout << "Enter a sentence:" << endl;cin.width( 5 );while ( cin >> sentence ){cout.width( widthValue++ );cout << sentence << endl;//cout<<setw(widthValue++) << sentence << endl;cin.width( 5 );}return 0;
}

9)用户自定义的流操纵算子

#include <iostream>
using namespace std;
​
ostream& bell( ostream& output )
{return output << '\a'; // issue system beep
}
​
ostream& carriageReturn( ostream& output )
{return output << '\r'; // issue carriage return
}
​
ostream& tab( ostream& output )
{return output << '\t'; // issue tab
}
​
ostream& endLine( ostream& output )
{return output << '\n' << flush; // issue endl-like end of line
}
​
int main()
{cout << "Testing the tab manipulator:" << endLine<< 'a' << tab << 'b' << tab << 'c' << endLine;cout << "Testing the carriageReturn and bell manipulators:"<< endLine << "..........";cout << bell; // use bell manipulatorcout << carriageReturn << "-----" << endLine;
​return 0;
}

2.文件操作

  • 临时数据

    • 存储在变量和数组中的数据是临时的,这些数据在程序运行结束后都会消失。

  • 文件

    • 目的:文件用来永久地保存大量的数据。

    • 存储:计算机把文件存储在二级存储设备中(特别是磁盘存储设备)。

1)文件中的数据层次

  • 位(bit): 最小数据项:0和1

  • 字符(character)/字节(byte)

    字符:数字、字母和专门的符号

    字节:0、1序列 (常见的是8位/字节)

    字符用字节表示

  • 域(field):一组有意义的字符

  • 记录(record)

    • 一组相关的域

    • 记录关键字(record key):用于检索

  • 文件(file):一组相关的记录

  • 数据库:一组相关的文件

2)文件和流

  • C++语言把每一个文件都看成一个有序的字节流(把文件看成n个字节)

  • 每一个文件或者以文件结束符(end-of-file marker)结束,或者在特定的字节号处结束

  • 当打开一个文件时,该文件就和某个流关联起来

  • 与这些对象相关联的流提供程序与特定文件或设备之间的通信通道

3)文件输出例子

#include <iostream>
#include <fstream> // file stream
#include <cstdlib>
using namespace std;
​
int main()
{ofstream outClientFile( "clients.dat", ios::out );//打开文件// exit program if unable to create fileif ( !outClientFile ) // overloaded ! operator{cerr << "File could not be opened" << endl;exit( 1 );}cout << "Enter the account, name, and balance." << endl<< "Enter end-of-file to end input.\n? ";int account;char name[ 30 ];double balance;
​// read account, name and balance from cin, then place in filewhile ( cin >> account >> name >> balance ){outClientFile << account << ' ' << name << ' ' << balance << endl;//写文件cout << "? ";}return 0; // ofstream destructor closes file
}
​
/*
输出结果:
Enter the account, name, and balance. Enter end-of-file to end input. ? 100 Jones 24.98
? 200 Doe 345.67
? 300 White 0
? 400 Stone -42.16
? 500 Rich 224.62
? ^z
*/

4)文件访问

  • 定义一个流对象

  • 打开文件

  • 访问文件

  • 关闭文件

(1)测试文件打开是否成功
  • 用重载的ios运算符成员函数operator!确定打开操作是否成功。如果open操作的流将failbit或badbit设置,则这个条件返回非0值(true)。

  • 可能的错误是:

    • 试图打开读取不存在的文件

    • 试图打开读取没有权限的文件

    • 试图打开文件以便写入而磁盘空间不足。

(2)测试文件结束符与不合法输入
  • 另一个重载的ios运算符成员函数operator void将流变成指针,使其测试为0(空指针)或非0(任何其他指针值)。如果failbit或badbit对流进行设置,则返回0(false)。

  • 下列while首部的条件自动调用operator void*成员函数:

    Line 26: while (cin >> account >> name >>balance )只要cin的failbit和badbit都没有设置,则条件保持true。输入文件结束符设置cin的failbit。operator void*函数可以测试输入对象的文件结束符,而不必对输入对象显式调用eof成员函数。

(3)打开输入文件
  • ifstream inClientFile( “clients.dat” , ios::in );

  • 生成ifstream对象inClientFile,并将其与打开以便输入的文件clients.dat相关联。括号中的参数传入ifstream构造函数,打开文件并建立与文件的通信线路。

  • 打开ifstream类对象默认为进行输入,因此下列语句等价:

    ifstream inClientFile( “Clients.dat” );

  • 和ofstream对象一样,ifstream对象也可以生成而不打开特定文件,然后再将用open对象与文件相连接。

//文件输出例子
#include <iostream>
#include <fstream> // file stream
#include <iomanip>
#include <string>
#include <cstdlib>
using namespace std;
​
void outputLine( int, const string, double ); // prototype
​
int main()
{// ifstream constructor opens the fileifstream inClientFile( "clients.dat", ios::in );// exit program if ifstream could not open fileif ( !inClientFile ){cerr << "File could not be opened" << endl;exit( 1 );} // end ifint account;char name[ 30 ];double balance;cout << left << setw( 10 ) << "Account" << setw( 13 )<< "Name" << "Balance" << endl << fixed << showpoint;
​// display each record in filewhile ( inClientFile >> account >> name >> balance ){outputLine( account, name, balance );}return 0; // ifstream destructor closes the file
}
​// display single record from filevoid outputLine( int account, const string name, double balance ){cout << left << setw( 10 ) << account << setw( 13 ) << name<< setw( 7 ) << setprecision( 2 ) << right << balance << endl;}

5)文件位置指针

  • 为了按顺序检索文件中的数据,程序通常要从文件的起始位置开始读取数据,然后连续地读取所有的数据,直到找到所需要的数据为止。可能需要反复多次。

  • 文件位置指针( file position pointer):用于指示读写操作所在的下一个字节号;是个整数值,指定文件中离文件开头的相对位置(也称为离文件开头的偏移量)

6)文件指针重新定位

  • istream类和ostream类都提供成员函数,使文件位置指针重新定位

    • istream类的seekg (即“seekget”) :每个istream对象有个get指针,表示文件中下一个输入相距的字节数

    • ostream类的seekp (即“seekput”):每个ostream对象有一个put指针,表示文件中下一个输出相距的字节数

  • seekg和seekp的第一个参数通常为long类型的整数,表示偏移量。第二个参数可以指定寻找方向:

    ios::beg(默认)相对于流的开头定位

    ios::cur相对于流当前位置定位

    ios::end相对于流结尾定位

7)获取文件指针值

  • 成员函数tellg和tellp分别返回get和put指针的当前位置。

下列语句将get文件位置指针值赋给long类型的变量

location。

location = filObject.tellg();

8)更新顺序访问文件

  • 格式化和写入顺序访问文件的数据修改时会有破坏文件中其他数据的危险

  • 例如,如果要把名字“White”改为“Worthington” ,则不是简单地重定义旧的名字。White的记录是以如下形式写入文件中的:

    300 White 0.00

    如果用新的名字从文件中相同的起始位置重写该记录,记录的格式就成为:

    300 Worthington 0.00

  • 因为新的记录长度大于原始记录的长度,所以从“Worthington”的第二个“o”之后的字符将重定义文件中的下一条顺序记录。

  • 出现该问题的原因在于:在使用流插入运算符<<和流读取运算符>>的格式化输入,输出模型中,域的大小是不定的,因而记录的大小也是不定的。例如,7、14、-117、2047和27383都是int类型的值,虽然它们的内部存储占用相同的字节数,因此,格式化输入输出模型通常不用来更新已有的记录。

  • 一种解决方法:将在3000 White 0.00之前的记录复制到一个新的文件中,然后写入新的记录并把300 White 0.00之后的记录复制到新文件中。这种方法要求在更新一条记录时处理文件中的每一条记录。如果文件中一次要更新许多记录,则可以用这种方法。

3.STRING类

  • C++、java等编程语言中的字符串。

  • 在java、C#中,String类是不可变的,对String类的任何改变,都是返回一个新的String类对象。

  • String 对象是 System.Char 对象的有序集合,用于表示字符串。String 对象的值是该有序集合的内容,并且该值是不可变的

为什么需要string?

  • 在内部进行内存分配,从而保证应用程序的健壮性

  • 提供了拷贝构造函数和复制运算符,确保字符串的正确复制

  • 减少程序员创建和操作字符串需要做的工作

  • 提供了增删改查的操作,让程序员可以把精力放在应用程序的主要需求上,而不是字符串的操作细节。

1)string对象的定义和初始化

string s1;
string s2(s1);
string s3("value");
string s4(n,'c');

2)string对象的读写

  • 读入未知数目的string对象

    while(cin>>world)

    cout <<world <<endl;

  • 用getline读取整行

    getline(cin, s);

3)string对象的操作

s.empty();
s.size();
s[n]; //下标操作 范围0~?
s1+s2;
s1=s2;
v1==v2;
!= < <=
> >=

4)string对象中字符的处理

4.异常处理

1)C错误处理机制

  1. 函数返回错误编码

  2. 使用全局变量保存错误编码

  3. 出错时终止程序运行

  • 缺点:

    • 难以统一标准

    • 复杂

    • 构造和析构函数没有返回值

    • 出错就返回,用户接受度低

2)异常处理机制

  • C++异常处理的基本思想是简化程序的错误代码,为程序的健壮性提供了一个标准检测机制:若底层发生问题,则逐级上报,直到有能力处理此异常为止。

  • 异常处理的优势:

  1. 增强程序的健壮性。

  2. 使代码变得更简洁优美,更易维护。

  3. 错误信息更灵活丰富。

  • 缺点:

  1. 性能下降5%~14%。

2. 破坏了程序的结构性。

  1. 完成正确的异常安全的代码,需要付出更大的代价。

3)抛出异常

任何时候,程序在执行中遇到了非正常状况都可以抛出异常异常用throw语句抛出

A *p = new A;

if (p == NULL)

{

throw string(“Out of Memory.”);

}

一旦抛出异常,则程序将在throw语句处跳出

4)捕获异常

异常也由程序员负责捕获

用try{…}catch( ){…}语句来捕获异常

没有捕获的异常将被忽略

try{

// 可能抛出异常的语句

}catch(exceptionType variable){

// 处理异常的语句

}

//捕获异常的例子
#include <iostream>
#include <string>
#include <exception>
using namespace std;
​
int main()
{string str = "http://www.cplusplus.com";try{char ch1 = str[100];cout<<ch1<<endl;}catch(exception e){cout<<"[1]out of bound!"<<endl;}try{char ch2 = str.at(100);cout<<ch2<<endl;}catch(exception &e){ //exception类位于<exception>头文件中cout<<"[2]out of bound!"<<endl;}return 0;
}
//捕获任意异常例子
#include <iostream>
using namespace std;
int main( )
{int a, b;a = 8;b = 0;try{if (b == 0){throw "Divided by Zero!";}else{double c = a/b;cout << c << endl;}}catch(...){cout << "Exception caught!" << endl;}
}

5)异常处理的流程

抛出(Throw)--> 检测(Try) --> 捕获(Catch)

6)异常的传递

  • 产生异常之后,程序会立刻跳转

    • 跳出到最近的一层捕获异常的语句

    • 如果当前没有捕获语句或者捕获语句中没有匹配的异常,则程序会跳出当前的函数

  • 在函数的调用处,如果没有捕获住异常,则直接跳转到更高一层的调用者

  • 如果一直没有捕获该异常,C++将会使用默认的异常处理函数

    • p 该处理函数可能会让程序最终跳出main函数并导致程序异常终止

7)C++标准的异常

8)异常的说明

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

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

相关文章

EMC Plus:大电流注入传导抗扰度

大电流注入 &#xff08;BCI&#xff09; 是一种传导射频抗扰度测试&#xff0c;利用电流注入探头将调制信号引入电缆。其目的是复制设备运行环境中预期的电磁干扰 &#xff08;EMI&#xff09; 条件。在这里&#xff0c;我将为您提供一个使用 Ansys EMC Plus 进行大电流注入传…

《Java核心技术 卷I》JFrame组件中显示信息

组件中显示信息 JFrame结构复杂&#xff0c;由四层窗格&#xff0c;其中根窗格、层级窗格和玻璃窗格人们并不太关心&#xff0c;他们要用来组织菜单栏和内容窗格以及实现观感&#xff0c;Swing程序员最关心的是内容窗格(content pane)&#xff0c;添加到窗体的所有组件都会自动…

0x00基础算法 -- 0x01 位运算

资料来源&#xff1a;算法竞赛进阶指南活动 - AcWing 1、进制表示 二进制表示&#xff1a;m位二进制中&#xff0c;通常称最低位为第0位&#xff0c;从右到左以此类推&#xff0c;最高位为第m-1位。 常用十六进制表示的数字&#xff1a; 32位补码int&#xff08;十进制&#xf…

算法求解(C#)-- 寻找包含目标字符串的最短子串算法

1. 引言 在字符串处理中&#xff0c;我们经常需要从一个较长的字符串中找到包含特定目标字符串的最短子串。这个问题在文本搜索、基因序列分析等领域有着广泛的应用。本文将介绍一种高效的算法来解决这个问题。 2. 问题描述 给定一个源字符串 source 和一个目标字符串 targe…

Linux之Chronyd 时间服务器配置(Chronod Time Server Configuration in Linux)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

【Ant Design Pro】如何实现组件的状态保存umi-plugin-keep-alive插件的使用

都知道vuejs里面帮我们实现了一个内置的keep-alive组件&#xff0c;给我们缓存一些组件的状态带来了很大的便利。但是在react中没有自带的实现&#xff0c;可以借助社区的插件umi-plugin-keep-alive来实现这个功能。 实现效果对比 未使用插件&#xff0c;可以看到我们在页面跳…

【数据结构】二叉排序树和平衡二叉树

目录 1. 二叉搜索树&#xff08;BST&#xff09; 1.1 二叉搜索树的定义及特点 1.1.1 定义 1.1.2 特点 1.2 二叉排序树的构造&#xff08;创建&#xff09; 1.2.1 基本思想 1.2.2 算法 1.3 二叉排序树的删除 2. 平衡二叉树&#xff08;AVL&#xff09; 2.1 为什么要用…

C++四种类型转换

C语言提供了四种类型转换 const_cast: 可以去除掉常量属性的类型转换 //const_cast const int a 10; double* p1 (double*)&a;//类型和原来的类型可以不一致&#xff0c;但是不安全 int* p2 const_cast<int*>(&a);//类型和原本的类型必须匹配 //<>中必…

【SPIE出版,往届稳定EI检索】2024智能视觉与数据建模国际学术会议(ICIVD 2024,12月13-15日)

2024智能视觉与数据建模国际学术会议 2024 International Conference on Intelligent Vision and Data modeling (ICIVD 2024) 重要信息 会议官网&#xff1a;www.iccaid.net 2024 International Conference on Intelligent Vision and Data modeling (ICIVD 2024)www.iccaid…

大模型的思维链提示

文章目录 思维链提示的基本形式思维链提示的优化策略关于思维链的进一步讨论思维链提示是一种高级提示策略,旨在增强大语言模型在各类复杂推理任务上的表现。常见的推理任务包括算术推理、常识推理以及符号推理等多种任务。与上下文学习方法仅使用⟨输入,输出⟩二元组来构造提…

JavaScript day01 笔记

一、引入方式 JavaScript 程序不能独立运行&#xff0c;它需要被嵌入 HTML 中&#xff0c;然后浏览器才能执行 JavaScript 代码。通过 script 标签将 JavaScript 代码引入到 HTML 中 1️⃣内部 通过 script 标签包裹 JavaScript 代码&#xff08;一般就写在</script>的…

vue,uniapp,微信小程序解决字符串中出现数字则修改数字样式,以及获取字符串中的数字

简单记录一下&#xff0c;最近遇到的一个新需求&#xff1a;后端返回的是非富文本&#xff0c;只是一串字符串&#xff0c;其中包含了文字和数字&#xff0c;前端需要将出现数字的地方将其加粗或者修改颜色等需求 设计思路&#xff1a;&#xff08;简单做个记录方便以后理解&a…

数据分析:16s差异分析DESeq2 | Corncob | MaAsLin2 | ALDEx2

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍DESeq2原理计算步骤结果Corncob原理计算步骤结果MaAsLin2原理计算步骤结果ALDEx2原理计算步骤结果加载R包数据链接数据预处理微生物数据样本信息提取物种名称过滤零值保留结果读取…

【CSS】标准怪异盒模型

概念 CSS 盒模型本质上是一个盒子&#xff0c;盒子包裹着HTML 元素&#xff0c;盒子由四个属性组成&#xff0c;从内到外分别是&#xff1a;content 内容、padding 内填充、border 边框、外边距 margin 盒模型的分类 W3C 盒子模型(标准盒模型) IE 盒子模型(怪异盒模型) 两种…

C++builder中的人工智能(18):神经网络中的SoftMax函数

在这篇文章中&#xff0c;我们将探讨SoftMax函数在神经网络中的作用&#xff0c;如何在人工神经网络&#xff08;ANN&#xff09;中使用SoftMax函数&#xff0c;以及在AI技术中SoftMax的应用场景。让我们来详细解释这些概念。 SoftMax函数是什么&#xff1f; SoftMax函数是逻辑…

机器学习(七)——集成学习(个体与集成、Boosting、Bagging、随机森林RF、结合策略、多样性增强、多样性度量、Python源码)

目录 关于1 个体与集成2 Boosting3 Bagging与随机森林4 结合策略5 多样性X 案例代码X.1 分类任务-Adaboost-SVMX.1.1 源码X.1.2 数据集&#xff08;鸢尾花数据集&#xff09;X.1.3 模型效果 X.2 分类任务-随机森林RFX.2.1 源码X.2.2 数据集&#xff08;鸢尾花数据集&#xff09…

Matlab轻松烟雾检测

小编经验分享&#xff1a;如何使用Matlab进行烟雾检测 烟雾检测是一项重要的安全技术&#xff0c;它可以帮助我们及时发现火灾风险并采取相应的措施。在这篇文章中&#xff0c;小编将和大家分享如何使用Matlab进行烟雾检测的经验。希望这些经验对大家在实际应用中能够有所帮助…

c语言其实很简单----【数组】

TOC 1.输入10个学生成绩&#xff0c;计算及格人数&#xff0c;平均成绩&#xff0c;总成绩。 #include<stdio.h> int main(){float score[10];int i ,cut;float avar0.0,sum0.0;for(i0;i<10;i)scanf("%f",&score[i]);//输入10个学生的成绩cut0;for(i0…

在 .NET 6.0 中创建用于 CRUD 操作的 Web API

快速概述&#xff1a; 在动态的技术世界中&#xff0c;创建强大的 Web API 已成为开发人员不可或缺的关键技能。这些 API 是促进不同应用程序之间顺畅通信的重要链接&#xff0c;可实现无缝数据检索和操作。本文的重点是在 .NET 6 中为 CRUD 操作创建 Web API。 为了实现这一点…

lua 编译网路核心

下载 Severity Code Description Project File Line Suppression State Details Error LNK1104 cannot open file lua53.lib mime D:\MyWork\lua\luasocket-master\luasocket-master\LINK 1 2> Creating library Release\soc…