檔案 標頭檔案 原始檔(C )

2021-07-24 10:23:45 字數 4825 閱讀 4848

標頭檔案和原始檔中的函式宣告與定義

【函式原型】

file *_fsopen( 

const

char *filename,

const

char *mode,

int shflag

);file *_wfsopen(

const

wchar_t *filename,

const

wchar_t *mode,

int shflag

);

注: _wfsopen 是 _fsopen 的寬字元版本,其他沒有什麼不同

【引數】

【返回值】

這些函式均返回指向流的指標。 乙個 null 指標值指示錯誤。 如果 filename 或 mode 是 null 指標或空字串,這些函式將呼叫無效的引數處理程式

【說明】

_fsopen 函式以流的形式開啟由 filename 指定的檔案並使該檔案做好準備以進行後續的共享讀寫,如模式和 shflag 引數所定義。 _wfsopen 是 _fsopen 的寬字元版本;_wfsopen 的 filename 和 mode 引數是寬字串。 除此以外,_wfsopen 和 _fsopen 的行為完全相同

引數mode說明

使用 「w」 和 「w+」 型別時要小心,因為它們可能會破壞現有檔案。

使用 「a」 或 「a+」 訪問型別開啟檔案時,所有寫入操作均將在檔案末尾進行。 使用 fseek 或 rewind 可重新定位檔案指標,但在執行任何寫入操作前,檔案指標將始終被移回檔案末尾。 因此,無法覆蓋現有資料。 指定 「r+」、」w+」 或 「a+」 訪問型別時,允許讀取和寫入(檔案將處於開啟狀態以進行更新)。 但是,在讀取與寫入之間切換時,必須有中間 fsetpos、fseek 或 rewind 操作。 如果需要的話,可以為 fsetpos 或 fseek 操作指定當前位置

mode後還可以追加以下模式:

引數shflag說明:

【函式原型】

用於從檔案流中讀取資料

size_t  fread(void *buffer, size_t size, size_t count, file * stream);
【引數】

fread()函式每次從stream中最多讀取count個單元,每個單元大小為size個位元組,將讀取的資料放到buffer;檔案流的位置指標後移 size * count 位元組。

【返回值】

返回實際讀取的單元個數。如果小於count,則可能檔案結束或讀取出錯;可以用ferror()檢測是否讀取出錯,用feof()函式檢測是否到達檔案結尾。如果size或count為0,則返回0。

【注意】

與fread()相對應的函式為fwrite(),fread() 和 fwrite() 一般用於二進位制檔案的輸入輸出,ascii檔案還是不要考慮了

【函式原型】

用來將資料寫入檔案流中

size_t fwrite(const

void * ptr, size_t size, size_t nmemb, file * stream);

【引數】

【返回值】

返回實際寫入的nmemb數量

【函式原型】

用於清空檔案緩衝區,如果檔案是以寫的方式開啟 的,則把緩衝區內容寫入檔案

int

fflush(file* stream);

【引數】

stream為檔案指標

【返回值】

成功返回0,失敗返回eof,錯誤**存於errno 中。指定的流沒有緩衝區或者唯讀開啟時也返回0值

【函式原型】

用於重新命名檔案、改變檔案路徑或更改目錄名稱

int rename(char * oldname, char * newname);
【引數】

【返回值】

修改檔名成功則返回0,否則返回-1;

【說明】

重新命名檔案:

重新命名目錄:

【函式原型】

用於刪除指定的檔案

int remove(char * filename);
【引數】

filename為要刪除的檔名,可以為一目錄。如果引數filename 為一檔案,則呼叫unlink()處理;若引數filename 為一目錄,則呼叫rmdir()來處理;

【返回值】

成功則返回0,失敗則返回-1,錯誤原因存於errno。

【錯誤**】

判斷檔案的訪問許可權

【函式原型】

int _access( const

char *path, int mode );

【引數】

【返回值】

【說明】

poco::directoryiterator it(string filepath)
用於列舉指定目錄下所有的檔案,引數filepath是指定的目錄

在乙個工程中函式只能被定義一次,而函式的宣告可以有很多次。通常不建議在標頭檔案中進行函式的定義,因為當頭檔案被多個原始檔包含時實際上就是將該段函式的定義**複製載入到當前原始檔之中,即被重複定義了,此時編譯器會提示函式重複定義的錯誤。

舉例01:

函式func01在原始檔b.cpp中定義,宣告在a.h標頭檔案中,此時也需要在原始檔b.cpp中新增a.h標頭檔案。其他原始檔如f.cpp需要呼叫func01函式時,在c.cpp中包含標頭檔案a.h即可。

舉例02:

但在類中有些成員函式是必須在類宣告(包含類宣告的標頭檔案)中定義的,如類的靜態成員函式,inline函式。

【函式原型】

int sprintf(char *buffer,const char *format [,argument] …);

int sprintf_s(char *buffer,size_t sizeofbuffer,const char *format [,argument] …);

【常見用法】

//把整數123 列印成乙個字串儲存在s 中。

sprintf(s, "%d", 123); //產生"123"

可以指定寬度,不足的左邊補空格:

sprintf(s, "%8d

%8d", 123, 4567); //產生:" 123 4567"

當然也可以左對齊:

sprintf(s, "%-8d%8d", 123, 4567); //產生:"123 4567"

也可以按照16 進製列印:

sprintf(s, "%8x", 4567); //小寫16 進製,寬度佔8 個位置,右對齊

sprintf(s, "%-8x", 4568); //大寫16 進製,寬度佔8 個位置,左對齊

【區別】

1、sprintf僅僅檢查format 或者緩衝區是否是空指標,如果有錯誤則返回相應的錯誤**,若格式化資料的長度大於緩衝區的長度,便會出現溢位;

2、sprintf_s在通過引數sizeofbuffer檢查快取區,若緩衝區不夠大時會失敗,失敗時緩衝區中是乙個空字串;

所用函式為vsprintf/vsprintf_s/wvsprintf/wvsprintf_s,其中vsprintf_s是vsprintf的安全版本,帶w字首的是寬字元版本

【函式原型】

int

vsprintf(char *string, char *format, va_list param);

【說明】

vsprintf 是sprintf 的乙個變形,它只有三個引數。vsprintf 用於執行有不定數量引數的函式,類似printf 格式。vsprintf的前兩個引數與sprintf相同:乙個用於儲存結果的字串緩衝區和乙個格式化字串。第三個引數是指向格式化引數佇列的指標。實際上,該指標指向在堆疊中供函式呼叫的變數。va_list、va_start和va_end巨集(在stdarg.h中定義)幫助我們處理堆疊指標。本章最後的scrnsize程式展示了使用這些巨集的方法

【示例】

int sprintf (char * szbuffer, const char * szformat, ...)

C語言 原始檔 標頭檔案 c cc h 的使用

乙個函式包括定義與宣告,定義中包含了函式是如何實現的,宣告則闡明函式如何被呼叫。工程上為了將個函式模組化,通常將宣告與定義分開,一般將主函式定義放在.c中,其他函式定義放在原始檔.cc中,函式宣告放在.h中。c 中包含主函式,並include所有使用到的標頭檔案 cc中包含其他函式定義,並inclu...

標頭檔案和原始檔

一.例1 test.h void show test.cpp include using namespace std void show includeproblem.cpp include test.h int main 可以看到 includeproblem.cpp檔案彙總 include te...

C 標頭檔案和原始檔的關係

一 原始檔如何根據 include 來關聯標頭檔案 1,系統自帶的標頭檔案用尖括號括起來 include,這樣編譯器會在系統檔案目錄下查詢。2,使用者自定義的檔案用雙引號括起來 include h 編譯器首先會在使用者目錄下查詢,然後在到 c 安裝目錄 比如 vc中可以指定和修改庫檔案查詢路徑,un...