您好,登錄后才能下訂單哦!
1、流類庫
(1)、C++中沒有輸入輸出,標準庫中包含一個I/O流類庫。
C語言中printf 和scanf 稱為函數; 輸出到屏幕
C++中cout和cin稱為對象; 輸入是鍵盤
其中iostream是虛繼承;
cout<<int/char/double----->是因為重載了<<。
(2)、C++流類庫中定義4個全局流對象,cin、cout、cerr、clog
cin 標準輸入流對象,鍵盤
cout標準輸出流,屏幕
cerr和clog標準錯誤輸出流, 屏幕
其中cin、cout、clog是帶緩沖區的,緩沖區由streambuf類對象來管理,cerr非緩沖區,一旦錯誤發生立即顯示。
#include<iostream> using namespace std; int main(void){ cerr<<"Error"<<endl; //錯誤直接輸出 cout<<"Hello"<<endl; //先放到緩沖區中 }
2、格式控制
會用,知道怎么查就行了,沒必要記這些;
cout.flags(ios::hex); //hex這些在ios類中,以16進制輸出;
0000 0000 0000 0000 有多少個1,就有什么功能;
ios::hex | ios::showbase hex和showbase都是在ios類中定義的枚舉,1-16各占一位;
3、文件
(1)、先定義一個文件對象流
(2)、打開某個文件
(3)、進行文件的讀寫
(4)、關閉文件
ASCII字符節文件:
fprintf(fd, "", ); :寫入文件
fscanf(fd, "", ); :從文件讀出
文本文件的操作,寫入文件:
#include<iostream> #include<fstream>//文件輸出流頭文件 #include<stdlib.h> using namespace std; int main(void){ int ar[] = {1, 3, 5, 6, 7, 9,}; //1、 //ofstream ofile("Test1.txt", ios::out);與下2步等價 ofstream ofile; //2、 ofile.open("Test1.txt", ios::out); if(!ofile){ cerr<<"Open File Fail!"<<endl; exit(1); } for(int i = 0; i < sizeof(ar)/sizeof(int); i++){ ofile<<ar[i]<<" "; } ofile.close(); }
在文件中讀出:
#include<iostream> #include<fstream>//文件輸出流頭文件 #include<stdlib.h> using namespace std; int main(void){ int ar[10]; ifstream ifile; ifile.open("Test1.txt", ios::in); if(!ifile){ cerr<<"Open File Fail"<<endl; exit(1); } for(int i = 0; i < 4; i++){ ifile>>ar[i]; } ifile.close(); }
4、二進制讀寫
寫入文件:
#include<iostream> #include<fstream>//文件輸出流頭文件 #include<stdlib.h> using namespace std; int main(void){ int ar[] = {1, 3, 5, 6, 7, 9,}; //1、 //ofstream ofile("Test1.txt", ios::out);與下2步等價 ofstream ofile; //2、 ofile.open("Test1.txt", ios::out | ios::binary); if(!ofile){ cerr<<"Open File Fail!"<<endl; exit(1); } ofile.write((char *)ar, sizeof(ar));//這樣就不用循環了,一次性解決 ofile.close(); }
從文件讀出:
#include<iostream> #include<fstream>//文件輸出流頭文件 #include<stdlib.h> using namespace std; int main(void){ int ar[] = {1, 3, 5, 6, 7, 9,}; //1、 //ifstream ofile("Test1.txt", ios::out); ifstream ifile; //2、 ifile.open("Test1.txt", ios::out | ios::binary); if(!ifile){ cerr<<"Open File Fail!"<<endl; exit(1); } ifile.read((char *)ar, sizeof(ar));//這樣就不用循環了,一次性全部讀出 ifile.close(); }
5、文件隨機訪問
隨機讀寫關鍵靠文件指針;
文件指針,開始指向第一個,讀寫就靠這個文件讀寫指針,會自動指向下一個;
#include<iostream> #include<fstream>//文件輸出流頭文件 #include<stdlib.h> using namespace std; int main(void){ ifstream ifile; ifile.open("Test1.txt", ios::in); if(!ifile){ cerr<<"Open File Fail!"<<endl; exit(1); } int pos; int value; while(1){ cout<<"請輸入位置: "; cin>>pos; //beg cur end ifile.seekg(pos, ios::beg);//定位函數,pos,相對于什么地方開始 ifile>>value; //將定位處的值放入value; cout<<"value = "<<value<<endl; } ifile.close(); }
文件可以定位讀出,最好用二進制解決,每個數字都是4字節;就不用考慮每個數字跨幾個字節,所以為pos*4;
文本文件在其中每個數字(0-9)占用1個字節,不好定位一個完整數字占用幾個字節;
5、文件與對象
在C++程序設計中,文件應該在構造函數中打開,并創建對象,而在析構函數中保存和關閉文件,并撤銷對象;
對文件而言,釋放資源的同時包括將對象中的信息再次存入磁盤文件,在程序運行過程中,應將信息適時保存到相應
的磁盤文件,以免數據意外丟失。
文件與對象的有機結合(關鍵在構造和析構函數),以下就是一個相應的例子:
#include<iostream> #include<fstream> using namespace std; class Complex; ostream& operator<<(ostream &out, const Complex &t); class Complex{ friend ostream& operator<<(ostream &out, const Complex &t); public: Complex() : real(0), p_w_picpath(0){ ifstream ifile; ifile.open("Test.txt", ios::in); if(!ifile){ cerr<<"Open File Fail"<<endl; exit(1); } ifile>>real>>p_w_picpath; ifile.close(); } Complex(int rea, int imag) : real(rea), p_w_picpath(imag){} ~Complex(){ ofstream ofile; ofile.open("Test.txt", ios::out); if(!ofile){ cerr<<"Open File Fail"<<endl; exit(1); } ofile<<real<<" "<<p_w_picpath; ofile.close(); } public: void setComplex(int real, int p_w_picpath){ this->real = real; this->p_w_picpath = p_w_picpath; } private: int real; int p_w_picpath; }; ostream& operator<<(ostream &out, const Complex &t){ out<<"("<<t.real<<","<<t.p_w_picpath<<")"; return out; } int main(void){ Complex c; cout<<c<<endl; c.setComplex(100, 200);//模擬了在下一次實例化時把上一次讀取出來。 // cout<<c<<endl;//寫進文件,保存設置。 }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。