您的位置:首页 > 编程语言 > C语言/C++

C++学习摘要6

2016-11-23 16:10 169 查看

第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块的参数可以没有参数名称,只要参数类型
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言