一、读、写和输入、输出的关系
(1)输入:读操作,将文件中的内容读到内存中。
(2)输出:写操作,将内存中的数据写到文件中。
二、打开文件方式
取值 | 含义 | 作用 |
ios_base::in | input | 以输入方式打开文件(默认方式) |
ios_base::out | output | 以输出方式打开文件。若已存在该文件,则将其内容全部清空 |
ios_base::app | append | 以输出方式打开文件,写入的数据添加在文件末尾(默认是指向开头) |
ios::base::ate | at end | 打开一个已有的文件,文件指针指向文件末尾 |
ios_base::binary | binary | 二进制文件,默认为ASCII文件 |
ios_base::trunc | truncate | 打开一个文件,若文件已存在,则将其内容全部清空;若文件不存在,则建立新文件。 若指定ios::out方式而未指定ios::app、ios::ate、ios::in时,默认为此方式 |
说明:
(1)可以用位或运算(|)对openmode进行组合。
(2)打开文件时操作可能失败,如果打开操作失败,open函数返回值为0(假)。如果是构造函数打开文件且打开操作失败,则流对象的值为0(空对象)。
(3)每一个打开的文件都有一个文件指针,该指针的起始位置要么在文件末尾,要么在文件开头。每次读写都从文件指针的当前位置开始。每读写一个字节,指针就自动向后移一个字节。当文件指针移到最后,就会遇到文件结束EOF(文件结束符)。
三、文件关闭以及操作文件的成员函数
(1)void close();//关闭文件
(2)文件输入流
函数(文件输入流) | 作用 |
istream& read(char* s,streamsize n) | 从文件中读n个字节到s |
streampos tellg() | 返回文件指针的位置 |
istream& seekg(streampos,pos) | 移动文件指针到pos位置 |
istream& seekg(streamoff off,ios_base::seekdir dir) | 以dir参照off偏移移动文件指针 |
(3)文件输出流
函数(文件输出流) | 作用 |
ostream& write(const char* s,streamsize n) | 输出s的n个字节到文件 |
streampos tellp() | 返回文件指针的位置 |
ostream& seekp(streampos ,pos) | 移动文件指针到pos位置 |
ostream& seekp(streamoff off,ios_base::seekdir dir) | 以dir参照off偏移移动文件指针 |
flush() | 文件输出流刷新 |
四、文件状态
文件流提供四个成员函数检查文件状态:
bool eof(); bool bad();
bool fail(); bool good();
说明:如果文件已到末尾,返回真(1),否则返回假(0)。如果在读写文件过程中出错,bad函数返回true。如对一个不是为写状态打开的文件进行写入,或者是写入的设备没有剩余空间。除了与bad函数同样的情况下会返回true以外,格式错误时fail函数也会返回true。
如果调用以上任何一个函数(前3个函数)返回true的话,good函数返回fasle。
五、文件操作举例
(1)对ASCII文件操作。
对ASCII文件的读写操作可以用以下两种方法:
1、用流插入(<<)运算符和流提取(>>)运算符输入输出标准类的数据。
2、用流对象成员函数get、getline、put等进行字符的输入输出。
实例:将源文件每行文本添加一个行号输出到目的文件中。
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
int main()
{
char s1[5000];
int cnt=0;
ifstream inf("c.cpp");//打开源文件读
if(!inf.fail())
{
ofstream outf("b.cpp");//创建目的文件写
while(!inf.eof())//是否到源文件末尾
{
inf.getline(s1,sizeof(s1)-1);//读源文件字符串
outf<<setfill('0')<<setw(4)<<++cnt<<" "<<s1<<endl;
}
outf.close() ;
inf.close();
}
return 0;
}
注意:文件c.app要自己先创建好。
(2)对二进制文件操作
二进制文件打开时要用ios_base::binary指定为以二进制形式读取和存储
二进制文件除了可以作为输入文件或输出文件外,还可以是既能输入又能输出的文件。这是和ASCII文件不同的地方。
对二进制文件的读写操作主要是使用流成员函数read和write。
实例:复制源文件内容到目的文件(二进制文件)
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
int main()
{
char src[260],dest[260],buff[16384];//读写缓冲达到16k
ifstream inf("book.dat",ios_base::in|ios_base::binary);//二进制读
if(!inf.fail())
{
ofstream outf("out.dat",ios_base::out|ios_base::binary);//二进制写
while(!inf.eof())
{
inf.read(buff,sizeof(buff));
outf.write(buff,inf.gcount());//按实际读到的字节写入
cout<<buff<<endl;
}
outf.close();
inf.close();
}
return 0;
}