C Gossip 未格式化檔案 I O

2021-06-05 09:11:58 字數 3515 閱讀 8732

要處理檔案的輸出入,您必須先include 標頭,如果要處理檔案輸出,您要使用fopen()函式開啟檔案,fopen()函式的雛型宣告如下: 

file* fopen (const char*, const char*);

file是個

struct自訂型態:

typedef struct _iobuf

file;

fopen()會傳回乙個file例項的位址值,實際上您不太需要了解file的每個成員作用,您只要將file的位址值傳給像是fgetc()、fputc()、fgets()、fputs()的函式進檔案i/o處理即可,

fopen ()的第乙個引數用來指定要開啟的檔名稱,第二個引數用來指定檔案i/o模式,模式基本上就是讀、寫、附加,分別可使用r、w與a來設定,如果加上+, 表示檔案可讀可寫,如果加上b,表示以區塊(block)方式,即二進位方式進行讀寫,例如以下是可設定的模式:

r開啟檔案進行唯讀,若檔案不存在,則傳回null

w開啟檔案進行唯寫,若檔案不存在,則建立新檔,則檔案存在則將之刪除,再建立新檔

a開啟檔案進行附加,若檔案存在,則資料從檔案尾端寫入,則檔案不存在則建立新檔

rb以二進位模式開啟檔案進行唯讀,windows 下需要加 b,linux 下則會予以忽略

wb以二進位模式開啟檔案進行唯寫

,windows 下需要加 b,linux 下則會予以忽略

ab以二進位模式開啟檔案進行附加

,windows 下需要加 b,linux 下則會予以忽略

r+開啟檔案進行讀寫,若檔案不存在,則建立新檔,若檔案存在,資料將從檔案開頭進行覆寫

w+開啟檔案進行讀寫,

若檔案不存在,則建立新檔,若檔案存在則覆寫原有的資料

a+開啟檔案進行附加、讀取,若檔案不存在則建立新檔,

若檔案存在,則資料從檔案尾端寫入

r+b以二進位方式開啟檔案進行讀寫

,windows 下需要加 b,linux 下則會予以忽略

w+b以二進位方式

開啟檔案進行讀寫

,windows 下需要加 b,linux 下則會予以忽略

a+b以二進位方式

開啟檔案進行附加、讀取

,windows 下需要加 b,linux 下則會予以忽略

windows作業系統將文字檔和二進位檔案當作兩種不同的檔案,而linux則不區別,在windows下讀寫非文字檔案,必須加上b模式,在linux下則會忽略b。

例如以下的程式片段可開啟乙個檔案進行讀取:

file *file = fopen("test.txt", "w");

若開啟檔案成功,則file將儲存位址值,您可以使用以下的程式片段來測試檔案是否開啟成功:

if(file == null)

null為使用#define定義的展開字,其值為0:

#define null 0

fopen()會使用緩衝區來減少對磁碟的實際i/o,以加快檔案訪問效率,當您在程式中進行讀寫動作時,實際上會先對緩衝區作訪問,而非實際的磁碟,

檔案開啟乙個重要的觀念與習慣是,不使用檔案時,一定要記得關閉檔案,閉關檔案會將緩衝區中的資料真正寫入磁碟,若忘了關閉檔案,可能會造成資料的遺失。

您可以使用fclose()來關閉檔案:

int fclose(file *fp);

若檔案正常關閉,則傳回0,否則將傳回非0值。

開啟檔案之後,您可以使用fgetc()來讀取檔案中的字元,使用fputc()來將字元寫入檔案:

int fgetc(file* fp);

int fputc(int ch, file *fp);

fgetc()傳入file例項的位址值,每執行一次就會從檔案中讀取乙個字元,直到讀到檔尾(end of file, eof)為止,文字模式時判斷檔案結尾,可以如下撰寫:

while((ch = fgetc(file)) != eof)

使用fgetc(),只要指定file位址值給它就可以了,而fputc()則指定要寫入的字元及file位址值。

下面這個程式直接示範如何讀取並寫入純文字檔案,會將指定的檔案讀取並複製至另乙個檔案:

#include int main(int argc, char* argv)  

file *file1 = fopen(argv[1], "r");

if(!file1)

file *file2 = fopen(argv[2], "w");

if(!file2)

char ch;

while((ch = fgetc(file1)) != eof)

fclose(file1);

fclose(file2);

return 0;

}

您也可以使用fgets()來讀取整個字串,使用fputs()來寫入整個字串:

char* fgets(char 

* str, int length, file *fp);

int fputs(char *str, file *fp);

fgets()第乙個引數為要讀入的字串儲存的陣列位址,第二個引數為要讀入的字元長度,由於字串必須包留字元陣列最後乙個元素為空白字元,才視之為字 串,所以實際讀入的長度為length - 1,第三個引數為file位址值,而fputs()第乙個引數為寫入的字串,第二個引數為file位址值。

以下的程式使用fgets()、fputs()改寫上面這個程式:

#include int main(int argc, char* argv)  

file *file1 = fopen(argv[1], "r");

if(!file1)

file *file2 = fopen(argv[2], "w");

if(!file2)

char str[50];

while(fgets(str, 50, file1) != null)

fclose(file1);

fclose(file2);

return 0;

}

在程式執行過程開啟的標準輸出stdout、標準輸入stdin、標準錯誤stderr,事實上也是檔案串流的特例,在c程式中,也常見到以下的方式,以便直接控制這三個標準輸入、輸出、錯誤:

#include int main(int argc, char* argv)  

file *file1 = fopen(argv[1], "r");

if(!file1)

file *file2 = fopen(argv[2], "w");

if(!file2)

char str[50];

while(fgets(str, 50, file1) != null)

fclose(file1);

fclose(file2);

return 0;

}

程式的執行結果與上乙個範例是相同的。

格式化,強調 數值格式化

聚合函式返回的的數值型別的值有個特點就是沒有被格式化。通過前面的帶 sum 聚合函式的示例,我們可以看到這一點 注意合計值 命令,或者在物件檢視器中選中 displayformat 屬性。在上節的示例中,格式化操作是針對一物件或物件內的表示式,在物件內僅有乙個表示式時它還能正常工作,不過當物件內不有...

linux 檔案格式化

1 按兩下小寫g,即gg,定位游標到第一行。2 按住shift v,即大寫v,進入視覺化編輯的列編輯模式。3 shift g,即大寫g,選中整個 4 按下等號 格式化所有 libxml2 是乙個xml的c語言版的解析器,本來是為gnome專案開發的工具,是乙個基於mit license的免費開源軟體...

格式化讀寫檔案fprintf,fscanf

define crt secure no warnings include include include int fprintf file stream,const char format,功能 根據引數format字串來轉換並格式化資料,然後將結果輸出到stream指定的檔案中,指定出現字串結束...