1. 程式人生 > >【C++】檔案的讀取與寫入

【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::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,同時自己把游標移到下一行。