1. 程式人生 > >C++對檔案進行讀寫操作

C++對檔案進行讀寫操作

1、 定義資料流物件指標

對檔案進行讀寫操作首先必須要定義一個數據流物件指標,資料流物件指標有三種類型,它們分別是:

Ifstream:表示讀取檔案流,使用的時候必須包含標頭檔案“ifstream”;

Ofstream:表示檔案寫入流,使用的時候必須包含標頭檔案“ofstream”;

Fstream:表示檔案讀取/寫入流,使用的時候必須包含標頭檔案“fstream”;

2、 開啟檔案

開啟檔案可以呼叫兩個函式,其一是使用open函式,其二是使用資料流物件的建構函式。這兩個函式呼叫的引數基本上一致的,以open函式為例:

void open(const char * filename, ios_base::openmode mode = ios_base::in | ios_base::out);
void open(const wchar_t *_Filename, ios_base::openmode mode = ios_base::in | ios_base::out, int prot = ios_base::_Openprot);

引數filename表示檔名,如果該檔案在目錄中不存在,那麼該函式會自動建立該檔案;引數mode表示開啟方式,這裡開啟方式有一下四種,如表1,並且這些方式可以以“|”的或的方式組合使用。

表1

ios::in
  為輸入(讀)而開啟檔案                                                     
ios::out                                     為輸出(寫)而開啟檔案   
ios::ate 初始位置:檔案尾
ios::app 所有輸出附加在檔案末尾             
ios::trunc 如果檔案已存在則先刪除該檔案
ios::binary 二進位制方式

引數prot表示檔案開啟的屬性,基本上很少用到。

3、 檔案的讀寫操作

由於類ofstream, ifstream 和fstream 是分別從ostream, istream 和iostream 中引申而來的,所以檔案的讀寫操作與使用控制檯函式cin和cout一樣,“<<”表示對檔案進行寫操作,“>>”表示對檔案進行讀操作。

根據資料流讀寫的狀態,有4個驗證函式,它們分別是:

· bad()

如果在讀寫過程中出錯,返回 true 。例如:當我們要對一個不是開啟為寫狀態的檔案進行寫入時,或者我們要寫入的裝置沒有剩餘空間的時候。

· fail()

除了與bad() 同樣的情況下會返回 true 以外,加上格式錯誤時也返回true ,例如當想要讀入一個整數,而獲得了一個字母的時候。

· eof()

如果讀檔案到達檔案末尾,返回true。

· good()

這是最通用的:如果呼叫以上任何一個函式返回true 的話,此函式返回 false 。

4、 獲得或者設定流指標

獲得流指標的位置有兩個函式,它們是

Long tellg() 和 long tellp()這兩個成員函式不用傳入引數,返回pos_type 型別的值(根據ANSI-C++標準) ,就是一個整數,代表當前get 流指標的位置 (用tellg) 或 put 流指標的位置(用tellp)

設定流指標的位置根據輸入輸出流指標型別不同,也有兩個函式,它們是:

seekg() 和seekp()這對函式分別用來改變流指標get 和put的位置。兩個函式都被過載為兩種不同的原型:

seekg ( pos_type position );
seekp ( pos_type position );

使用這個原型,流指標被改變為指向從檔案開始計算的一個絕對位置。要求傳入的引數型別與函式 tellg 和tellp 的返回值型別相同。

seekg ( off_type offset, seekdirdirection );
seekp ( off_type offset, seekdir direction );

使用這個原型可以指定由引數direction決定的一個具體的指標開始計算的一個位移(offset),它們如表2所示。

表2

ios::beg 從流開始位置計算的位移
ios::cur 從流指標當前位置開始計算的位移
ios::end 從流末尾處開始計算的位移

5、關閉檔案

呼叫函式close(),可以關閉流物件所指向的檔案,釋放流指標之後,那麼該資料流就可以指向其它的檔案進行操作了。

下面對檔案一般的讀寫舉個例子:

1)在檔案末尾寫入資料:假設mytext.tex檔案中已經有了資料,如圖1所示,然後在其末尾寫入1到10的整數,執行結果如圖2,程式碼如下。

#include "stdafx.h"
#include<fstream>
int _tmain(int argc, _TCHAR* argv[])
{
	std::ofstream openfile("d:\\myfile.txt", std::ios::app);
	for (int i = 1; i < 11; i++)
	{
		openfile << " " << i;
	}
	openfile.close();
	
	return 0;
}


圖1



圖2

2)對檔案從新寫入資料,只需要預設mode引數就可以了,本例是在例1)的檔案mytext的基礎上寫入2到20的偶數,執行結果如圖3,會發現本例的結果將例1)的結果覆蓋了。

#include "stdafx.h"
#include<fstream>
int _tmain(int argc, _TCHAR* argv[])
{
	std::ofstream openfile("d:\\myfile.txt");
	for (int i = 1; i < 11; i++)
	{
		openfile << " " << 2*i;
	}
	openfile.close();
	
	return 0;
}


圖3

3)在檔案中的指定位置寫入資料:本例在例2)的mytex檔案的內容中,在第11個數據位置寫入11.執行結果如圖4所示,在寫入後獲取當前位置,執行結果如圖5所示。

#include "stdafx.h"
#include<iostream>
#include<fstream>
#include<Windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
	std::ofstream openfile("d:\\myfile.txt",std::ios::in);
	long l = 11;
	openfile.seekp(l, std::ios::beg);
	openfile << 11;
	openfile.close();
	long m = openfile.tellp();
	std::cout << m << std::endl;
	Sleep(20000);
	return 0;
}


圖4


圖5

4)讀取檔案中的資料:這裡將檔案mytext裡面的資料讀入到字串中,並且顯示出來,結果如圖6所示。

#include "stdafx.h"
#include<iostream>
#include<fstream>
#include<Windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
	char *filename = "d:\\myfile.txt";
	std::ifstream inf(filename);
	if (!inf.is_open())
	{
		std::cout << "Error opening file";
	}
	while (!inf.eof())
	{
		char d[256];
		inf.getline(d,100);
		std::cout << d << std::endl;
	}
	Sleep(20000);
	return 0;
}


圖6

要是有幫助到親的話,可不要忘了給皮皮點個贊呢吐舌頭