嵌入式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函数中止程序。

目录
相关文章
|
28天前
|
开发框架 Linux C语言
C、C++、boost、Qt在嵌入式系统开发中的使用
C、C++、boost、Qt在嵌入式系统开发中的使用
32 1
|
28天前
|
算法 Linux 程序员
嵌入式工程师以及C++程序员到公司就业需要掌握那些技术?
嵌入式工程师以及C++程序员到公司就业需要掌握那些技术?
|
1月前
|
Java 编译器 C++
C++入门指南:类和对象总结笔记(下)
C++入门指南:类和对象总结笔记(下)
29 0
|
1月前
|
存储 编译器 C语言
C++入门: 类和对象笔记总结(上)
C++入门: 类和对象笔记总结(上)
34 0
|
1月前
|
数据处理 C++ UED
如何作为一个嵌入式软件工程师博主获得铁粉:C/C++ 技术分享之道
如何作为一个嵌入式软件工程师博主获得铁粉:C/C++ 技术分享之道
47 0
|
1月前
|
存储 编译器 程序员
嵌入式系统中C++基础知识精髓
嵌入式系统中C++基础知识精髓
42 0
|
23小时前
|
Linux 程序员 图形学
C++语言在现代软件开发中的应用与实践
C++语言在现代软件开发中的应用与实践
7 2
|
2天前
|
安全 Java 程序员
【C++笔记】从零开始认识继承
在编程中,继承是C++的核心特性,它允许类复用和扩展已有功能。继承自一个基类的派生类可以拥有基类的属性和方法,同时添加自己的特性。继承的起源是为了解决代码重复,提高模块化和可维护性。继承关系中的类形成层次结构,基类定义共性,派生类则根据需求添加特有功能。在继承时,需要注意成员函数的隐藏、作用域以及默认成员函数(的处理。此外,继承不支持友元关系的继承,静态成员在整个继承体系中是唯一的。虽然多继承和菱形继承可以提供复杂的设计,但它们可能导致二义性、数据冗余和性能问题,因此在实际编程中应谨慎使用。
5 1
【C++笔记】从零开始认识继承
|
1月前
|
编译器 C语言 C++
C++入门指南:类和对象总结笔记(中)
C++入门指南:类和对象总结笔记(中)
49 0
|
1月前
|
安全 算法 C++
了解C++ 软件开发中的鲁棒性
了解C++ 软件开发中的鲁棒性
38 0