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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值