一、文件输入输出
1、除了继承自iostream类型的行为之外,fstream中定义的类型还增加了一些新的成员来管理与流关联的文件
fstream fstrm(s);
//创建一个fstream并打开名为s的文件,其中s可以是string也可以是C风格字符串指针
fstream fstrm(s, mode); //和前一个构造函数类似,但按指定模式打开文件
fstrm.open(s); //打开名为s的文件,并将文件与fstrm绑定
fstrm.close(); //关闭与fstrm绑定的文件,并返回void
fstrm.is_open(); //判断与fstrm的文件是否成功打开且尚未关闭
2、每个流都有一个关联的文件模式,用来指出如何使用文件
in //读方式打开
out //写方式打开
app //每次写操作前均定位到文件末尾
ate //打开文件后立即定位到文件末尾
trunc //截断文件
binart //以二进制方式进行IO
3、用open打开文件或用文件名构造文件流对象时,都可指定文件模式
4、对文件模式有以下规定
(1)、只可对ofstream或fstream对象设定out模式;只可对ifstream或fstream对象设定in模式
(2)、ifstream关联的文件默认以in模式打开;ofstream关联的文件默认以out模式打开;fstream关联的文件默认以in和out模式打开
5、输入输出重定向
freopen("example.txt", "w", stdout); //c
二、string流
1、sstream中定义的类型还增加了一些成员管理与流相关联的string
sstream strm(s) //strm是一个sstream对象,保存string s的一个拷贝,此构造函数是explict的
strm.str() //返回strm所保存的string的拷贝
strm.str(s) //将string s拷贝到strm中,返回void
2、当我们的某些工作是对整行文本进行处理,而其他一些工作是处理行内的单词时,可以使用istringstream;当我们逐步构造输出,希望最后一起打印时,可以用ostringstream
三、具体应用
fstream iof("gpa.dat", ios::in | ios::out | ios::binary); //指定文件模式
string line;
while (getline(iof, line)) //getline从文件读行
{
name = line;
getline(iof, line);
double a, b, aN = 0, bN = 0, gpa;
istringstream is(line); //将line放到is流中
int n = 4;
cout << "GPA for " << name << " = ";
while (n--) //由于未知个数(最多4个),所以用is来输入
{
is >> a >> b;
aN += a;
bN += b * a;
}
gpa = bN / aN;
cout << fixed << setprecision(2) << gpa << endl;
}
ifstream inFile;
inFile.open("plaintext.txt"); //文件打开
ofstream outFile;
outFile.open("ciphertext.txt");
char ch;
while (!inFile.eof())
{
ch=inFile.get(); //读取、输出单个字符
outFile.put(ch + 2);
}
ifstream in;
char b1, b2, b3;
in.open("image.jpg", ios::binary);
in.seekg(12, ios::beg); //
in.read((char*)&b1, 1);//数据块输入,对于非字符数据块要强转为字符指针,第二个参数是数据大小
//write是块输出,参数与read相似
in.seekg(48, ios::beg);//用于文件定位,可以随意移动到指定位置;seekp用于文件输出流对象
in.read((char*)&b2, 1);
in.seekg(79, ios::beg);
in.read((char*)&b3, 1);
cout << hex << ((b1^b2^b3) & 0x000000ff) << endl;
ioFile.open("object.dat", ios::in | ios::out | ios::trunc | ios::binary);
Rectangle r1, r2(2, 2), r3(3, 3), r4(4, 4), r5(5, 5);
ioFile.write(reinterpret_cast<char*>(&r1), sizeof(Rectangle)); //同上