C++学习摘要6

第15章 C++中文件处理

  • 文件的基本概念及优点
    使用文件的优点:
    1.程序可以对不同的输入进行处理。
    2.方便用户处理。
    3.不受内存大小限制。

  • 文件操作的步骤
    1.建立流对象
    2.打开或建立文件
    3.进行读写操作
    4.关闭文件
    对文件操作的流主要有三个:fstream(输入输出流),ifstream(输入流),ostream(输出流),

#include<iostream>
#include<fstream>
using namespace std;
int main(){
    //fstream的使用 
    char buffer[256];
    fstream out;
    out.open("com.txt",ios::in);
    cout<<"文件的内容如下:"<<endl;
    while(!out.eof()){
        out.getline(buffer,256,'\n');
        cout<<buffer<<endl;
    }
    out.close();
    return 0;
} 
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int CountLine(char *fileName){
    //ifstream的使用 
    ifstream readFile;
    int n = 0;
    char line[512];
    string  temp;
    readFile.open(fileName,ios::in);
    if(readFile.fail()){
        return 0;
    }else{
        while(getline(readFile,temp)){
            n++;
        }
        return n;
    }
    readFile.close();
}
int main(){
    int n=0;
    n = CountLine("com.txt");
    cout<<"该文本的行数为:"<<n<<endl;
    return 0;
} 
#include<iostream>
#include<fstream>
using namespace std;
int main(){

    ofstream in;
    in.open("com.txt",ios::trunc);
    int i ;
    char a = 'a';
    for(int i = 0;i<= 26; i++){
        if(i<10){
            in<<"0"<<i<<"\t"<<a<<"\n";
            a++;
        }else{
            in<<i<<"\t"<<a<<"\n";
            a++;
        }   
    }
    in.close();
    return 0;
}
  • 文件的打开与关闭
    fstream类中的open函数,其原型为:
    void open(const *filename,int mode,int access);
    其中filename为文件名,mode为打开方式,access为文件的属性

    常见的打开方式有:
    ios::app—>以追加的形式打开文件
    ios::ate—->打开后定位到文件尾,ios::app中自动含有该属性
    ios::binary->二进制形式打开
    ios::in–>输入方式 ios::out—>输出形式
    ios::nocreat–>不创建文件,如果这个文件不存在则会打开失败
    ios::noreplace–>不覆盖,如果文件已经存在会打开失败
    ios::trunc—>如果文件存在则文件长度置为0
    可以使用或|来连接使用多个符号如ios::app|ios::biary…
    文件属性取值有:
    0 普通文件打开访问
    1 只读文件
    2 隐含文件
    3 系统文件

    文件的关闭则调用close函数.
    一个流对象只有关闭已经打开的流文件后,才能打新的流文件。

  • 读写文本文件
    1.使用变量写入写出

    ifstream infile;
    char value;
    infile.open("com.txt");
    if(infile.is_open()){
        while(infile.get(value))
            cout<<value;
    }
    //outfile<<"efg";
    cout<<endl;

2.使用get(),getline(),put()

  • 操作二进制文件
    仍旧可以用上面文本操作的方法处理,如getline()等读取,但是没有什么意义。
#include<iostream>
#include<fstream>
using namespace std;
const char * filename = "a.txt";
int main(){
    char * buffer;
    long size;

    fstream outfile(filename,ios::out|ios::app|ios::binary|ios::trunc);

    int temp = 100;
    outfile.write((char *)(&temp),sizeof(temp));
    outfile.close();
    cout<<"写入完毕"<<endl;
    //等价于另一种构造方法
    //fstream file;
    //file.open(filename,ios::in|ios::binary|ios::ate); 
    ifstream file(filename,ios::in|ios::binary);
    int readInt=10;
    file.read((char *)(&readInt),sizeof(readInt));
    file.close();
    cout<<readInt<<endl;
    cout<<"读取完毕"<<endl;
    return 0;
}

疑难解惑

1.get()和getline()有什么区别?
虽然都是整行读取,但是get()每次读取的时候把Enter建生成的换行符留在输入队列中,getline则将其抛弃。

2.缓存同步如何实现?
对文件流进行操作时,它们会与一个streambuf类型的缓存一起。缓存其实就是一块内存空间,做为流和物理文件的媒介。
缓存的同步即将(有时在输入的时候)缓存清空或缓存写入物理媒介的过程。会在以下任一情况发生。
1.文件关闭时。还未写出或写入的缓存要进行同步。
2.缓存满时。
3.控制符明确指明时如flush和endl。
4.调用sync()函数


第16章 异常处理

  • 异常处理机制
    try-catch
#include<iostream>
using namespace std;
double fuc(double x,double y){
    if(y == 0){
        throw y;
    }
    return x/y;
}
int main(){
    double res;
    try{
        res = fuc(2,3);
        cout<<"结果是:"<<res<<endl;

        res = fuc(2,0);//会抛出异常 

    }catch(double){//根据抛出异常的类型进行匹配 
        cout<<"Error of dividing zero"<<endl;
    }
}

关于抛异常的注意点:
1.在异常作用域中,被new出来的对象在抛出异常时不会自动析构,所以抛之前要手动析构。
2.throw对象引用时,拷贝的是引用的对象,而非拷贝引用的名称。

  • 捕获所有异常
    catch(…){}与java中的finally存在差别,finally无论如何会执行,catch(..)只是捕获所有异常,如果在之前捕获了其他异常则不会执行这里面的代码。

  • 未捕获异常
    如果发现一个异常在该函数的catch字句列表中不存在,则在其调用该函数的上一级中查找是否存在匹配的catch字句,(即逆着嵌套函数调用链向上继续)如果最终在main函数中都不存在,则会终止程序。

  • 异常的类层次体系
    所有的标准异常处理类均派生自Execption类,每个类都支持一个what(),返回一个描述异常的char *字符串。
    这里写图片描述

疑难解惑

  • 如果抛出异常而未捕获会怎样?
    一直上传到C++运行系统那里,最终终止整个程序

  • 异常处理通过什么来匹配
    仅仅通过类型而不是通过值类匹配,所以catch块的参数可以没有参数名称,只要参数类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值