c學習筆記 檔案輸入 輸出 20210315

2021-10-22 06:25:09 字數 4160 閱讀 3791

第一步:呼叫fopen()開啟檔案, fopen()在開啟檔案的同時建立了乙個緩衝區(讀寫模式下兩個)以及乙個包含檔案和緩衝區的結構, 同時返回乙個指向該結構的指標,若把指標賦給乙個指標變數fp, 文字模式下開啟, 獲得乙個文字流; 二進位制模式則為二進位製流。

fopen()建立的結構通常包含乙個指定流中當前位置的檔案位置指示器, 錯誤和檔案結尾的指示器, 乙個指向緩衝區的指標, 乙個檔案識別符號和乙個計數器(統計實際拷貝進緩衝區的位元組數)。

第二步:檔案輸出, 呼叫乙個定義在stdio.h中的輸入函式。檔案中的緩衝資料塊被拷貝至緩衝區, 大小一般是512位元組或其整數倍。

輸入函式發現已讀完緩衝區的全部字元後, 會請求把下乙個資料塊從檔案拷貝到該緩衝區。

輸出函式同理。

該函式把c指定的字元放回輸入流中。

int fflush (file * fp)

;

該函式使輸出緩衝區所有未寫入資料傳送到檔案fp中, 即重新整理緩衝區, 若fp為空指標, 所有輸出緩衝區都被重新整理。

輸入流中該函式的效果未定義。

int

setvbuf

(file * restrict fp,

char

* restrict buf,

int mode, size_t size)

;

setvbuf()函式可建立乙個供i/o函式替換的緩衝區。

fp識別待處理的流, buf指向待使用的儲存區, 若其值不是null, 則必須建立乙個緩衝區, 如果·null是buf的值, 則該函式會自行分配乙個緩衝區; size告訴stevbuf()陣列的大小·; mode選擇如下:

_iofbf ——————完全緩衝

_iolbf——————行緩衝

_ionbf——————無緩衝

函式操作成功返回0, 否則返回非0。

double1./

3.;fpriintdf

(fp,

"%f"

, num)

;

實際上只是把數值轉換為字串進行儲存。如果要保證數值儲存前後一致, 則應使用與計算機相同的位。

fwrite

(&num,

sizeof

(double),

1, fp)

;

fread()和fwrite()用於以二進位制形式處理資料

通常使用二進位制模式在二進位制格式檔案中儲存二進位制資料。

size_t fwrite

(const

void

* restrict ptr, size_t size, size_t nmemb, file * restrict fp)

;

fwrite()將二進位制檔案寫入檔案, ptr為待寫入資料塊的位址, size為資料塊的大小, nmemb為待寫入資料塊的數量, fp指定待寫入檔案。

double earnings[10]

;fwrite

(earnings,

sizeof

(double),

10, fp)

;

fwrite()函式返回成功寫入項的數量, 出錯時返回值會比nmemb小。

size_t fread

(void

* restrict ptr, size_t size, size_t nmemb, file * restrict fp)

;

ptr為待讀取檔案在記憶體中的位址, fp指定待讀取的檔案, 該函式用於讀取被fwrite()寫入檔案的資料。

double earnings[10]

;fread

(earnings,

sizeof

(double),

10, fp)

;

該呼叫把10個double大小的值拷貝至earnings陣列中。

該函式返回成功讀取項的數量

用於區分是標準輸入函式到達檔案結尾返回的eof還是讀取錯誤導致的。

feof()在上一次輸入呼叫檢測到檔案結尾的話, 返回非零, 否則返回0;

ferror()在上一次輸入呼叫檢測到讀取錯誤的話, 返回非零, 否則返回0;

#include

#include

#include

#define bufsize 4096

#define slen 81

void

(file* source, file* dest)

;int

main

(void)if

(setvbuf

(fa,

null

, _iofbf, bufsize)!=0

)puts

("enter name of first source file (empty line to quit):");

while

(s_gets

(file_src, slen)

&& file_src[0]

!='\0'

)(fs, fa);if

(ferror

(fs)!=0

)fprintf

(stderr

,"error in reading file %s.\n"

, file_src);if

(ferror

(fa)!=0

)fprintf

(stderr

,"error in writing file %s.\n"

;fclose

(fs)

; files++

;printf

(, file_src)

;puts

("next file (empty line to quit):");

}}printf

(, files)

;rewind

(fa)

;printf

("%s contents:\n"

;while

((ch =

getc

(fa))!=

eof)

putchar

(ch)

;puts

("done displaying.");

fclose

(fa)

;return0;

}void

(file* source, file* dest)

#include

#include

#define arsize 1000

intmain

(void

)fwrite

(numbers,

sizeof

(double

), arsize, iofile)

;fclose

(iofile);if

((iofile =

fopen

(file,

"rb"))

==null

)printf

("enter an index in the range 0-%d.\n"

, arsize -1)

;while

(scanf

("%d"

,&i)==1

&& i >=

1&& i < arsize)

fclose

(iofile)

;puts

("bye!");

return0;

}

程式以二進位制模式建立了乙個number.dat的檔案, 使用fwrite()把陣列內容拷貝至檔案,儲存在檔案中的每個值都與儲存在記憶體中的值完全相同, 無任何精細度損失, 每個值在檔案中佔64位大小, 每個值的位置很好算出。

程式第二部分用於開啟待讀取檔案, 提示使用者輸入乙個值的索引, 把索引值與double型別值占用的位元組數相乘, 即可得出檔案上的乙個位置, 隨後呼叫fseek()定位到該位置, 用fread()進行讀取, fread()從已定位位置拷貝8位元組到記憶體中位址為&value的位置。

C 學習筆記 輸入輸出

一 資料的輸入和輸出 1 字元輸入函式 getchar 例如 1 include2 include3 intmain 4 2 字元輸出 putchar 語法格式 1 putchar ch 其中,ch為乙個字元變數或常量。3 通過cout流輸出資料 格式1 cout 表示式 格式2 cout 表示式1...

C語言學習筆記 檔案輸入輸出

用於存放檔案資訊的結構體型別為 file 由系統定義 包含在內。檔案類別 1 程式檔案 內容為程式 2 資料檔案 內容為資料,供程式執行使用。二進位制檔案 資料以二進位制形式儲存 又稱映像檔案 執行更快 資料的儲存 1 字元一律以asc 的形式儲存 2 數值型兩種方式都可以 例如 表示10000 1...

C 檔案輸入輸出

檔案輸入輸出 1 directory info 和file info 型別 directory和file通過靜態成員實現操作,擴充套件了system.object。返回強型別物件。directoryinfo和fileinfo通過例項級方法實現 必須使用new關鍵字分配它們 從filesystemin...