1. 程式人生 > >c++ 檔案流

c++ 檔案流

檔案操作:
FILE*  buffer = fopen("filename",mode);
               
fopen_s()  FILE*   檔名:  "BusInfo.dat"

      開啟方式:1.文字模式: 
         r       開啟只讀檔案,該檔案必須存在。  
         r+    開啟可讀寫的檔案,該檔案必須存在。
         rb+     讀寫開啟一個二進位制檔案,只允許讀寫資料。
         rt+     讀寫開啟一個文字檔案,允許讀和寫。
         w       開啟只寫檔案,若檔案存在則檔案長度清為0,即該檔案內容會消失。若檔案不存在則建立該檔案
         w+      開啟可讀寫檔案,若檔案存在則檔案長度清為零,即該檔案內容會消失。若檔案不存在則建立該檔案。
         a       以附加的方式開啟只寫檔案。若檔案不存在,則會建立該文 
                         件,如果檔案存在,寫入的資料會被加到檔案尾,即檔案原先的內容會被保留。(EOF符保留) 
         a+      以附加方式開啟可讀寫的檔案。若檔案不存在,則會建立該 檔案,如果檔案存在,寫入的資料會被加到檔案尾後,即文 
                            件原先的內容會被保留。(原來的EOF符不保留)
       wb        只寫開啟或新建一個二進位制檔案;只允許寫資料。
       wb+       讀寫開啟或建立一個二進位制檔案,允許讀和寫。
       wt+       讀寫開啟或著建立一個文字檔案;允許讀寫。
       at+       讀寫開啟一個文字檔案,允許讀或在文字末追加資料。
       ab+       讀寫開啟一個二進位制檔案,允許讀或在檔案末追加資料。
                
                2.二進位制:  "rb","wb","ab"格式與前面相同,只是使用二進位制模式而非文字模式開啟。 
                
                區別: 文字模式是作業系統在人和二進位制之間做了一層轉義。
                  回車符"\r\n" 解釋成"\n"(讀出時),將"\n"解釋成"\r\n"(寫入時)
                   
                  
                 二進位制模式:檔案本身的內容和你編寫程式時用函式讀到的內容完全相同。   
       
   簡單的檔案I/O
   
   要讓程式寫入檔案,必須這樣做:
   1.建立一個ofstream物件來管理輸出流
   2.將該物件與特定的檔案關聯起來。
   3.以使用cout的方式使用該物件,唯一的區別是輸出將進入檔案,而不是螢幕。
   
   要完成包含標頭檔案fstream。對大多數(但不是全部)實現來說,包含該檔案使自動包括iostream。
   
      ofstream  fout;
      
      接下來,必須將這個物件與特定的檔案關聯起來。為此,可以使用open()方法。例如,假設要開啟檔案jar.txt進行
   輸出,則可以這樣做:
   fout.open("jar.txt");
   
   也可以使用另一個建構函式將這兩步(合併成一條語句):
   ofstream fout("jar.txt");
   
   fout << "Dull Data";
   
        由於ostream是ofstream類的基類。因此可以使用所有的ostream方法,包括各種插入運算子定義,格式化方法和控制符。
     ofstream類使用被緩衝的輸出,因此程式在建立像fout這樣的ofstrcam物件時,將為輸出緩衝區分配空間。
     以這種方式開啟檔案來進行輸出時,如果沒有這樣的檔案,將建立一個新檔案;如果有這樣的檔案,則開啟檔案將清空檔案,輸出將進入到一個
     空檔案中。
     
     讀取檔案的要求與寫入檔案相似;
     將該物件與特定的檔案關聯起來;
     以使用cin的方式使用該物件。
     
     ifstream  fin;
     fin.open("jellyjar.txt");
     ifstream fis("jamjar.txt");
     
     char ch;
     fin >> ch;
     char  buf[80];
     fin >> buf;
     fin.getline(buf,80);
     string line;
     getline(fin,line); 
     
     當輸入和輸出流物件過期時,到檔案的連線將自動關閉。另外,也可以使用close()方法來顯示地關閉檔案。
     
     fout.close();
     fin.close();
     
     關閉遮掩的連線並不會刪除流,而只是斷開流到檔案的連線。然而,流管理裝置仍被保留。
     
 
 
17.4.4 命令列處理技術
檔案處理程式通常使用命令列引數來指定檔案。命令列引數是使用者在輸入命令時,在命令列中輸入的引數。
    例如,要在UNIX或Linux系統中計算檔案包含的字數,可以在命令列提示符下輸入下面的命令:
    wc  report1  report2  report3
   
      其中  wc  是程式名,report1  report2 和report3是作為命令列引數傳遞給程式的檔名。
      
#include <fstream>
#include <iostream>
#include <string>
using namespace std; 


/* run this program using the console pauser or add your own getch, system("pause") or input loop */


int main(int argc, char *argv[]) 
{
	string filename;
	
	cout << "Enter name for new file: ";
	cin >> filename;
	
	ofstream fout(filename.c_str());
	
	fout << "For your eyes only!\n";
	cout << "Enter your secret number: ";
	float secret;
	cin  >> secret;
	fout << "Your secret number is " << secret <<endl;
	
	fout.close();
	
	ifstream fin(filename.c_str());
	cout << "Here are the ontents of " << filename << ":\n";
	char ch;
	while(fin.get(ch))


	    cout << ch;
		cout << "Done \n";
		fin.close();
		return 0;	


	
	return 0;
}
      


      
 
 fgets(char* ,nLength,FILE*);
 一次讀一行
 引數1:自己的緩衝區
 引數2:緩衝區大小
 引數3:檔案的緩衝區    
     
     
fread(char*,2,3,FILE*); 讀


fwrite(char*,2,3,FILE*);  寫


fclose(FILE*); 關閉檔案,沒寫的話,記憶體洩漏,內容沒寫進去


buffer  = NULL   防止野指標,  使用前 if(NULL == buffer)