C/C++文件流的操作             
C/C++文件流
文件流是以外存文件为输入/输出对象的数据流。输出文件流是从内存流向外存文件的数据,输入文件流是从外存文件流向内存的数据。每一个文件都有一个内存缓冲区与之对应。这里主要讨论两种文件的操作。
3.3.1 ASCII 文件的操作
程序描述:从键盘读入一行字符,把其中的字母字符依次存放在磁盘文件f2.dat 中,再将此磁盘文件读入程序,将其中的小写字母改为大写字母,并存入磁盘文件f3.dat。
【源程序 3-3】
                         01 #include 
            02 using namespace std;
            03 void save_to_file()
            04 {
            05 ofstream outfile("f2.dat",ios::out);
            06 if(!outfile)
            07 {
            08 cerr<<"open f2.dat error!"<            09 exit(1); //退出程序
            10 }
            11 char c[80];
            12 cin.getline(c,80); //从键盘读入一行字符
            13 for(int i=0;c[i]!=0;i++)
            14 if(c[i]>=65&&c[i]<=90||c[i]>=97&&c[i]<=122)
            15 {
            16 outfile.put(c[i]); //将字母字符存入磁盘文件f2.dat
            17 cout<            18 }
            19 cout<            20 outfile.close(); //关闭f2.dat 文件
            21 }
            22 void get_from_file()
            23 {
            24 char ch;
            25 ifstream infile("f2.dat",ios::in|ios::nocreate);
            26 if(!infile)
            27 {
            28 cerr<<"open f2.dat error!"<            29 exit(1);
            30 }
            31 ofstream outfile("f3.dat");
            32 if(!outfile)
            33 {
            34 cerr<<"open f3.dat error!"<            35 exit(1);
            36 }
            37 while(infile.get(ch)) //流成员函数get 读入一个字符
            38 {
            39 if(ch>=97&&ch<=122) //判断是否为小写字母
            40 ch=ch-32;
            41 outfile.put(ch); //流成员函数put 输出字符存入f3.dat
            42 cout<            43 }
            44 cout<            45 infile.close(); //关闭磁盘文件f2.dat
            46 outfile.close(); //关闭磁盘文件f3.dat
            47 }
            48 int main()
            49 {
            50 save_to_file();
            51 get_from_file();
            52 return 0;
            53 }            程序说明:
(1) 第3 行,函数save_to_file()从键盘读入一行字符,并将其中的字母存入磁盘文件。
(2) 第5 行,定义输出文件流对象outfile,以输出方式打开磁盘文件f2.dat。
(3) 第22 行,函数get_from_file()从磁盘文件f2.dat 读入字母字符,将其中的小写字母改为大写字母,再存入f3.dat。
(4) 第25 行,定义输入文件流对象infile,以输入方式打开磁盘文件f2.dat。
知识点:
(1) 磁盘文件中的内容是ASCII 字符,但人们不能直接看到,可用DOS 环境下的TYPE命令查看。TYPE 命令格式为
TYPE <文件名>
(2) ASCII 文件的读/写有两种方法:
① 用流插入运算符“<<”和流提取运算符“>>”输入/输出标准类型的数据;
② 通过文件流的put,get,getline 等成员函数进行字符的输入/输出。
二进制文件的操作
程序描述:将以二进制形式存放在磁盘文件中的数据读入内存并在显示器上显示。
【源程序 3-4】
                         01 #include 
            02 using namespace std;
            03 struct student
            04 {
            05 string name;
            06 int num;
            07 int age;
            08 char sex;
            09 };
            10 int main()
            11 {
            12 student stud[3];
            13 int i;
            14 ifstream infile("stud.dat",ios::binary);
            15 if(!infile)
            16 {
            17 cerr<<"open error!"<            18 abort();
            19 }
            20 for(i=0;i<3;i++)
            21 infile.read((char*)&stud[i],sizeof(stud[i]));
            22 infile.close();
            23 for(i=0;i<3;i++)
            24 {
            25 cout<<"NO."<            26 cout<<"name:"<            27 cout<<"num:"<            28 cout<<"age:"<            29 cout<<"sex:"<            30 }
            31 return 0;
            32 }            程序说明:
(1) 第14 行打开文件。
(2) 第18 行退出程序,与exit()函数的作用相同。
(3) 第21 行用成员函数读取二进制文件。
(4) 第22 行关闭文件。
知识点:
(1) 对二进制文件进行操作前应先打开文件,使用完毕后要关闭文件。打开文件要用
ios::binary 指定以二进制形式传送和存储。
(2) 可以一次性读入文件中的全部数据,将infile.read((char*)&stud[i],sizeof(stud[i]))语句改为infile.read((char*)&stud[0],sizeof(stud))即可。
(3) 二进制文件不是以ASCII 代码存储数据的,它将内存中的数据存储形式不加转换地传送到磁盘文件。因此,二进制文件中的信息不是字符数据,而是二进制形式的信息。