標籤:c++ 檔案 檔案流 字串 二維數組
C++的檔案讀取與寫入感覺比起其它語言特別地難,對比起《【Python】檔案讀寫操作》(點擊開啟連結)、《【php】讓記事本成為你調控變數的控制台》(點擊開啟連結)與《【Java】輸入與輸出與JDK1.5之後的新型字串StringBuilder》(點擊開啟連結),C++最大的特點就是檔案的輸入資料流與輸出資料流分開,同時最關鍵的是自身並沒有字串變數,在其檔案的讀取方法變數限制於字元數組char[],需要利用到一個二維的字元數組char[][]才能完事。
同時由於各大的編譯器不同,C++在你不對變數初始化也不會出現警告的情況下,你還必須用memset方法,自己對二維字元數組初始化,使得判斷為空白的條件一致。
下面,用以下的一個程式說明問題:
如果f:\1.txt不存在,則先自己建立這個檔案,之後,使用者不停地輸入資料,直到輸入exit;結束。
程式的難度主要是在檔案的內容讀入到C++的二維數組上,其基本思想如所示:
代碼如下:
#include<iostream>#include<fstream>using namespace std;int main(){char input[255];//用來接受使用者輸入的內容char fileContent[100][255];//用來接檔案內容的數組,相等於一個一維的字串數組。memset(fileContent,'\0',sizeof(fileContent));//這裡必須對整個數組進行初始化,不然的話,不同的編譯器對數組初始化的值不同,導致下面的輸出無法判斷char* filePath="F:\\1.txt";//這樣可以避免引入string標頭檔,使用string類型了while(1){//讀取檔案到C++ifstream infile(filePath,ios::in|ios::_Nocreate);//vs寫成ios::_Nocreate,vc6是ios::nocreateif(!infile){//如果輸入資料流初始化失敗就是檔案不存在cout<<filePath<<"不存在,已為你建立!"<<endl;ofstream fileCreate(filePath,ios::_Noreplace);//用來建立檔案專用的輸出資料流,vs寫成ios::_Noreplace,vc6是ios::noreplaceif(fileCreate){fileCreate.close();//人走帶門}else{cerr<<"出錯了!"<<endl;exit(1);}}else{for(int i=0;!infile.eof();i++){//這個迴圈的結束條件是輸入資料流遇到檔案的結尾,也就是讀完F:\1.txt中的資料infile.getline(fileContent[i],255);//利用getline的方法一行一行的讀取,每一行作為一個字串,放到fileContent的第二維}cout<<filePath<<"現時的內容如下:"<<endl;}infile.close();//讀取完畢之後人走帶門for(int i=0;fileContent[i][0]!='\0';i++){//列印的結束條件是遇到fileContent數組中沒有第0個欄位沒有被填充的空行cout<<fileContent[i]<<endl;}cout<<"輸入一些東西到"<<filePath<<",輸入exit;退出!"<<endl;cin>>input;if(!strcmp(input,"exit;")){//如果使用者輸入的字串與exit;相等,strcmp(input,"exit;")則返回0,進入這個條件結構,終止這個程式return 0;//這就是主函數以int類型作為傳回值,return 0的好處,用來設定程式終點,當然如果用void作為主函數的傳回值exit(0);也可以做到這一點}//C++輸出內容到檔案ofstream outfile(filePath,ios::ate|ios::_Nocreate);//ios::ate可以直接把指標放到檔案末尾。ios::app不好用,要配合outfile.seekp(0,ios::end)才能把檔案弄到檔案末尾,預設是在檔案頭if(!outfile){cerr<<"出錯了!"<<endl;exit(1);}else{outfile<<input<<'\n';//將使用者輸入的內容對檔案輸出資料流進行輸出}outfile.close();//人走帶門}}
注釋已經說得比較清楚了。這裡不再贅述。
唯一想說一下,
涉及檔案操作,開頭必須引入<fstream>
利用getline方法,C++能把一行內指定長度的內容,這裡是255,讀取到你指定的一維數組中,遇到Enter等分行符號則自動終止,無論此時所讀的一行長度是否累積到255,同時自己把游標移到下一行。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
【C++】檔案的讀取與寫入