C++筆記(9):IO輸入輸出資料流

來源:互聯網
上載者:User

標籤:etc   緩衝   內容   顯示器   c++   binary   一段   cout   預設   

                  輸入輸出資料流

C++的輸入輸出資料流是IO系統向使用者提供一個統一的介面,它隔離了具體的裝置差異。
包括標準輸入輸出資料流和檔案流。
標準輸入輸出資料流

istream是輸入資料流類,cin就是istream類型的對象。
ostream是輸出資料流類,cout是ostream類型的對象。
 
在C++中允許使用者重載運算子“<<”和“>>”,實現對象的輸入和輸出。

重載這二個運算子時,在對象所在的類中,將重載這二個運算子的函數說明該類的友元函數。
 

 

C++在標頭檔fstream.h中定義了C++的檔案流類體系 ,當程式中使用檔案時,要包含標頭檔fstream.h 。

其中定義了各種檔案操作運算子及函數。

在涉及文字檔的操作時,將輸入檔案看成鍵盤,將輸出檔案看成顯示器,格式不變。只需在程式中增加開啟與關閉檔案的語句。
檔案可以分為兩大類:文字檔、二進位檔案。
 
定義檔案對象
有三種類型的對象:
fstream file;//既可讀又可寫。
ifstream infile;//可讀不可寫。
ofstream outfile;//可寫不可讀。
 
開啟檔案
ifstream infile;
infile.open(“C:\\myfile.txt"); //與檔案建立關聯
ofstream outfile;
outfile.open(“myoutfile.txt”);
 
讀寫檔案
Std::string str;
Infile>>str;//從檔案流中輸入。
 
Outfile<<str;
 
關閉檔案
Infile.close();
Outfile.close();
關閉後釋放檔案對象,取消與檔案的關聯。
 
定義fstream對象後,既可以對檔案讀又可以寫。因此在open時需要給定開啟的方式:
fstream  file1,file2;//定義了兩個檔案類的對象
file1.open(“file1.txt”,  ios::in);//用於輸入
pile2.open(“file2.txt”, ios::out);//用於輸出
 
在open時常常會因為檔案不存在,或正在被佔用而開啟失敗。
可以通過對檔案對象進行判斷來得知是否開啟成功。
file1.open(“file.txt”, ios::in);
if(!file1)
{ 
  //檔案開啟失敗。
}
 
有一個約定:
在開啟檔案進行讀時,若檔案不存在則開啟失敗。
寫時,若檔案不存在則建立一個檔案。若存在則刪除原來的檔案的內容。
 
文字檔與二進位檔案讀取方法不同:
讀寫文字檔
從檔案讀取一個字元:file.getch(ch);
讀取一行資料:File.getline(str);
從檔案讀取時,當讀取到檔案尾時,函數傳回值為0,可以據此來判斷迴圈結束。
向檔案寫入一個字元:file.put(ch);
 
執行個體,實現兩個檔案的拷貝
 
 
開啟二進位檔案
若在檔案的open方法時沒有特別說明,預設開啟的文字檔,若要開啟二進位檔案,則要特別說明。
fstream   infile,outfile;
infile.open(“inf1.dat”,  ios::in| ios::binary);
outfile.open(“outf1.dat”,  ios::out| ios::binary);
ios::out和ios::in表示IO模式。枚舉類型,多個枚舉值可以使用運算子”|“組合使用。  
 
二進位檔案的關閉
關閉方法都一樣,調用close方法。
 
二進位檔案的讀寫
二進位檔案的讀寫與文字檔不同,使用專門的方法。
infile.read( char *buff,   int nNum);
buff儲存資料的緩衝,nNum為要讀取的長度,返回實際讀取的資料長度。
infile.read(&Stuinfo, sizeof(Stuinfo));
infile.read(pBuff, 1024*sizeof(char));
 
向檔案寫入資料:
outfile.write( pBuff, nLen );
write返回實際寫入的資料長度。
 
二進位檔案的結束
infile.eof( )    
當到達檔案結束位置時,該函數返回一個非零值;否則返回零。
 
檔案指標
開啟檔案之後,讀取或寫入一段資料之後,檔案指標都會移動到讀取或寫入的資料的末尾。
如file.read(pBuff, 1024);
讀取成功之後,檔案指標向後位移1024位元組。
 
file.write(pBuff, 10);
寫入成功之後,檔案指標向後位移10個位元組。
 
讀寫方法可以自動的移動檔案指標,除此之外還可以通過一個專門的函數隨機的移動檔案指標。
infile.seekg(nNum, ios::cur);
nNum為移動的位元組數。
ios::cur表示從當前位置。還有另外兩個相對位置:ios::begin ,ios::end;
infile.seekg(10, ios::begin);//相對檔案開始將檔案指標移動10個位元組。
infile.seekg(-20, ios::end);//相對檔案結束,向前移動20位元組
 
執行個體,實現兩個二進位檔案的拷貝。
 

C++筆記(9):IO輸入輸出資料流

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.