嵌入式c++软件开发笔记 第六讲

简介: 嵌入式c++软件开发笔记 第六讲

c++文件操作

对文件的操作是由文件流类完成的。文件流类在流与文件间建立连接

文件流类型

文件输入流ifstream

文件输出流ofstream

文件输入/输出流fstream

文件的操作过程

定义文件流类的对象–ifstream f(“a.txt”);

打开文件

成员函数open()打开需要操作的文件

mode :在ios 类中定义的文件打开方式

如果未指明以二进制方式打开文件,则默认是以文本方式打开文件。

对于ifstream 流, mode 参数的默认值为ios::in,

对于ofstream 流,mode 的默认值为ios::out|ios::trunc,

对于fstream 流, mode 的默认值为ios::in|ios::out|ios::app

也可以通过,构造函数打开文件

#include “pch.h”
#include
#include
using namespace std;
int main()
{
ifstream ifs(“xxx.txt”, ios::in);
if (!ifs)
cout << “open error1” << endl;
char buf[100];
if (ifs >> buf)
cout << buf << endl;
ofstream ofs(“yyy.txt”, ios::out | ios::app);
if (!ofs)
cout << “open error2” << endl;
ofs << “abcefldkj” << endl;
fstream fs(“zzz.txt”, ios::in | ios::out | ios::trunc);

//app 有创建文件的功能trunc也有,但是清空

if (!fs)
cout << “open error3” << endl;
fs << “abcdefg”;
char buf2[1024];
fs.seekg(0, ios::beg);
fs >> buf2;
if (fs)
cout << buf2 << endl;
return 0;
}

对文件进行读写操作

读文件

operator>>
int get();
istream& get(int);
istream & get(char*,int n, char deli )
istream& getline(char * ,int n);
get VS getline

get 和getline 最大的区别就是,get 遇到界定符时,停止执行,但并不从流中提取界

定符,再次调用遇到同一个界定符,函数将立即返回,不会提取输入。getline 则不同,它

将从输入流中提供界定符,但伤然不会把它放到缓冲区中。

写文件

operator<<

osream put(char)

关闭文件

调用成员函数close()来关闭文件

实现文件拷贝

#include “pch.h”
#include
#include
using namespace std;
int main()
{
fstream ifs(“src.txt”, ios::in);
if (!ifs)
{
cout << “open error in” << endl;
return -1;
}
fstream ofs(“dest.txt”, ios::out | ios::trunc);
if (!ofs)
{
cout << “open error out” << endl;
return -1;
}
// int data;
// while(ifs>>data,!ifs.eof()) // 只能以空格table 回车作为标志
// {
// cout<<“x”<<endl;
// ofs<<data<<" ";
// }
// char ch;
//while(ifs.get(ch),!ifs.eof())
//{
//ofs.put(ch);
//}
//ifs.close();
//ofs.close();
char buf[1024];
while (ifs.get(buf, 1024, ‘\n’))
{
while (ifs.peek() == ‘\n’)
ifs.ignore();
ofs << buf << endl;
}
ifs.close();
ofs.close();
return 0;
}

读写二进制文件

ostream & write(const char * buffer,int len);

istream & read(char * buff, int len);

案例

随机读写函数

c++异常

C语言异常处理

方法:语言中错误的处理,通常采用返回值的方式或是置位全局变量的方式

C++异常处理机制

作用:异常的引发和异常的处理不必在同一个函数

异常的基本语法

try

try块可以嵌套

程序按顺序寻找匹配的异常处理器,抛出的异常将被第一个类型符合的异常处理器捕获

如果内层try块后面没有找到合适的异常处理器,该异常向外传播,到外层try块后面的catch块中寻找

没有被捕获的异常将调用terminate函数,terminate函数默认调用abort终止程序的执行

可以使用set_terminate函数指定terminate函数将调用的函数

catch

一个异常处理器一般只捕捉一种类型的异常

异常处理器的参数类型和抛出异常的类型相同

…表示可以捕获任何异常

throw

可以抛出内置类型异常也可以抛出自定义类型异常

throw抛出一个类对象会调用拷贝构造函数

异常被抛出后,从进入try块起,到异常被抛掷前,这期间在栈上的构造的所有对象,都会被自动析构

机制

1) 若有异常则通过throw操作创建一个异常对象并抛掷。

2) 将可能抛出异常的程序段嵌在try块之中。控制通过正常的顺序执行到达try语句,然后执行try块内的保护段。

3) 如果在保护段执行期间没有引起异常,那么跟在try块后的catch子句就不执行。程序从try块后跟随的最后一个catch子句后面的语句继续执行下去。

4) catch子句按其在try块后出现的顺序被检查。匹配的catch子句将捕获并处理异常(或继续抛掷异常)。

5) 如果匹配的处理器未找到,则运行函数terminate将被自动调用,其缺省功能是调用abort终止程序。

6)处理不了的异常,可以在catch的最后一个分支,使用throw语法,向上扔。

7)异常机制与函数机制互不干涉,但捕捉的方式是基于类型匹配。捕捉相当于函数返回类型的匹配,而不是函数参数的匹配,所以捕捉不用考虑一个抛掷中的多种数据类型匹配问题

8)异常捕捉严格按照类型匹配

异常捕捉的类型匹配之苛刻程度可以和模板的类型匹配媲美,它不允许相容类型的隐式转换,比如,抛掷char类型用int型就捕捉不到

构造函数没有返回类型,无法通过返回值来报告运行状态,所以只通过一种非函数机制的途径,即异常机制,来解决构造函数的出错问题。

异常接口声明

1)为了加强程序的可读性,可以在函数声明中列出可能抛出的所有异常类型,例如:

void func() throw (A, B, C , D); //这个函数func()能够且只能抛出类型A B C D及其子类型的异常。

2)如果在函数声明中没有包含异常接口声明,则次函数可以抛掷任何类型的异常,例如:

void func();

3)一个不抛掷任何类型异常的函数可以声明为:

void func() throw();

4) 如果一个函数抛出了它的异常接口声明所不允许抛出的异常,unexpected函数会被调用,该函数默认行为调用terminate函数中止程序。

目录
相关文章
|
5月前
|
算法 C++
算法笔记:递归(c++实现)
算法笔记:递归(c++实现)
|
5月前
|
编译器 C++
《Effective C++ 改善程序与设计的55个具体做法》 第一章 笔记
《Effective C++ 改善程序与设计的55个具体做法》 第一章 笔记
|
3月前
|
C++
拥抱C++面向对象编程,解锁软件开发新境界!从混乱到有序,你的代码也能成为高效能战士!
【8月更文挑战第22天】C++凭借其强大的面向对象编程(OOP)能力,在构建复杂软件系统时不可或缺。OOP通过封装数据和操作这些数据的方法于对象中,提升了代码的模块化、重用性和可扩展性。非OOP方式(过程化编程)下,数据与处理逻辑分离,导致维护困难。而OOP将学生信息及其操作整合到`Student`类中,增强代码的可读性和可维护性。通过示例对比,可以看出OOP使C++代码结构更清晰,特别是在大型项目中,能有效提高开发效率和软件质量。
34 1
|
3月前
|
C++ 容器
【C/C++笔记】迭代器
【C/C++笔记】迭代器
26 1
|
3月前
|
存储 安全 程序员
【C/C++笔记】迭代器范围
【C/C++笔记】迭代器范围
66 0
|
4月前
|
C++ Windows
FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg
在Windows上使用Visual Studio 2022进行FFmpeg和SDL2集成开发,首先安装FFmpeg至E:\msys64\usr\local\ffmpeg,然后新建C++控制台项目。在项目属性中,添加FFmpeg和SDL2的头文件及库文件目录。接着配置链接器的附加依赖项,包括多个FFmpeg及SDL2的lib文件。在代码中引入FFmpeg的`av_log`函数输出"Hello World",编译并运行,若看到"Hello World",即表示集成成功。详细步骤可参考《FFmpeg开发实战:从零基础到短视频上线》。
165 0
FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg
|
6月前
|
算法 C++ 容器
黑马c++ STL常用算法 笔记(5) 常用算术生成算法
黑马c++ STL常用算法 笔记(5) 常用算术生成算法
|
5月前
|
编译器 C++
《Effective C++ 改善程序与设计的55个具体做法》 第二章 构造/析构/赋值运算 笔记
《Effective C++ 改善程序与设计的55个具体做法》 第二章 构造/析构/赋值运算 笔记
|
5月前
|
存储 小程序 程序员
Essential C++ 第1章 C++编程基础 (笔记)
Essential C++ 第1章 C++编程基础 (笔记)
|
5月前
|
算法 C语言 C++
面向考试编程C++笔记
面向考试编程C++笔记