第一步:呼叫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...