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