?? 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 + -