stl中對文件讀寫的函數在頭文件fstream中定義,它的基本對象模型如下:
其中包含三個對象ifstrea、ofstream和fstream,分別對文件提供只讀、只寫、讀寫功能,從其對象繼承關系也可以看出這一點。下面就簡單的介紹下基本的文件方法
打開文件
打開文件一般有兩種方式:
1、在構造函數中打開
ifstream input("r:\\3.txt", ios::in | ios::binary);
2、通過open函數打開
ofstream output;
output.open("r:\\3.txt", ios::out | ios::binary);
不管用哪種方式,都需要傳入兩個參數:第一個參數是文件名,第二個參數是打開選項,常見的選項有:in、out、app(append)、binary等。第二個參數也可以不傳,此時,對於ifstream,就是以讀方式打開、ofstream以寫方式打開。
檢查是否打開成功
可以通過good函數檢查文件是否打開成功:
if (!input.good())
{
cout << "file open fail" << endl;
return 1;
}
這個good函數也可以去掉,直接檢查steam是否為真(這樣可讀性不好,不建議,但許多歷史代碼喜歡這么寫,還是應該學習一下)。
if (!input)
{
cout << "file open fail" << endl;
return 1;
}
定位和獲取當前位置
有的時候,我們需要對文件進行隨機訪問,如連接兩個文件的時候就要定位到文件的末尾。在stl中可以通過stream對象的seekg實現這一功能。與之相對的就是獲取當前位置,函數為tellg,如下代碼演示了利用這兩個函數獲取文件長度。
input.seekg (0, ios::end);
int length = input.tellg();
tellg函數比較簡單,沒有參數,直接返回當前位置。而seekg有兩個參數:第一個參數是偏移量,可以為負數;第二個參數則是相對位置,可以選取ios::beg(begin)、ios::end(end)、ios::cur(current)三個值,這個參數可以省略,省略的時候是取的ios::beg,從文件頭定位。
關閉文件
關閉文件有兩個方法:
-
調用close方法顯式關閉
-
對象刪除的時候隱式關閉
具體使用哪個這個看個人喜好了,就我個人而言,我一般喜歡在構造函數中打開文件,不習慣調用open函數,因此也比較傾向於隱式關閉,不調用close函數。
讀寫文件
下面我們就以一個文件拷貝為例簡單的介紹下讀寫的方式:
1、傳統的緩沖區讀寫
char buf[1024];
while(!input.eof())
{
int count = sizeof(buf);
input.read(buf, count);
output.write(buf, count);
}
這里主要用到了三個函數:read函數為讀,write函數寫,eof檢查是否讀取到了文件結尾。
2、利用string逐行讀寫
string line;
while(std::getline(input, line))
output << line << endl ;
這里用了getline行數從流里每次讀寫一行,用 << 運算符將內容寫入流,不過這種方式僅僅適合讀寫文本文件。
3、流方式讀寫
output << input.rdbuf();
這個方式非常簡單,只用了一行代碼就可以實現:用rdbuf函數獲取讀緩沖區,用 << 運算符在兩個流對象之間建立管道。