寫在前面的話:c++中對檔案的操作跟c語言是有很大差別的,因此總結一下c++對檔案的操作。
在c++中隊檔案的輸入輸出流和對記憶體的輸入輸出流以及對字串的輸入輸出流介面是一致的,如果輸入流能產生位元組,可以用乙個提取操作符從這個流中獲取資訊。這個提取符產生並格式化目的物件所期望的資訊型別。雖然輸入流用起來很方便,但是也有乙個問題,在使用格式化的輸入機制,尤其是標準輸入時,會遇到和c語言中scanf()中同樣的問題。如果輸入乙個非期望值,程序則被偏離,而且它很難恢復。另外,格式化的輸入預設以空格為分隔符。那麼如下面的**:
#include usingnamespace
std;
int main(void
)
給出以下輸入:
12 1.4 c this is a test
我們應該得到與輸入相同的輸出。
1.4c
this is a test
但是實際輸出為:
1.4c
this
注意到buf只得到第乙個字,這個由於輸入機制是通過尋找空格來分隔輸入的,而空格在「this」的後面。另外如果連續的輸入串長於為buf分配的儲存空間,也會發生buf溢位現象。
要獲取一行輸入,有兩種選擇:成員函式get()、getline()。兩個函式都是有三個引數:指向儲存結果緩衝區的指標、緩衝區大小(不能超過其限度)和知道什麼時候停止輸入的終止符。終止符有乙個經常用到的預設值『\n』。兩個函式遇到輸入終止符時,都把零儲存在結果緩衝區裡。
它們的區別如下:
1. get()遇到輸入流的分隔符就停止,而不從輸入流中提取分隔符。如果用相同的分隔符再呼叫一次get()函式,它會立即返回而不帶任何輸入。
2. getline()與其相反,它從輸入流中提取分隔符,但仍沒有把儲存在結果緩衝區裡。
總之,當我們在處理文字檔案時,無論什麼時候需要讀出一行,都會想到getline()函式。
如果要讀取原始位元組,即二進位制**的話,可以使用read()函式,第乙個引數指向記憶體目的位址的指標,第二個引數指明要讀取的位元組數。
如果要寫入原始位元組,使用write()函式。
遇到的問題:輸入流什麼時候返回假值?
如下面的程式:
#include #include#include
using
namespace
std;
const
int sz = 100
;int
main()
}ifstream
in("
strfile.out");
assert(
in);
while(in
.getline(buf, sz))
cp += 2
; cout
<< cp << endl; //
must still add \n
}}
其中的檔案輸入流不是應該在檔案結尾處才返回假值麼?但是實際執行是,如果遇到空行程式就從while迴圈中跳出了,這個為什麼呢?
C 檔案輸入輸出流
dat 檔案 資料檔案 二進位制檔案字尾名為 bin 文字檔案 字尾名 txt doc.docx wps 以ascii 碼儲存資料的 檔案指標,用於指明其位置 檔案開關 fopen 第二個引數char 型別 需要 括起來 err fopen s fp1,file information.txt a ...
檔案輸入輸出流
學習內容 1.fileinputstream類 常用構造方法 fileinputstream string name 使用檔名建立fileinputstream物件 fileinputstream file file 使用file物件建立fileinputstream物件 2.fileonputst...
C 流 檔案操作(輸入輸出流)
到目前為止,我們已經使用了iostream標準庫,它提供了cin和cout方法分別用於從標準輸入讀取流和向標準輸出寫入流。本教程介紹如何從檔案讀取流和向檔案寫入流。這就需要用到 c 中另乙個標準庫fstream,它定義了三個新的資料型別 資料型別 描述ofstream 該資料型別表示輸出檔案流,用於...