输入和输出流

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")
}

小结

  1. 成员函数width(n)和控制符setw(n)只对其后的第一个输出项有效。如:
    cout. width(6);
    cout <<20 <<3.14<<endl;
    输出结果为 203.14
  2. 在用成员函数setf和 控制符setiosflags设置输出格式状态后,若改设置为同组的另一状先终止原来设置的状态。
    系统默认指定为dec,要改变为hex或oct,先用unsetf 函数终止原来设置。如由于未终止dec格式,hex和oct的设置不起作用。
  3. 用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
请按任意键继续. . .
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值