1.IO类型在三个独立的头文件中定义:iostream定义读写控制窗口的类型,fstream定义读写已命名文件的类型,而sstream定义的类型则用于读写存储在内存中的string对象.
2.IO对象不可复制或赋值,即表明
①无法将其存储在容器中
②形参或返回类型也不能为流类型,如果要传递或返回IO对象,则必须传递或返回指向该对象的指针或引用
3. IO标准库管理一系列条件状态成员,用来标记给定IO对象是否处于可用状态,或者碰到了哪种特定的错误。标准库定义的一组函数和标记,提供访问和操纵流状态的手段。
strm::iostate 机器相关的整型名,由各个iostream类定义,用于定义条件状态
strm::badbit strm::iostate类型的值,用于指出被破坏的流
strm::failbit strm::iostate类型的值,用于指出失败的IO操作
strm::eofbit strm::iostate类型的值,用于指出流已经到达文件结束符
s.eof() 如果设置了流s的eofbit值,则该函数返回true
s.fail() 如果设置了流s的failbit值,则该函数返回true
s.bad() 如果设置了流s的badbit值,则该函数返回true
s.good() 如果流s处于有效状态,则该函数返回true
s.clear() 将流s中的所有状态值都重设为有效状态
s.clear(flag) 将流s中的某个指定条件状态设置为有效。flag的类型是strm::iostate
s.setstate(flag) 给流s添加指定条件。flag的类型是strm::iostate
s.rdstate() 返回流s的当前条件,返回值类型为strm::iostate
流必须处于无错误状态,才能用于输入或输出。
badbit标志着系统级的故障,出现这类错误,则该流通常就不能再使用了,如果出现的是failbit可恢复的错误,通常是可以修正的
流的状态有bad,fail,eof和good操作揭示前三个和good相反;clear和setstate操作用于改变条件成员的状态
4.下面几种情况将导致缓冲区的内容被刷新,即写入到真实的输出设备或者文件:
①程序正常结束.作为main返回工作的一部分,将清空所有输出缓冲区.
②在一些不确定的时候,缓冲区可能已经满了,在这种情况下,缓冲区将会在写下一个值之前刷新
① 用操作符显式的舒心缓冲区,如endl(其实还有flush和ends)
② 在每次输出操作执行完后,用unitbuf操纵符设置流的内部状态从而清空缓冲区
③ 可将输出流与输入流关联起来.在这种情况下,在读输入流时将刷新缓冲区
警告:如果程序崩溃了,则不会刷新缓冲区
这一章在平时编程时一般是简单的使用,用于对文件的读写.
例子:
●创建并向文件写入信息:
方式一:
#include <fstream.h>
#include <iomanip.h>
void main()
{
ofstream f1("a.txt");
if (!f1)
{
return;
}
f1<<"姓名:"<<"袁孙良"<<endl;
f1<<"性别:"<<"男"<<endl;
f1.close();
}
方式二:
#include <fstream.h>
void main()
{
ofstream fin("a.txt");
if (!fin)
{
cout<<"File open error";
return;
}
char c[80] = "我是一个兵!";
fin.write(c,80);
fin.close();
}
●从文件中读取信息:
方式一:
#include <fstream.h>
void main()
{
fstream f("a.txt",ios::out);
f<<123<<3.14<<'A'<<"How are you";
f.close();
f.open("a.txt",ios::in);
int i;
double d;
char c;
char s[20];
f>>i>>d>>c;
f.getline(s,20);
cout<<i<<" "<<d<<" "<<c<<" "<<s<<endl;
f.close();
}
方式二:
#include <memory.h>
#include <fstream.h>
void main()
{
ifstream fin("a.txt",ios::nocreate);
if (!fin)
{
cout<<"File open error";
return;
}
char c[80];
memset(c,0,80);
while (!fin.eof())
{
fin.read(c,80);
cout<<c<<endl;
}
fin.close();
}
简单的复制文件:
#include <fstream.h>
void main()
{
ifstream fin("a.txt",ios::nocreate|ios::binary);
if (!fin)
{
cout<<"File open Error"<<endl;
return;
}
ofstream fout("b.txt",ios::binary);
char c[1024];
while (!fin.eof())
{
fin.read(c,1024);
fout.write(c,fin.gcount());
}
fin.close();
fout.close();
}