⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ex23.cpp

📁 C/C++程序设计教程
💻 CPP
字号:

        //第23章     C++的输入输出类库	

	
   // [例23.1] 定义插入运算符和提取运算符函数
	# include<iostream.h>
	class CType
	{		   int x,y;
	 public:   long m,n;
			   CType(int i,int j){x=i;y=j;}
     friend ostream&   operator<<( ostream& out,const CType& ) ;
	};	
	ostream&   operator<<(ostream& out,const CType& r)
	{	out<<"[x,y]="<<r.x<<","<<r.y<<endl; //全局友元函数操作CType类所有的成员
		out<<"[m,n]="<<r.m<<","<<r.n<<endl;
		return out;
	}       // 对象表达式cout<<obj转换为函数调用operator<< (cout,obj)
	istream&   operator>>(istream& in, CType& r)
	{	in>>r.m>>r.n; //全局函数操作CType类公共的成员
		return in;
	}       // 对象表达式cin>>obj转换为函数调用operator>> (cin,obj)
   void main()
	{	CType obj(100,200);          /*程序运行输出结果:           */
		cout<<"Please Enter 2 Integer:"; /*Please Enter 2 Integer:300 400( */
	    cin>> obj;                  /*[x,y]=100,200                */
		cout<<obj;                  /*[m,n]= 300,400               */
	}

//[例23.2]操作算子的hex,oct,dec 的用法
	 # include<iostream.h>   //操作算子和相应的成员函数执行相同的功能
    signed    short a=65535; //操作算子作为右操作数插入流对象cout的连续调用中
	unsigned  short b=-1;   //成员函数仅单独调用
	void main()	
	{cout<<dec<<a<<','<<dec<<(unsigned  short)a<<','<<hex<<a<<','<<oct<<a<<';';	
	 cout<<dec<<(signed  short)b<<','<<dec<<b<<','<<hex<<b<<','<<oct<<b<<endl;
	}  //输出: -1,65535,ffff,177777; -1,65535,ffff,177777
//[例23.3] ostream类操作算子的用法
	# include<iostream.h>
    inline ostream& cp(ostream& p)   { return  p<<"++++" ; }
    inline ostream& cs(ostream& s)   { return  s<<"SSSS " ; }
	inline ostream& bell(ostream& b)  { return  b<<'\a' ;     }
	inline ostream& tab(ostream& t)   { return  t<<'\t' ;     }
    void show(ostream& (*f)(ostream& ))
	{	 cout<<1<<f<<2<<f<<3<<f<<bell<<"  ";	}
	void main()	{  show(tab);   show(cp);	     show(cs);	}
//[例23.4] 成员函数precision设置输出的精度
    # include<iostream.h>
    const double d=1.234567890123456;
	void show(int n)
	{	   int k=cout.precision(n); //k得到原先的精度值,n设置新的精度
    	cout<<k<<" : "<<n<<" : "<<d<<"+++";
	}    //注意cout<<d;输出:1.23457即缺省精度为6。
	void main()	{ show(0);  show(4);  show(7);  show(9);	}
//[例23.5] 操纵算子setprecision设置输出的精度
    # include<iostream.h>
    # include<iomanip.h>
    const double d=1.234567890123456;
	void show(int n)	{	cout<<setprecision(n)<<d<<'\t';	}
	void main()	{ show(0);   show(1);   show(2);   show(3);	}
//[例23.6] setf和unsetf函数设置格式控制转换标志
    # include<iostream.h>    
    const double x=1.23456789,y=1.23456789e5;   
	void show(int n)	{cout<<n<<"."<<x<<'\t'<<y<<'\n';	}
	void main()
	{const int floatfield=ios::scientific|ios::fixed;  /*          输出结果:     */
	 cout.setf(ios::dec);           show(1);    /*1. 1.23457	         123457*/
	 cout.setf(ios::scientific);	       show(2);   /*2. 1.234568e+000	 1.234568e+005*/
     cout.setf(ios::scientific,floatfield);show(3);   /*3. 1.234568e+000    1.234568e+005*/
     cout.unsetf(ios::scientific);     show(4);   /*4. 1.23457	         123457*/
	 cout.setf(ios::fixed,floatfield);   show(5);   /*5. 1.234568	     123456.789000*/
	}
   // [例23.7] flags成员函数设置格式转换控制标志
    # include<iostream.h>    
    const double x=1.23456789,y=1.23456789e5;    
	void show(char n)	{cout<<n<<".format:"<<x<<'\t'<<y<<'\n';	}
	void main()
	{  enum{ floatfield=ios::scientific|ios::fixed};     show('a');
	  cout.flags(ios::scientific);	                  show('b');
	  long  n=cout.flags(ios::scientific&floatfield);   show('c');
      cout.flags(n^ios::scientific);                  show('d');
	  cout.flags(ios::fixed&floatfield);              show('e');
	}
   // [例23.8] 操作算子实现格式转换控制
    # include<iostream.h>    
    # include<iomanip.h>
    const double x=1.23456789,y=1.23456789e5;    
	void show(char n)	{cout<<n<<".format:"<<x<<'\t'<<y<<'\n';	}
	void main()
	{enum{ floatfield=ios::scientific|ios::fixed};           show('a');
	 cout<<setiosflags(ios::scientific);	                  show('b');
	 cout<<setiosflags(ios::scientific&floatfield);          show('c');
     cout<<resetiosflags(ios::scientific);                 show('d');
	 cout<<setiosflags(ios::fixed&floatfield);             show('e');
	}
///	[例23.9] 字符填充和宽度、对齐控制
	# include<iostream.h>
	# include<iomanip.h>
	void main()	                       //下面用(醒目地表示空格。
    { cout.setf(ios::right);cout.width(5);cout<<12<<','<<123456; //输出:(((12,123456
	  cout.width(5);cout.fill('0');cout<<12<<','<<123456;      //输出:00012,123456
	  cout.setf(ios::left);cout<<setw(5)<<12<<','<<123456;   // 输出:12(((,123456
	  cout<<setw(5)<<setfill('+')<<12<<','<<123456;        // 输出:12+++,123456
     }
///[例23.10] 格式转换处理一个结构变量
	#include<fstream.h>
    typedef struct  SData
    {	  int		nLineset; float	 fAdjust;int nPoint;
	     float	       fXa;	float  fYa;	 float	fZa;	
	} CData;
	void OutputData(const  char *filename,const CData &d )
	{  ofstream fout; 
	   fout.open(filename,ios::out);
   	   fout<<d.nLineset<<" "<<d.fAdjust<<" "<<d.nPoint<<" ";//1
	   fout<<d.fXa<<" "<<d.fYa<<" "<<d.fZa<<endl;            //2
	   fout.close();       
	}
    void InputData(const  char *filename,CData &d )
	{ ifstream fin;
	  fin.open(filename,ios::in);  
      fin>>d.nLineset>>d.fAdjust>>d.nPoint;   //1
	  fin>>d.fXa>>d.fYa>>d.fZa;            //2
	  fin.close();       
    }	  	
	void main(void)
	{ 	CData s={1,2,3,4,5,6};  			OutputData("c:\\sdata.out",s);
        CData d;              
		InputData("c:\\sdata.out",d);          OutputData("c:\\cdata.out",d);       	  
	}
///[例23.11] get.cpp算例(要求这个源程序以文件名get.cpp保存C根目录上)
	# include <fstream.h>    
	void main(void)
	{   ifstream  fin("c:\\get.cpp",ios::in); \*两个斜杠\\构成转义序列*\	
		if(fin.fail()) {cout<<"open failed";return;}         
		int i=0;
		char buffer[512];
		while(!fin.eof() && i<512) 
			buffer[i++]=fin.get();	//   等价于fin.get(buffer[i++]);
		buffer[i]='\0';
		cout<<buffer; 		
	}
///[例23.12]getline.cpp算例
	# include <fstream.h>    
	void main(void)
	{   fstream  fin("c:\\ getline.cpp",ios::in); 		
		if(fin.fail()!=0) {cout<<"open failed";return;}         
		int i=0;
		char buffer[512];	
			fin.getline(buffer,518,'}'); //此处等价于	fin.get(buffer,518,'}');
		cout<<buffer<<endl; 		
	}
   /// [例23.13]put.cpp
	# include <fstream.h>    
	void main(void)
 	{   fstream  fin("c:\\put.cpp",ios::in); 	
	   if(fin.fail()) {cout<<"open failed";return;}  
	   fstream  fout;
	   fout.open("c:\\putx.cpp",ios::out); 
	    if(!fout.fail()) {cout<<"open failed";return;}  
	    while(!fin.eof() ) 
			   fout.put((char)fin.get()); 			         
	   fout.close();			
	}
   /// [例23.14] 二进制方式读写磁盘文件 
    #include<fstream.h>
    # include<iomanip.h>      
    typedef struct  SData              
    {    int	n;  float f;     int    m;
	   float	x;	float y;	 float	z;	
       void PrintData()const;
	} CData;                        
	inline void WriteData(CData pSrc[],int n,fstream& fpDst)
	{  
        fpDst.write((const char *)pSrc,n*sizeof(CData));//将数组pSrc[n]转存到fpDst的文件
	}
	inline  void ReadData(CData* pDst,int n,fstream& fpSrc )
	{ 	fpSrc.read((char *)pDst,n*sizeof(CData));	}	  	
	void CData::PrintData( ) const  
	{     cout.precision(3);
		 cout.setf(ios::showpoint);
	     cout<<setw(4)<<n<<setw(7)<<f<<setw(4)<<m
			 <<setw(7)<<x<<setw(8)<<y<<setw(9)<<z<<endl;
	}
	void main(void)
	{   CData s  ={0,1,2,3,4,5};    	             //定义一个结构变量
        CData d[]={1,2,3,4,5,6,    2,3,4,5,6,7,
                   3,4,5,6,7,8};		             //定义一个结构数组	
        fstream fpWrite;
		fpWrite.open("c:\\cdata.dat",ios::out);  
		if(fpWrite.fail()!=0) {cout<<"open  w failed";return;}      
	    WriteData(&s,1,fpWrite);                   //将结构变量s写入磁盘
        WriteData( d,3,fpWrite);                   //将结构数组d写入磁盘
		fpWrite.close();                          //及时地进行实际存盘运作
        fstream fpRead;
		fpRead.open("c:\\cdata.dat",ios::in);    //以缺省方式打开上面刚生成的文件            
   		if(fpRead.fail()!=0) {cout<<"open  w failed";return;} 
		CData b[4];             //定义一个有4个元素的结构数组
        ReadData(b,3,fpRead);    //在文件中先读取3组结构数据直接送入b[0],b[1],b[2]
        ReadData(b+3,1,fpRead);  //在文件中随后位置再读取1组结构数据直接送入b[3]
		for(int k=0;k<4;k++)      //在屏幕上循环显示每一结构元素的成员值  
           b[k].PrintData();          //二进制数据通过格式转换以文本输出
	}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -