输入输出流
C++的输入输出流是IO系统向用户提供一个统一的接口,它隔离了具体的设备差异。
包括标准输入输出流和文件流。
标准输入输出流
istream是输入流类,cin就是istream类型的对象。
ostream是输出流类,cout是ostream类型的对象。
在C++中允许用户重载运算符“<<”和“>>”,实现对象的输入和输出。
重载这二个运算符时,在对象所在的类中,将重载这二个运算符的函数说明该类的友元函数。
C++在头文件fstream.h中定义了C++的文件流类体系 ,当程序中使用文件时,要包含头文件fstream.h 。
其中定义了各种文件操作运算符及函数。
在涉及文本文件的操作时,将输入文件看成键盘,将输出文件看成显示器,格式不变。只需在程序中增加打开与关闭文件的语句。
文件可以分为两大类:文本文件、二进制文件。
定义文件对象
有三种类型的对象:
fstream file;//既可读又可写。
ifstream infile;//可读不可写。
ofstream outfile;//可写不可读。
打开文件
ifstream infile;
infile.open(“C:\\myfile.txt"); //与文件建立关联
ofstream outfile;
outfile.open(“myoutfile.txt”);
读写文件
Std::string str;
Infile>>str;//从文件流中输入。
Outfile<<str;
关闭文件
Infile.close();
Outfile.close();
关闭后释放文件对象,取消与文件的关联。
定义fstream对象后,既可以对文件读又可以写。因此在open时需要给定打开的方式:
fstream file1,file2;//定义了两个文件类的对象
file1.open(“file1.txt”, ios::in);//用于输入
pile2.open(“file2.txt”, ios::out);//用于输出
在open时常常会因为文件不存在,或正在被占用而打开失败。
可以通过对文件对象进行判断来得知是否打开成功。
file1.open(“file.txt”, ios::in);
if(!file1)
{
//文件打开失败。
}
有一个约定:
在打开文件进行读时,若文件不存在则打开失败。
写时,若文件不存在则新建一个文件。若存在则删除原来的文件的内容。
文本文件与二进制文件读取方法不同:
读写文本文件
从文件读取一个字符:file.getch(ch);
读取一行数据:File.getline(str);
从文件读取时,当读取到文件尾时,函数返回值为0,可以据此来判断循环结束。
向文件写入一个字符:file.put(ch);
实例,实现两个文件的拷贝
打开二进制文件
若在文件的open方法时没有特别说明,默认打开的文本文件,若要打开二进制文件,则要特别说明。
fstream infile,outfile;
infile.open(“inf1.dat”, ios::in| ios::binary);
outfile.open(“outf1.dat”, ios::out| ios::binary);
ios::out和ios::in表示IO模式。枚举类型,多个枚举值可以使用运算符”|“组合使用。
二进制文件的关闭
关闭方法都一样,调用close方法。
二进制文件的读写
二进制文件的读写与文本文件不同,使用专门的方法。
infile.read( char *buff, int nNum);
buff存储数据的缓冲,nNum为要读取的长度,返回实际读取的数据长度。
infile.read(&Stuinfo, sizeof(Stuinfo));
infile.read(pBuff, 1024*sizeof(char));
向文件写入数据:
outfile.write( pBuff, nLen );
write返回实际写入的数据长度。
二进制文件的结束
infile.eof( )
当到达文件结束位置时,该函数返回一个非零值;否则返回零。
文件指针
打开文件之后,读取或写入一段数据之后,文件指针都会移动到读取或写入的数据的末尾。
如file.read(pBuff, 1024);
读取成功之后,文件指针向后偏移1024字节。
file.write(pBuff, 10);
写入成功之后,文件指针向后偏移10个字节。
读写方法可以自动的移动文件指针,除此之外还可以通过一个专门的函数随机的移动文件指针。
infile.seekg(nNum, ios::cur);
nNum为移动的字节数。
ios::cur表示从当前位置。还有另外两个相对位置:ios::begin ,ios::end;
infile.seekg(10, ios::begin);//相对文件开始将文件指针移动10个字节。
infile.seekg(-20, ios::end);//相对文件结束,向前移动20字节
实例,实现两个二进制文件的拷贝。