C++11-ostream
使用ostream输出流重载左移运算符,实现非标准输出;
程序是输入指从输入文件将数据传送给程序,程序的输出指的是从程序将数据传送给输出文件;
I/O流和流类库
C++输入输出包含:标准I/O、文件I/O、串I/O;
标准I/O:系统指定的标准设备的输入输出,如键盘、屏幕;
文件I/O:以外存文件为对象进行输入输出,如磁盘文件输入数据,或数据输入至磁盘文件;
串I/O:对内存中指定的空间进行输入和输出。如指定一个字符数组作为存储空间;
相比于C,C++对数据类型做严格的检查,类型不正确无法通过编译。C++中I/O操作是类型安全的,同时可扩展,有标准数据类型,或用户自定义类型;
类库
C++编译系统提供了用于输入输出的iostream(input output stream)类库;
其他相关类库如下:
fstream:对输入输出流操作所需的基本信息;
strstream:用户管理的文件的I/O操作;
**stdiostream:混合使用C和C++的I/O机制时,如将C程序转为C++程序;
iomanip:用来格式化I/O;
asdf
流对象
iostream除了定义类,还定义4种流对象
- cin:标准输入流
- cout:标准输出流
- cerr:标准错误流
- clog:标准错误流
定义流对象形式
ostream cout (stdout);
定义cout为ostream流类对象,即把标准输出设备stdout作为参数,流对象与标准输出设备(如显示器)建立联系;
iostream中运算符重载
iostream头文件重载了左移和右移运算符,用于标准数据类型的输入和输出;形如>>a即为将数据放入a对象中;
<<a即将a对象中存储数据取出;
标准I/O流
标准I/O对象:cin、cout、cerr、clog;
标准输入流
标准输入流对象cin,对象中方法形式如下
#include <iostream> //输入输出流头文件
//using namespace std;
//标准输入设备:键盘
void main(){
std::cin.get(); //一次只读取一个字符
std::cin.get(一个参数);//读一个字符
std::cin.get(三个参数);//可读字符串
std::cin.getline();
std::cin.ignore();
std::cin.peek();
std::cin.putback();
}
sdf
标准输出流
标准输入流对象cout,对象中方法形式如下
#include <iostream> //输入输出流头文件
//using namespace std;
//标准输出设备:显示器
void main(){
std::cout.flush();
std::cout.put();
std::cout.write();
std::cout.width();
std::cout.fill();
std::cout.set();
}
具体事例说明
C++格式化输出,C++输出格式控制
输出数据时,系统使用默认数据类型作为输出的格式,若要求其他格式输出,可设置输出格式;
- 使用控制符;
- 使用流对象的有关成员函数;
控制符方法具体事例形式如下
#include <iostream> //输入输出流头文件
using namespace std;
//标准输出设备:显示器
void main(){
int num;
cout<<"input a number:";
cin>>num;
//十进制形式输出
cout<<"dec"<<dec<<num<<endl;
//十六进制形式输出
cout<<"hex"<<hex<<num<<endl;
//八进制形式输出
cout<<"oct"<<setbase(8)<<num<<endl;
//指定域宽为输出字符串
char *country = "china";
cout<<setw(10)<<country<<endl;
//指定域宽为输出字符串,空白用**填充
cout<<setfill('*')<<setw(10)<<country<<endl;
double pi = 22.0/7.0;
//按指数形式输出8位小数
cout<<setiosflags(ios::scientific)<<setprecision(8);
//改为4位小数
cout<<"pi="<<setprecision(4)<<pi<<endl;
//改为小数形式输出
cout<<"pi="<<setiosflags(ios::fixed)<<pi<<endl;
system("pause")
}
流对象的成员函数控制输出格式
#include <iostream> //输入输出流头文件
using namespace std;
//标准输出设备:显示器
void main(){
int a=21;
cout.setf(ios::showbase);//显示基数符号(0x或)
cout<<"dec:"<<a<<endl; //默认以十进制形式输出a
cout.unsetf(ios::dec); //终止十进制的格式设置
cout.setf(ios::hex); //设置以十六进制输出的状态
cout<<"hex:"<<a<<endl; //以十六进制形式输出a
cout.unsetf(ios::hex); //终止十六进制的格式设置
cout.setf(ios::oct); //设置以八进制输出的状态
cout<<"oct:"<<a<<endl; //以八进制形式输出a
cout.unsetf(ios::oct);
char *pt="China"; //pt指向字符串"China"
cout.width(10); //指定域宽为
cout<<pt<<endl; //输出字符串
cout.width(10); //指定域宽为
cout.fill('*'); //指定空白处以'*'填充
cout<<pt<<endl; //输出字符串
double pi=22.0/7.0; //输出pi值
cout.setf(ios::scientific); //指定用科学记数法输出
cout<<"pi="; //输出"pi="
cout.width(14); //指定域宽为
cout<<pi<<endl; //输出pi值
cout.unsetf(ios::scientific); //终止科学记数法状态
cout.setf(ios::fixed); //指定用定点形式输出
cout.width(12); //指定域宽为
cout.setf(ios::showpos); //正数输出“+”号
cout.setf(ios::internal); //数符出现在左侧
cout.precision(6); //保留位小数
cout<<pi<<endl; //输出pi,注意数符“+”的位置
system("pause")
}
小结
- 成员函数width(n)和控制符setw(n)只对其后的第一个输出项有效。如:
cout. width(6);
cout <<20 <<3.14<<endl;
输出结果为 203.14 - 在用成员函数setf和 控制符setiosflags设置输出格式状态后,若改设置为同组的另一状先终止原来设置的状态。
系统默认指定为dec,要改变为hex或oct,先用unsetf 函数终止原来设置。如由于未终止dec格式,hex和oct的设置不起作用。 - 用setf 函数设置格式状态时,包含两个或多个格式标志,格式标志在ios类中被定义为枚举值,每一个格式标志以一个二进位代表,用位或运算符“|”组合,如
cout.setf(ios::internal I ios::showpos); //包含两个状态标志。
4)控制符是在头文件iomanip中定义的用控制符时,须包含iomanip头文件。cout流的成员函数是在iostream 中定义的,只需包含头文件iostream,不必包含iomanip。
文件IO
文件I/O涉及如下
文件输入流 ifstream
文件输出流 ofstream
文件输入输出流 fstream
文件打开方式
文件流的状态
文件流的定位(文件输出、输入指针)
文本文件和二进制文件
文件流及其对象
asdf
输入输出以系统指定的标准设备(输入设备为键盘,输出设备为显示器)为对象;
文件流常以磁盘文件为对象,文件相关的输入输出类定义在fstream中,继承关系如下;
文件设别未在fstream中定义标准默认设备(如cin、cout),需用户定义一个类对象;
- ifstream类用于从磁盘文件输入;
- ofstream类用于从磁盘文件输出;
- fstream类用于磁盘文件输入输出;
文件打开及关闭
打开文件
打开文件是文件读写前必须的工作;
用于关联文件流对象和磁盘文件,便于文件流’流向’指定的磁盘文件;
指定文件的工作方式,如文件为输出或输入,ASCII或二进制文件;
打开文件两种方式
1)调用文件流成员函数open
//定义输出文件流类对象
ofstream outfile;
//关联文件流和file1.dat,I/O模式为输出方式打开文件即xxx.open(“磁盘文件名”,输入输出方式)
outfile.open("./fi1e1.dat",ios::out);
2)定义文件流对象时指定参数
声明文件类对象时指定参数,调用对象的构造函数打开文件,形式如下
//作用及形式与open相同
ostream outfile("file2.dat",ios::out);
具体输入输出方式如下
1)新版I/O类库不提供nocreate和noreplace;
2)每个打开文件由对应的文件指针,指针位置有I/O方式指定,每次读写从文件指针的当前位置开始,读入一个字节,指针后移一个字节,直到遇到文件结束符EOF(占一个字节,值为-1),流对象的成员函数eof的值为非0即文件结束;
3)使用位或运算符组合输入输出方式,注意不能组合互斥方式;
4)若文件打开失败,open返回值为0,对象构造函数方式返回值为0;
关闭文件
完成对已打开的磁盘文件读写操作后,使用成员函数close关闭文件,
//将输出文件流所关联的磁盘文件关闭
outfile.close();
关闭时解除该磁盘文件与文件流的关联,原设置的工作失效;
对ASCII文件的读写操作
ASCII文件指文件的每个字节以ASCII码形式存放数据,即一个字节存放一个字符;
可用文件流的put、get、getline等成员函数输入输出字符,其中文件流成员函数put输出单个字符,get()函数读入一个字符、get()函数读入一行字符。
#include<iostream>
#include "fstream"
using namespace std;
int main(){
char FileName[80];
char buffer[255];
cout<<"input a file name: ";
cin>>FileName;
ofstream fileout(FileName,ios::app);
if(!fileout){
cout<<"open file failed!";
system("pause");
exit(1);
}
fileout<<"wuhan come on!";
//从键盘输入
cin.getline(buffer,255);
fileout<<buffer<<"\n";
fileout.close();
ifstream filein(FileName);
cout<<FileName<<"\n";
char ch;
while(filein.get(ch))
cout<<ch;
filein.close();
system("pause");
return 0;
}
input a file name: 11
11
wuhan come on!
wuhan come on!
wuhan come on!
请按任意键继续. . .
ofstream类的默认构造函数
ofstream::ofstream(constchar *filename,int mode = ios::out,int penprot = filebuf::openport);
openport属性
0 表示普通文件、打开访问;
1 表只读文件;
2 表隐含文件;
4 表系统文件
fstream类可同时对文件进行读写,所以在对它的对象初始化时要指定mode和openport参数;
对二进制文件读写操作
二进制文件又称内存数据的映像文件,是将内存中数据存储形式不加转换地传送到磁盘文件,文件信息时字节中的二进制形式的信息,又称字节文件;
二进制文件读写主要用istream类的成员函数read和write,函数原型:
//字符指针buffer指向内存一段存储空间,len为读写的字节数
istream& read(char *buffer,int len(;
ostream& write(const char *buffer,int len);
#include<iostream>
#include "fstream"
using namespace std;
int main(){
char fileName[255] = "./binary.dat";
//fout:写文件流对象
ofstream fout(fileName,ios::binary);
if(!fout){
cout<<"open file error"<<fileName<<"\n";
return(1);
}
fout.write((char*)fileName,sizeof(fileName));
fout.close();
cout<<"save character to binary file successfully"<<endl;
//fin:读文件流对象
ifstream fin(fileName,ios::binary);
if(!fin){
cout<<"open file error"<<fileName<<"\n";
return(1);
}
char tmp[55];
fin.read((char*)tmp,sizeof(tmp));
cout<<tmp<<endl;
system("pause");
return 0;
}
save character to binary file successfully
./binary.dat
请按任意键继续. . .