【C++】檔案的讀取與寫入
阿新 • • 發佈:2019-02-11
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::nocreate if(!infile){//如果輸入流初始化失敗就是檔案不存在 cout<<filePath<<"不存在,已為你建立!"<<endl; ofstream fileCreate(filePath,ios::_Noreplace);//用來建立檔案專用的輸出流,vs寫成ios::_Noreplace,vc6是ios::noreplace if(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,同時自己把游標移到下一行。