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 | 以输入输出方式打开文件,文件可读可写 |
说明:
- 新版本的I/O类库中不支持 ios::nocreate 和 ios::replace 。
- 每一个打开的文件都有一个文件指针,该指针的初始位置有I/O方式指定,每次读写都从文件指针的当前位置开始。每读入一个字节,指针就后移一个字节。当文件指针移到最后,就会遇到文件结束(文件结束符也占一个字节,其值为-1),此时流对象的成员函数eof的值为非0值(一般设为1),表示文件结束了。
- 可以用“位或”运算符“ | ”对输入输出方式进行组合。
- 如果打开操作失败,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++面向对象程序设计 (第二版)》谭浩强