面向对象途径输入输出
输入输出概述
- 程序运行需要的数据需要从外设(鼠标键盘文件)中获得,运行结果也往往需要输出到外设中(显示器,打印机,文件)。
- 输入输出操作并不是语言定义的成分,而是封装在标准库中,例如C中的printf,scanf(需要自己说明对象的类型,比较繁琐,并且容易出错);C++中的cin(istream),cout(ostream)(无需自己说明对象的类型,会自动判断类型包括个数)。
- 输入输出是基于字节流的操作,输入时逐个字节流入到计算机内存中,输出时逐个字节从内存流出到外设中。
- 无论输入输出,实际上都是带有缓冲区的。
- 输入时一大块数据先加入缓冲区,然后从缓冲区逐步输入
- 输出时,数据先放在缓冲区,缓冲区满了再实际输出到外设
- 分类:主要有三类
- 面向控制台(istream,ostream->iostream)
- 面向文件(ifstream,ofstream->fstream)
- 面向字符串变量(istrstream,ostrstream->strstream)(现在已经被string类取代)
面向控制台输入输出
- 基于函数库的输入输出
- 输入 getcahr(char *),gets(char *),scanf(“format”,[参数]);//注意此时写类型时要加% %d整形数 %f浮点数 %c字符 %s字符指针
- 输出 putchar(char *),puts(char *),printf(“format”,[参数]);
- 特殊的不带缓存的输入输出,getch(),putch();
- 基于I/O类库的输入输出
- cin
- cout,clog(日志信息),cerr(错误信息)
- 对输出格式进行操作
setprecosion(int n)//控制浮点数输出的位数
也可以重载<<或者>>以实现对某一特殊对象的输出
例如
class A
{
int x,y;
public:
friend ostream& operator << (ostream& out,const A& a)
};
ostream& operator << (ostream& out,const A& a)
{
out<<a.x<<','<<a.y;
return out;
}
A a1,a2;
cout<<a1<<endl<<a2<<endl;
面向文件输入输出
- 解决需要永久存储某些数据的需求,一般存储在磁盘、磁带、光盘中,只学习以文件形式存储数据
- 文件数据存储数据有两种方式
- 二进制方式(binary):没有任何显示含义的纯二进制文本,一般用于存储任意结构的数据,数据由其他应用程序来解释
- 文本方式(text):包含可显示的字符和有限的几个控制字符(\r,\n,\t),一般用来存储具有“行”结构的数据,可以用记事本打开查看
- 举例来说,1234567在文本方式中以ASCII码形式存储,在二进制文本中以原码形式存储(一个数字占四个字节)
- 文件的读写过程
- 打开文件
- 文件读写
- 关闭文件
- 文件的输出操作(需要#include以及#include)
//直接方式
ofstream out_file(<文件名>,[打开方式]);
//间接方式
ofstream out_file;
out_file.open(<文件名>,[打开方式]);
- 打开方式:
- ios::out,打开文件用于写操作,如果外部文件以及存在,那么先清除它的内容,否则,先创建该文件,是默认打开方式
- ios::app,打开文件用于添加操作,如果外部文件不存在,那么先创建该文件
- ios::binary 以二进制方式打开文件
- 判断文件是否打开成功
if(!out_file)//或者out_file.fail()或者!out_file.is_open()
{
//失败处理
}
int x=12;
double y=12.3;
//以文本形式输出
out_file<<x<<" "<<y<<endl;
//以二进制形式输出
out_file.write((char *)&x,sizeof(x));
out_file.write((char *)&y,sizeof(y));
out_file.close();
//最后一定要关闭文件以使内存缓冲区的内容写到磁盘当中
- 作用就是使输出结果导入到文件中
- 文件的输入操作
//首先需要打开文件
//直接方式
ifstream in_file(<文件名称>,[打开方式]);
//间接方式
ifstream in_file;
in_file.open(<文件名称>,[打开方式]);
- 打开方式一样有两种为ios::in,ios::binary
//文件成功打开之后,可以使用>>操作符来进行文件的输入操作
ifstream in_file("D:\\study.txt", ios::out);
int x = 1;
double y = 12.3;
if(!in_file)
{
cout << "文件打开失败" << endl;
exit(-1);
}
else
{
in_file >> x >> y;
cout << x << endl
<< y << endl;
}
//在文件末尾处需要判断是否正确读入了数据
bool flag = true;
flag = in_file.fail();
in_file.close();
- 既能输入又能输出的对象
- 创建一个fstream对象,则既可以输入也可以输出