標籤: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輸入輸出資料流