C 檔案讀寫

2022-02-17 10:43:04 字數 4837 閱讀 6022

在看c++程式設計思想中,每個練習基本都是使用ofstream,ifstream,fstream,以前粗略知道其用法和含義,在看了幾位大牛的博文後,進行整理和總結:

這裡主要是討論fstream的內容:

#include ofstream         

//檔案寫操作 記憶體寫入儲存裝置

ifstream //

檔案讀操作,儲存裝置讀區到記憶體中

fstream //

讀寫操作,對開啟的檔案可進行讀寫操作

1.開啟檔案在fstream類中,成員函式open()實現開啟檔案的操作,從而將資料流和檔案進行關聯,通過ofstream,ifstream,fstream物件進行對檔案的讀寫操作

函式:open()

"

font-family:times new roman;font-size:16px;

">

public

member function

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        開啟檔案的方式

prot         開啟檔案的屬性                            //基本很少用到,在檢視資料時,發現有兩種方式

開啟檔案的方式在ios類(所以流式i/o的基類)中定義,有如下幾種方式:

ios::in

為輸入(讀)而開啟檔案

ios::out

為輸出(寫)而開啟檔案

ios::ate

初始位置:檔案尾

所有輸出附加在檔案末尾

ios::trunc

如果檔案已存在則先刪除該檔案

ios::binary

二進位制方式

這些方式是能夠進行組合使用的,以「或」運算(「|」)的方式:例如

ofstream out

; out.open("

hello.txt

", ios::in|ios::out|ios::binary) //

根據自己需要進行適當的選取

開啟檔案的屬性同樣在ios類中也有定義:

0普通檔案,開啟操作

1唯讀檔案

2隱含檔案

4系統檔案

對於檔案的屬性也可以使用「或」運算和「+」進行組合使用,這裡就不做說明了。 很多程式中,可能會碰到ofstream out("hello.txt"), ifstream in("..."),fstream foi("...")這樣的的使用,並沒有顯式的去呼叫open()函式就進行檔案的操作,直接呼叫了其預設的開啟方式,因為在stream類的建構函式中呼叫了open()函式,並擁有同樣的建構函式,所以在這裡可以直接使用流物件進行檔案的操作,預設方式如下:

"

font-family:times new roman;font-size:16px;

">ofstream

out("

...", ios::out

);

ifstream

in("

...", ios::in

);

fstream foi(

"...

", ios::in|ios::out

);

當使用預設方式進行對檔案的操作時,你可以使用成員函式is_open()對檔案是否開啟進行驗證

2.關閉檔案

當檔案讀寫操作完成之後,我們必須將檔案關閉以使檔案重新變為可訪問的。成員函式close(),它負責將快取中的資料排放出來並關閉檔案。這個函式一旦被呼叫,原先的流物件就可以被用來開啟其它的檔案了,這個檔案也就可以重新被其它的程序所訪問了。為防止流物件被銷毀時還聯絡著開啟的檔案,析構函式將會自動呼叫關閉函式close。

3.文字檔案的讀寫

類ofstream, ifstream 和fstream 是分別從ostream, istream 和iostream 中引申而來的。這就是為什麼 fstream 的物件可以使用其父類的成員來訪問資料。

一般來說,我們將使用這些類與同控制台(console)互動同樣的成員函式(cin 和 cout)來進行輸入輸出。如下面的例題所示,我們使用過載的插入操作符<

//

writing on a text file

#include int

main ()

return

0;

} //結果: 在out.txt中寫入:

this is

a line.

this

is another line

從檔案中讀入資料也可以用與 cin>>的使用同樣的方法:

//

reading a text file

#include #include

#include

intmain ()

while (!in

.eof() )

return

0;

} //

結果 在螢幕上輸出

this is

a line.

this

is another line

上面的例子讀入乙個文字檔案的內容,然後將它列印到螢幕上。注意我們使用了乙個新的成員函式叫做eof ,它是ifstream 從類 ios 中繼承過來的,當到達檔案末尾時返回true 。

除了eof()以外,還有一些驗證流的狀態的成員函式(所有都返回bool型返回值):

要想重置以上成員函式所檢查的狀態標誌,你可以使用成員函式clear(),沒有引數。

所有輸入/輸出流物件(i/o streams objects)都有至少乙個流指標:

我們可以通過使用以下成員函式來讀出或配置這些指向流中讀寫位置的流指標:

流指標 get 和 put 的值對文字檔案(text

file)和二進位制檔案(binary

file)的計算方法都是不同的,因為文字模式的檔案中某些特殊字元可能被修改。由於這個原因,建議對以文字檔案模式開啟的檔案總是使用seekg 和

seekp的第一種原型,而且不要對tellg 或 tellp

的返回值進行修改。對二進位制檔案,你可以任意使用這些函式,應該不會有任何意外的行為產生。

以下例子使用這些函式來獲得乙個二進位制檔案的大小:

//

obtaining file size

#include #include

const

char * filename = "

test.txt

";

intmain ()

//結果:

size of example.txt is

40 bytes.

在二進位制檔案中,使用<< 和》,以及函式(如getline)來操作符輸入和輸出資料,沒有什麼實際意義,雖然它們是符合語法的。

檔案流包括兩個為順序讀寫資料特殊設計的成員函式:write 和 read。第乙個函式 (write) 是ostream 的乙個成員函式,都是被ofstream所繼承。而read 是istream 的乙個成員函式,被ifstream 所繼承。類 fstream 的物件同時擁有這兩個函式。它們的原型是:

write ( char * buffer, streamsize size );

read ( char * buffer, streamsize size );

這裡 buffer 是一塊記憶體的位址,用來儲存或讀出資料。引數size 是乙個整數值,表示要從快取(buffer)中讀出或寫入的字元數。

#include #include 

using

namespace

std;

const

char *filename = "

/cygdrive/e/test/jiu";

intmain ()

in.close();

cout

<< "

complete";

delete

buffer;

return0;

}

當我們對檔案流進行操作的時候,它們與乙個streambuf 型別的快取(buffer)聯絡在一起。這個快取(buffer)實際是一塊記憶體空間,作為流(stream)和物理檔案的媒介。例如,對於乙個輸出流, 每次成員函式put (寫乙個單個字元)被呼叫,這個字元不是直接被寫入該輸出流所對應的物理檔案中的,而是首先被插入到該流的快取(buffer)中。

當快取被排放出來(flush)時,它裡面的所有資料或者被寫入物理媒質中(如果是乙個輸出流的話),或者簡單的被抹掉(如果是乙個輸入流的話)。這個過程稱為同步(synchronization),它會在以下任一情況下發生:

c 檔案讀寫 文字讀寫

include int main else return 0 格式 intfscanf file stream,constchar format,返回值 如果成功,該函式返回成功匹配和賦值的個數。如果到達檔案末尾或發生讀錯誤,則返回 eof 引數1 file stream 檔案指標 引數2 cons...

C 檔案讀寫

原文 http www.vckbase.com document viewdoc id 1439 原作 john peregrine file i o using c 序論 我曾發表過檔案輸入輸出的文章,現在覺得有必要再寫一點。檔案 i o 在c 中比烤蛋糕簡單多了。在這篇文章裡,我會詳細解釋asc...

C 讀寫檔案

1 使用filestream讀寫檔案 檔案頭 using system using system.collections.generic using system.text using system.io 讀檔案核心 byte bydata new byte 100 char chardata ne...