📄 ex23.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 + -