程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C Primer Plus(十三)

C Primer Plus(十三)

編輯:關於C語言

13.1 和文件進行通信

程序和文件進行通信的一種方式就是文件重定向。

13.1.1 文件是什麼

一個文件通常就是磁盤上的一段命名的存儲區。
C將文件看成是連續的字節序列,其中每一個字節都可以單獨的讀取。
ANSI C提供了文件的兩種視圖:文本視圖和二進制視圖。

13.1.2 文本視圖和二進制視圖

在二進制視圖中,文件中的每個字節都可以為程序所訪問。在文本視圖中,程序看到的內容和文件的內容有可能不同。
例如使用文本視圖讀取文件時,將把行尾的本地環境表示法映射為C視圖。與之類似,在輸出的時候,也會將C視圖中的行尾映射為本地環境表示法。

13.1.3 I/O級別

除了可以選擇文件的視圖,在大多數情況下,您可以在兩個I/O級別中進行選擇。
低級I/O使用操作系統提供的基本I/O服務,標准高級I/O使用一個標准的C庫函數包和stdio.h頭文件中的定義。
由於無法保證所有操作系統都可以用相同的低級I/O模型表示,所以ANSI C只支持標准I/O包。

13.1.4 標准文件

C程序自動為您打開三個文件。標准輸入、標准輸出、標准錯誤輸出。

13.2 標准I/O

除了可移植性外,標准I/O包相對於低級I/O有兩點優勢。
第一、標准I/O包中包含很多專用的函數,可以方便的處理不同的I/O問題。
第二、對輸入和輸出進行了緩沖。這種緩沖大大提高了數據傳輸率。

13.2.1 檢查命令行參數

首先,檢查argc的值,產看是否有命令行參數。字符串argv[0]是該程序的名稱。
exit()函數關閉所有打開的文件並終止程序。通常的約定是正常終止的程序傳遞值0,非正常終止的程序傳遞非0值。您也可以使用exit(EXIT_SUCCESS)和xit(EXIT_FAILURE)。
按照ANSI C,在最初調用的main()中使用return和調用exit()的效果相同。  //注意是“最初調用”,如果main()在一個遞歸程序中,exit()仍然會終止程序。但return將控制權移交給遞歸的前一級,直到最初。

13.2.2 fopen()函數

程序用fopen()打開文件,它的第一個參數是要打開的文件名,或者說是包含該文件名的字符串的地址。第二個參數用於指定文件打開模式的一個字符串。
如果不能打開文件,fopen()函數返回空指針。

13.2.3 getc()和putc()函數

例如ch=getc(fp),putc(ch,fpout);
putc(ch,stdout);第二個參數是標准輸出相關的文件指針,所以其效果與putchar(ch)一樣。

13.2.4 文件結尾

所以可以加一個條件while((ch=fgetc(fp))!=NULL)來測試。

13.2.5 fclose()函數

13.2.6 標准文件指針

13.3 文件I/O:fprintf()、fscanf()、fgets()和fputs()函數

13.3.1 fprintf()和fscanf()函數

rewind()命令使程序回到文件開始處,這樣最後的while循環就可以打印文件的內容。

13.3.2 fgets()和fputs()函數

fgets()函數接受三個參數,第一用於存儲輸入的地址。第二個參數為整數,表示輸入字符串的最大長度。最後一個參數是文件指針,指向要讀取的文件。
fgets(buf,MAX,fp) 該函數讀取它所遇到的第一個換行字符的後面,或者讀取比字符串的最大長度少一個的字符,或者讀取到文件結尾。然後fgets()函數向末尾添加一個空字符以構成一個字符串。
所以字符串的最大長度代表字符的最大數目再加上一個空字符。
fputs()函數接受兩個參數,它們一次是一個字符串的地址和一個文件指針,將字符串寫入指定文件。fputs(but,fp);

13.3.3 gets()和fgets()函數

13.4 隨機存取:fseek()和ftell()函數

fseek()函數允許你像對待數組那樣對待一個文件,在fopen()打開的文件直接移動到任意字節處。它接受3個參數,返回一個int值,ftell()函數以一個long類型值返回一個文件的當前位置。
在fseek()的三個參數中
第一個參數是一個指向被搜索文件的FILE指針。應該已經使用fopen()打開了該文件。
第二個參數稱為偏移量,表示從起始點開始要移動的距離。這個參數必須是一個lon類型的值,可以為正(前移)、負(後移),也可以為零(保持不動)。
第三個參數是模式,用來標識起始點。SEEK_SET:文件開始 SEEK_CUR:文件當前 SEEK_END:文件結尾
例如:fseek(fp,0L,SEEK_SET);
如果一切正常,fseek()返回值為0。有錯誤則返回-1。
ftell()函數為long類型,它返回文件的當前位置。ftell()函數通過返回距文件開始處的字節數目來確定文件的位置,文件的第一個字節到文件開始處的距離是字節0,以此類推。
last=ftell(fp);把從文件開始到文件結尾的字節數目賦給last。

13.5 標准I/O內幕

通常使用標准I/O的第一步就是用fopen()打開一個文件。fopen()函數不僅打開一個文件,而且建立了一個緩沖區,還創建了一個包含文件和緩沖區相關數據的數據結構。
下一步就是調用stdio.h頭文件中聲明的某個輸入函數,比如fscanf()等。會把一塊數據從文件復制到緩沖區中。
輸出函數將數據寫入緩沖區,緩沖區滿的時候,就將數據復制到文件中。

13.6 其它標准I/O函數

13.6.1 int ungetc(int c ,FILE *fp)函數

該函數將c指定的字符放回輸入流中,如果向輸入流中放人了一個字符,下一次調用標准輸入函數就會讀入那個字符。
例如 ch=getchar();ungetc(ch,stdin);

13.6.2 int fflush()函數

函數原型為int fflush(FILE *fp);它能將緩沖區任何未寫的數據發送到一個由fp指定的輸出文件中去。這個過程稱為刷新緩沖區。如果fp是一個空指針,將刷新掉所有的輸出緩沖。

13.6.3 int setvbuf()函數

函數原型是 int setvbuf(FILE * restrict fp,char * restrict buf,int mode ,size_t size);
setvbuf()函數建立了一個供標准I/O函數使用的替換緩沖區。打開文件後,在沒有對流進行任何操作以前,可以調用這個函數。由fp來指定流,buf指向將使用的緩沖區。若buf為NULL,自動分配緩沖區。
size變量為setvbuf()函數指定數組的大小。
mode將從下列選項中選取:
_IOFBF表示完全緩沖,_IOLBF表示行緩沖,_IONBF表示無緩沖。如果成功執行,函數返回零值,否則返回一個非零值。

13.6.4 二進制I/O:fread()和fwrite()函數

如果把數據存儲在一個使用與程序具有相同表示方法的文件中,就稱數據以二進制形式存儲。對於標准I/0,fread()和fwrite()函數提供了這種二進制服務。
實際上,所有的數據都是以二進制的方式進行存儲的。如果文件中的全部數據都以字符編碼的形式被解讀,我們稱該文件包含文本數據,如果部分或者全部以二進制形式解讀,就稱該文件包含二進制數據。
char buffer[256];fwrite(buffer,256,1,fp);第三個參數表示數據塊數目,這一調用將一塊256字節大小的數據塊從緩沖區寫入到文件。
double earning[10];fwrite(earnings,sizeof(double),10,fp);將數組中數據寫入文件,數據分成10塊,每塊double大小。
fread(earnings,sizeof(double),10,fp);恢復前一個例子中的數組,返回成功讀入的項目數。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved