流的概念
- 流(stream):流操作,简称流
- 在计算机内存中,数据从内存的一个地址移动到另一个地址称为数据流动---流操作。
- 是通过缓冲区(buffer)机制实现的。
- 缓冲区(buffer):内存的一块区域,用做文件与内存交换数据。
- 在C++中,把输入设备,输出设备看成一种文件
- 标准输入流对象cin;标准输出流对象cout
头文件
- iostream.h包含操作所有输入/输出流所需的基本信息
- 含有cin,cout,ceer,clog对象,提供无格式和格式化的I/O
- ceer与标准错误输出设备(默认为显示器)相关联(非缓冲方式)
- clog与标准错误输出设备(默认为显示器)相关联(非缓冲方式)
- iomanip.h包含格式化I/O操纵算子,用于指定数据输入输出的格式
- fsream.h处理文件信息,包括建立文件,读/写文件的各种操作接口
使用操纵符进行输入输出格式控制
使用ios类中的成员函数进行输入输出格式控制时,每个函数的调用都要写一条语句,不能将其嵌入到输入输出语句中,C++提供了另一种I/O格式控制的方法
(一)C++预定义的操作符--iostream中的操作符
- dec 以十进制输入输出整型数,用于输入输出
- hex 以十六进制输入输出整型数,用于输入输出
- oct 以八进制输入输出整型数,用于输入输出
- ws 输入时跳过开头的空白符,用于输入
- endl 插入一个换行符并且刷新输出流,用于输出
- ends 插入一个空字符,用以结束一个字符串,用于输出
(二)C++预定义的操作符--iomanip中的操作符
- flush 刷新一个输入流,用于输入
- setbase(int n)把转换基数设置为n(n取0,8,10,16),n的缺省值(默认值)为0(以十进制形式输出)
- resetiosflags(long f) 关闭由参数f指定的格式标志,用于输入输出
- setiosflags(long f) 设置由参数f指定的格式标志,用于输入输出
- setfill(char c) 设置填充字符
- setprecision(int n) 设置输出数据的小数位数,用于输入输出
- setw(int n) 设置域宽,用于输入输出
其中long f 格式标志
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
double values[]={1.2,4.9,6.23,5.10,11.11};
char *names[]={"zhangsan","lisi","wangwu","zhaoliu","miao"};
for(int i=0;i<5;i++)
{
cout<<setiosflags(ios::left)<<setw(10)<<setfill('*')<<names[i]<<resetiosflags(ios::left)<<setw(7)<<setfill(' ')<<values[i]<<endl;
}
double m=2.33333;
cout<<setiosflags(ios::fixed)<<setprecision(3)<<m<<endl;
return 0;
}
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
for(int n=1;n<=7;n++)
{
cout<<setfill(' ')<<setw(n)<<" "<<setfill('m')<<setw(15-2*n)<<"m"<<endl;
}
return 0;
}
文件I/O流
文件处理的三个流类
ifstream 文件输入流类,用于读文件
ofstream 文件输出流类,用于写文件
fstream 文件输入/输出流类,用于读写文件
程序中进行文件操作时加头文件"fstream.h"
ifstream in;
ofstream out;
fstream both;
文件的打开
open函数
ifstream in;
ofstream out;
fstream both;
//打开文件
in.open("d://test.cpp");//默认ios_base::in
//文件异常处理
if(!in)
{
return -1;
}
out.open("d://test2.cpp");//默认ios_base::out
if(out.fail()){return -1;}
both.open("d://test3.cpp",ios_base::in|ios_base::out);
char c;
while(in)
{
in.get(c);
out<<c;
}
//关闭文件
in.close();
out.close();
文件的读写
文本文件 in.get(char) out.put(char ch);
二进制文件 read(),write()
fstream f("d://text.dat",ios::in|ios::out|ios::binary);
int i;
for(i=0;i<20;i++)
{
f.write((char*)&i,sizeof(int));
}
long pos=f.seekp();
for(i=20;i<40;i++)
{
f.write((char*)&i,sizeof(int));
}
f.seekg(pos);
f.read((char*)&i,sizeof(int));
cout<<"the data store is"<<i<<endl;
f.seekg(0,ios::beg);
for(i=0;i<40;i++)
{
f.read((char*)&i,sizeof(int));
cout<<i<<ends;
cout<<endl;
}