第八单元 文件与数据处理
文件分为两大类 一是程序文件,有:源程序文件(.cpp),目标文件(.obj),可执行文件(.exe)等。二是数据文件:在程序运行时,会将一些需要的数据(运行的中间结果或中间数据)输出到磁盘上存放起来,以后需要时再从磁盘上读取到计算机内存中,这种磁盘文件就是数据文件。程序运行中的输入和输出对象可以是数据文件。
文件概述:
1.文本文件与二进制文件:文件是由若干个字节(8位)按顺序组成的
- 文本文件:每个字节存放一个字符 便于对字符进行逐个处理和输出 用记事本等文本工具可以直接打开阅读 但 占用存储空间较多 需要花费大量转换时间(二进制ASCII码)
- 二进制文件:把内存中的数据按内存中的存储形式输出,即字节流 占用较小的存储空间 但不便于阅读 用专门的软件浏览
2.C++的I/O流:C++中的输入和输出是一流(stream)的方式来处理的,分为输入和输出流
- 输入流:从键盘、文件等流向程序内部的数据流
- 输出流:从程序内部流向显示器、打印机、文件的数据流
- 基本输入输出流:istream(输入类)、ostream(输出类)、iostream(输入输出类)、iomanip(头文件控制输入输出格式)包含在iostream
- 文件流:ifstream(输入文件流类)、ofstream(输出文件流类)、fstream(输入输出文件流类) 包含在frstream中
3.FILE类型:在C语言操作文件要用到FILE结构体类型,定义在stdio.h中,要访问巍峨见,首先要通过指向FILE结构体类型的指针变量只想要操作的文件,然后调用与文件有关的函数。
C++的文件打开与关闭:1)在文件头部包含fstream库文件 2)打开文件:新建文件流对象,与要操作的文件建立联系(文件名、操作方式)3)操作文件 操作文件流对象,实现数据的输入输出功能 4)关闭文件:关闭文件流对象,断开与文件的联系
1.文件的打开:文件流对象可以在初始化时打开文件,也可以使用open方法打开
1.只读方式打开:创建ifstream流对象,指定要操作的文件名,操作方式默认为只读
用定义对象初始化的方式打开文件:
//创建ifstream类型对象ifs,打开当前目录下的datal.txt文件,如果文件不存在,则创建一个新的文件
ifstream ifs("datal.txt");
定义对象后,用open方法打开文件:
//创建输入流对象ifs,执行open方法打开文件
ifstream ifs;
ifs.open("datal.txt");
读取文件时,必须保证文件存在,如果不存在,文件流为空NULL 因此,打开ifstream流对象后要判断对象是否为空,如果为空,则给出提示信息后结束程序
ofstream ofs("datal.txt");
if(ifs==NULL)//或者if(!ifs)
{
cout<<"file not exist";
return 1; //根据函数定义的返回值类型返回一个表示打开失败的值,如1
}
引号中的文件名如果不包括路径,就是指当前目录,也可以指定路径,格式为 盘符:\\文件夹\\文件名
绝对目录:从头开始,用//分开
相对目录:从当前目录开始
2.以只写方式打开 用fstream对象指定要操作的文件名,默认操作是只写
ofstream ofs1("datal.txt");
ofstream ofs2("d:\\datal.txt");
ofstream ofs3;
ofs3.open("datal.dat");
文件不存在,会创建新的文件;文件存在,会删除原文件建立新文件
如果创建新文件失败(指定目录不存在或不允许写入),文件流为空。因此,打开文件一般也要判断对象是否为空
if(ofs==NULL)或if(!ofs)
{
cout<<"file write failure"
retuurn 1;
}
如果希望将写入的内容直接追加到文件末尾,增加参数ios::app
执行时,如果当前目录中不存在datal.txt文件,则创建一个空文件;如果存在该文件,则以追加的方式打开文件爱你,向文件中写入的信息会追加到文件末尾,原来数据并不会消失
ofstream ofs("datal.txt",ios::app);
ofstream ofs;
ofs.open("datal.txt",ios::app)
3.以读写方式打开文件
文件允许同时读写,用fstream,并指定读写方式
fstream fs("datal.txt",ios::in|ios::out);
fstream fs("datal.txt",ios::in|ios::binary);
app指文件存在时将数据添加到文件末尾
binary指用二进制形式操作文件
2.文件的关闭
文件在操作完成后必须关闭,断开文件流与文件的联系,保证将缓冲区中的数据写到文件中,避免由于错误操作引起文件中的数据被修改。如果要再修改,重新执行打开操作。
关闭使用close方法,无参数。
ifs.close();
C++的文件读写
1.fstream类常用检查方法:eof函数检测是否到达末尾,如果到达末尾返回true,否则返回false。判断文件操作不成功,如果打开文件流对象失败或者遇到无效的输入格式,可以调用fstream类的fail函数返回true (ps.默认是顺序读写)
2.文本文件的读写:顺序访问,打开文件后从文件的第一个字符开始逐个读取字符,直到文件末尾
- 写文本文件 ofstream类是从ostream类派生的,可以使用ostream类中定义的流插入运算符<<、put成员函数,实现从内存变量到文件的输出过程 1)插入运算符<<输出一个字符 2)put成员函数输出一个字符,如:char ch;ofs.put(ch);
//将一个字符串写入文件中 #include<iostream>//向屏幕进行输入输出 #include<fstream> using namespace std; int main() { ofstream ofs("datal.dat"); if(!ofs)//打开文件爱你失败则提示出错后返回 { cout<<"file write failure!"<<endl; return 1; } char s[80]="hello\nhow are you\nok"; ofs<<s;//写入s字符串 ofs.close(); //使用后关闭文件 return 0; }
结果如图:
- 读文本文件:ifstream类是从istream类派生的,可以使用istream类中定义的流提取运算符>>和get,getline 1)用流提取运算符>>读取一个字符,回车字符不显示 2)用get成员函数读取一个字符,回车显示,如"char ch;ifs.get(ch);" 3)用getline成员函数读取一行字符串,回车符显示
逐个读取文件中的字符 输出到显示器上 #include<iostream>//向屏幕进行输入输出 #include<fstream> using namespace std; int main() { ifstream ifs("datal.dat"); if(!ifs)//打开文件后失败 则提示出错 后返回 { cout<<"file write failure!"<<endl; return 1; } char s; while(1)//永远为真 { ifs>>s;//读一个字符 ifs>>s if(ifs.eof())//判断是否到末尾 如果到末尾 循环结束 break; cout<<s; //读出读取的字符 } ifs.close();//关闭文件 return 0; }
- 二进制文件的读写:增加参数ios::binary
写二进制文件用write函数实现 原型声明: ostream& write(const char*buffer,int len); //指针变量buffer指向内存中字符串的空间 //len是带写入的字节数 //将一个数值写入文件中 ofstream ofs("data3.dat"); double val=1; ofs.write((char*)val,sizeof(val));
读二进制文件用到read函数
原型声明: istream& read(char*buffer,int len); 读取文件中的字节 ifstream ifs("data3.dat"); char s[30]; ifs.read(s,30);
C语言的文件打开与读写:打开文件时,通过一个指向FILE结构体的指针变量与文件建立联系P210---P212
文件应用实例:P212---P220