C++学习摘要6

来源:互联网 发布:金蝶软件好用吗 编辑:程序博客网 时间:2024/05/21 04:44

第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块的参数可以没有参数名称,只要参数类型

0 0