【C++】16 数据文件读写操作

 

 

                                                            I/O 类库中的常见流类

     类名     作用      头文件
ios抽象基类  iostream

istream

ostream

iostream

通用输入流和其他输入流的基类

通用输出流和其他输出流的基类

通用输入输出流和其他输入输出流的基类

  iostream

ifstream

ofsteram

fstream

输入文件流类

输出文件流类

输入输出文件流类

  fstream

istrstream

ostrstream

strstream

输入字符串流类

输出字符串流类

输入输出字符串流类

  strstream

 

根据文件中数据的组织方式,可分为ASCII文件二进制文件

 

1.打开磁盘文件

文件流对象 (磁盘文件名,输入输出方式);

oftream outfile("text1.txt",ios::out);  //定义输出文件流对象,打开磁盘文件"test1.txt" 。如果没有该文件则创建
ifstream infile("test2.txt",ios::in);      //定义输入文件流对象,打开磁盘文件"test2.txt"
ofstream infile("D:\\byte1.txt",ios::binary);      //定义输出文件流对象,打开磁盘文件"byte1.txt"
ifstream infile("D:\\byte1.txt",ios::binary);      //定义输入文件流对象,打开磁盘文件"byte1.txt"

 

                                                                                       文件输入输出方式设置

 

            方式                                        作用
ios::in输入方式打开文件
ios::out输出方式打开文件(这是默认方式),如果已有此名字的文件,则将其原有内容全部清除
ios::app输出方式打开文件,写入的数据添加在文件末尾
ios::ate打开一个已有的文件,文件指针指向文件末尾
ios::trunc打开一个文件,如果文件已存在,则删除其中全部数据,如文件不存在,则建立新文件。如已指定了ios::out方式,而未指定ios::app,ios::ate,ios::in,则同时默认此方式
ios::binary以二进制方式打卡一个文件,如不指定此方式则默认为ASCII方式
ios::nocreate打开一个以有的文件,如文件不存在,则打开失败
ios::noreplace如果文件不存在则建立新文件,如果文件已存在则操作失败
ios::in | ios::out以输入输出方式打开文件,文件可读可写

 

说明:

  1. 新版本的I/O类库中不支持 ios::nocreate 和 ios::replace 。
  2. 每一个打开的文件都有一个文件指针,该指针的初始位置有I/O方式指定,每次读写都从文件指针的当前位置开始。每读入一个字节,指针就后移一个字节。当文件指针移到最后,就会遇到文件结束(文件结束符也占一个字节,其值为-1),此时流对象的成员函数eof的值为非0值(一般设为1),表示文件结束了。
  3. 可以用“位或”运算符“ | ”对输入输出方式进行组合。
  4. 如果打开操作失败,open函数的返回值为0(假),如果是用调用构造函数的方式打开文件的,则流对象的值为0。可以据此测试打开是否成功。

 

2.关闭磁盘文件

在对已打开的磁盘文件的读写操作完成后,应关闭该文件。关闭文件用成员函数close。

outfile.close();
infile.close();

写ASCII文件

ASCII文件又称文本文件字符文件,文件中每一个字节放一个ASCII代码,代表一个字符。

#include<iostream>
#include<fstream>
#include<stdlib.h>
using namespace std;

int main(){
	int array[10]={0,1,2,3,4,5,6,7,8,9};
	
	ofstream outfile("test1.txt",ios::out);   //定义输出文件流对象,打开磁盘文件"test1.txt" 。如果没有该文件则创建
	if(!outfile){          //如果打开失败,outfile返回0值 
		cerr<<"open error!"<<endl;
		exit(1);
	}
	for(int i =0;i<10;i++){    //向磁盘文件"test1.txt" 输入数据 
		outfile<<array[i]<<" ";
	}
	
	outfile.close();         //关闭磁盘文件"test1.txt" 
	return 0;
}

打开test1.txt文件进行查看

       可以看到:在对ASCII文件进行写操作情况下,写入是什么样子的,那么文件的内容显示就是什么样子的。

 

读ASCII文件

如果要进行对文件数据的读取,则需要事先创建好该文件(文件与源程序同一级目录,如果不在同一级目录,需要写完整文件路径。例如: D:\\test1.c

对test2.txt文件写入内容

#include<iostream>
#include<fstream>
#include<stdlib.h>
using namespace std;

int main(){
	int a;
	ifstream infile("test2.txt",ios::in);      //定义输入文件流对象,打开磁盘文件"test2.txt"
	if(!infile){           //如果打开失败,infile返回0值 
		cerr<<"open error!"<<endl;
		exit(1);
	}
	while(infile>>a){      //如果读取文件的数据并将数据赋给a成功 
		cout<<a<<" ";      //则输出到屏幕 
	}
	cout<<endl;
	infile.close();        //关闭磁盘文件"test2.txt"
	return 0; 
}

运行结果:

 

读写ASCII文件

#include<iostream>
#include<fstream>
using namespace std;

void test01(){
    
    char* source_filename = "D:\\CodeBook\\source.txt";
    char* target_filename = "D:\\CodeBook\\target.txt";
    //创建输入文件流 
    ifstream ism(source_filename,ios::in);    //使用ifstream的构造函数 
    //或者
    //ifstream ism; 
    //ism.open(source_filename,ios::in);      //使用ifstream的open函数 
    if(!ism){
        cout<<"文件打开失败"<<endl;
    }
    //创建输出文件流 
    ofstream osm(target_filename,ios::out);
    
    //读文件
    char ch;
    while(ism.get(ch)){
        cout<<ch;
        //写文件 
        osm.put(ch);
    } 
    
    //关闭文件 
     ism.close();
     osm.close();
}

int main(){
    test01();
    return 0;
} 

 

写二进制文件

 

       二进制文件将内存中数据存储形式不加转换地传送到磁盘文件,因此它又称为内存数据的映像文件。因为文件中的信息不是字符数据,而是字节中的二进制形式信息,因此它又称为字节文件

 

对二进制文件的读写主要用  istream 类的成员函数 read 和 write 来实现。

 istream&  read  ( char * buffer,int  len);

ostream&  write (const  char * buffer ,int  len);

 

字符指针 buffer 指向内存中的一段存储空间。 len 是读写的字节数。

#include<iostream>
#include<fstream>
#include<stdlib.h>
#include<string>
using namespace std;

int main(){
	int array[10]={0,1,2,3,4,5,6,7,8,9};
	char str[10]="Hello";
	ofstream outfile("D:\\byte1.txt",ios::binary);
	if(!outfile){
		cout<<"oper error!"<<endl;
	}
	
	outfile.write((char *)array,sizeof(array));
	outfile.write((char *)str,sizeof(str));
	
	outfile.close();
	return 0;
}

打开byte1.txt进行查看

可以看到将文件打开后乱码的现象。

 

读二进制文件

打开上面创建并写好数据的byte1.txt文件读取数据。

#include<iostream>
#include<fstream>
#include<stdlib.h>
#include<string>
using namespace std;

int main(){
	int array[10];
	char str[10];
	ifstream infile("D:\\byte1.txt",ios::binary);
	if(!infile){
		cout<<"open error!"<<endl;
        abort();    //与exit函数作用相同
	}
	
	infile.read((char *)array,sizeof(array));
	infile.read((char *)str,sizeof(str));
	
	for(int i = 0;i<10;i++){
		cout<<array[i]<<" ";
	}
	cout<<endl;
	
	cout<<str<<endl;
	
	infile.close();
	return 0;
}

运行结果:

 

参考书籍:

《C++面向对象程序设计 (第二版)》谭浩强

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值