幾個基本概念_第1頁
幾個基本概念_第2頁
幾個基本概念_第3頁
幾個基本概念_第4頁
幾個基本概念_第5頁
已閱讀5頁,還剩38頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、1第第13章章文件文件21 幾個基本概念2 文件類型指針3 文件的打開與關閉4 文件的讀寫5 文件的定位6 總結文件文件3幾個基本概念4 文件的基本概念文件的基本概念u文件(文件(file):存儲在外部介質上的數據的集合。:存儲在外部介質上的數據的集合。u操作系統是以文件為單位對數據進行管理的。在程序運行時,操作系統是以文件為單位對數據進行管理的。在程序運行時,常常需要將一些數據輸出到磁盤上存放起來,以后需要時再從常常需要將一些數據輸出到磁盤上存放起來,以后需要時再從磁盤中輸入到計算機內存。這就要用到磁盤中輸入到計算機內存。這就要用到磁盤文件磁盤文件。uwindows下每個文件對應的四項參數:

2、文件名、大小、類型、下每個文件對應的四項參數:文件名、大小、類型、修改時間修改時間uC語言把文件看作是一個字符(字節)的序列,即由一個一個語言把文件看作是一個字符(字節)的序列,即由一個一個字符(字節)的數據順序組成。根據數據的組織形式,可分為字符(字節)的數據順序組成。根據數據的組織形式,可分為ASCII文件(文本文件)文件(文本文件)和和二進制文件二進制文件。5文本文件文本文件l文本文件的每一個字節放一個文本文件的每一個字節放一個ASCIIASCII碼,代表一個字符。文本文件的碼,代表一個字符。文本文件的輸出與字字符對應,一個字節代表一個字符,例如一個整數輸出與字字符對應,一個字節代表一個

3、字符,例如一個整數1000010000占占用用5 5個字節個字節l因此便于對字符逐個處理,也便于輸出字符。因此便于對字符逐個處理,也便于輸出字符。l文本文件由文本行組成,每一行中可以有文本文件由文本行組成,每一行中可以有0 0個或者多個字符,并以換個或者多個字符,并以換行符行符nn結尾,文本結束標記是結尾,文本結束標記是0X1A0X1A。在文本文件向計算機輸入的時。在文本文件向計算機輸入的時候,將回車換行符候,將回車換行符(r,n(r,n)轉換為換行符,在輸出的時候把換行轉換為換行符,在輸出的時候把換行符符(n)(n)轉換為回車和換行兩個字符。轉換為回車和換行兩個字符。l例如輸入例如輸入abc

4、dabcdefghefgh則存儲為文本文件以后,第則存儲為文本文件以后,第7 7個字符是個字符是f f而不是而不是e el例如:例如:1000010000是整型數據,用二進制表示占兩個字節,如用是整型數據,用二進制表示占兩個字節,如用ASCIIASCII碼輸出,則占五個字節。碼輸出,則占五個字節。 l 二進制形式二進制形式:00100111 0001000000100111 00010000l ASCIIASCII形式形式:00110001 00110000 00110000 00110000 0011000000110001 00110000 00110000 00110000 001100

5、006二進制文件二進制文件l二進制文件是把內存中的數據按其在內二進制文件是把內存中的數據按其在內存中的存儲形式原樣輸出到磁盤上存放。存中的存儲形式原樣輸出到磁盤上存放。l其優點是節省空間其優點是節省空間 , , 輸入輸出速度快輸入輸出速度快; ; l缺點是一個字節并不對應一個字符(如缺點是一個字節并不對應一個字符(如一個整數一個整數1000010000占用占用2 2個字節),不能直個字節),不能直接輸出字符的形式。接輸出字符的形式。l二進制文件不能象文本文件那樣從回車二進制文件不能象文本文件那樣從回車換行符到換行符之間的轉換。換行符到換行符之間的轉換。7設備文件設備文件l在在C C中把所有外部

6、設備作為文件對待,這樣的文中把所有外部設備作為文件對待,這樣的文件稱為設備文件。例如把打印機設為設備文件件稱為設備文件。例如把打印機設為設備文件的時候,由系統命名為的時候,由系統命名為PRNPRN文件。向文件。向PRNPRN文件文文件文件輸出數據,就是向打印機輸出數據。件輸出數據,就是向打印機輸出數據。C C語言中語言中常用的標準設備的文件名如下:常用的標準設備的文件名如下:lCONCON或或KYBD KYBD 鍵盤鍵盤lCON CON 或或 SCRN SCRN 顯示器顯示器lPRNPRN或或LPT1LPT1打印機打印機lAUXAUX或或COM1COM1異步通信口異步通信口l另外還有另外還有3

7、 3個標準設備文件的文件結構體指針也個標準設備文件的文件結構體指針也是由系統命名而成的是由系統命名而成的lstdinstdinlstdoutstdoutlstderrstderr8流流l流是程序輸入或者輸一個出的一個連流是程序輸入或者輸一個出的一個連續序列,設備(鍵盤,磁盤,顯示器續序列,設備(鍵盤,磁盤,顯示器和打印機等)輸入輸出都是用流來處和打印機等)輸入輸出都是用流來處理的。在理的。在C C語言中,所有的流均以文件語言中,所有的流均以文件的形式出現,包括設備文件。流實際的形式出現,包括設備文件。流實際上是文件輸入輸出的一種動態的形式。上是文件輸入輸出的一種動態的形式。一個一個C C文件即

8、是字節流或二進制流。文件即是字節流或二進制流。9文件類型指針10u從磁盤文件輸入數據時從磁盤文件輸入數據時(即讀文件即讀文件), 先將數據送到先將數據送到輸入緩沖區輸入緩沖區, 再從緩沖區將數據傳送給程序數據區再從緩沖區將數據傳送給程序數據區(即傳給程序中的變量即傳給程序中的變量) ; 向磁盤文件輸出數據時向磁盤文件輸出數據時(即寫文件即寫文件), 先將程序中變量的值送到先將程序中變量的值送到輸出緩沖區輸出緩沖區, 等緩沖區裝滿后再將數據一起傳送給磁盤文件等緩沖區裝滿后再將數據一起傳送給磁盤文件. 使用緩沖區的目的是為了減少對磁盤的實際讀寫次數。使用緩沖區的目的是為了減少對磁盤的實際讀寫次數。

9、u2. 磁盤文件系統的分類磁盤文件系統的分類u(1) 緩沖文件系統緩沖文件系統: 系統自動的在內存區為每一個正在使用系統自動的在內存區為每一個正在使用的文件開辟一個緩沖區的文件開辟一個緩沖區. 緩沖區的大小由具體的緩沖區的大小由具體的C版本確定版本確定, 一般為一般為512字節字節.u(2) 非緩沖文件系統非緩沖文件系統: 系統不是自動開辟確定大小的緩沖區系統不是自動開辟確定大小的緩沖區,由程序為每個文件設定緩沖區及其大小由程序為每個文件設定緩沖區及其大小(即緩沖區由用戶根即緩沖區由用戶根據需要自己進行設置據需要自己進行設置) .uANSI C標準采用標準采用緩沖文件系統緩沖文件系統處理文本文

10、件和二進制文件。處理文本文件和二進制文件。u在在C語言中,對文件的讀寫都是用庫函數來實現的。語言中,對文件的讀寫都是用庫函數來實現的。磁盤文件系統磁盤文件系統11u緩沖文件系統中,每個被使用的文件都在內存中開辟一個區,用來緩沖文件系統中,每個被使用的文件都在內存中開辟一個區,用來存放文件的有關信息(如文件的名字、文件狀態及文件當前位置等存放文件的有關信息(如文件的名字、文件狀態及文件當前位置等)。)。u要使用一個文件需要有一定的信息要使用一個文件需要有一定的信息 , 如文件如文件當前的讀寫位置當前的讀寫位置, 與文件與文件對應的內存緩沖區地址對應的內存緩沖區地址, 文件的操作方式等文件的操作方

11、式等.這些信息都存放在這些信息都存放在文件文件信息區信息區中中 , 文件信息區文件信息區是一個結構體變量是一個結構體變量 , 其結構體類型由系統其結構體類型由系統定義定義, 類型名為類型名為 FILE 。Turbo C在在stdio.h文件中即有文件中即有FILE類型聲類型聲明。明。u可以定義文件型指針變量。可以定義文件型指針變量。如:如:FILE *fp; fp是一個指向是一個指向FILE類型結構體的指針變量。通過文件指針變量能類型結構體的指針變量。通過文件指針變量能夠找到與它相關的文件,以實現對文件的訪問。夠找到與它相關的文件,以實現對文件的訪問。注意注意: 1. 只有通過文件指針變量才能

12、調用相應的文件只有通過文件指針變量才能調用相應的文件 2. 有有n個文件就要定義個文件就要定義n個文件指針變量個文件指針變量, 分別對應各個文件分別對應各個文件 3. FILE必須大寫必須大寫磁盤文件系統磁盤文件系統12文件的打開與關閉13打開文件打開文件u對文件讀寫之前應該對文件讀寫之前應該打開打開該文件,在使用結束之后應該文件,在使用結束之后應關閉關閉該文件。該文件。uANSI C規定了標準輸入輸出函數庫,用規定了標準輸入輸出函數庫,用 fopen()函數來實函數來實現打開文件。調用方式為:現打開文件。調用方式為:FILE *fp;fp=fopen(文件名,使用文件方式)(文件名,使用文件

13、方式);例如:例如: fp=fopen(a1, r);u在打開一個文件時,通知給編譯系統以下在打開一個文件時,通知給編譯系統以下3個信息:個信息:需要打開的文件名,也就是準備訪問的文件的名字。需要打開的文件名,也就是準備訪問的文件的名字。使用文件的方式(使用文件的方式(讀讀還是還是寫寫等)。等)。讓哪一個指針變量指向被打開的文件。讓哪一個指針變量指向被打開的文件。14打開文件打開文件mode含含 義義當文件不存在當文件不存在當指定文件存在當指定文件存在r讀取(文本文件)讀取(文本文件)正常打開正常打開正常打開正常打開w寫入(文本文件)寫入(文本文件)建立新文件建立新文件文件原有內容丟失文件原有

14、內容丟失a追加(文本文件)追加(文本文件)建立新文件建立新文件在文件末尾添加在文件末尾添加rb讀取(二進制文件)讀取(二進制文件)出錯出錯正常打開正常打開wb寫入(二進制文件)寫入(二進制文件)建立新文件建立新文件文件原有內容丟失文件原有內容丟失ab追加(二進制文件)追加(二進制文件)建立新文件建立新文件在文件末尾添加在文件末尾添加r+讀取讀取/ /寫入(文本文件)寫入(文本文件)出錯出錯正常打開正常打開w+寫入寫入/ /讀取(文本文件)讀取(文本文件)建立新文件建立新文件文件原有內容丟失文件原有內容丟失a+讀取讀取/ /追加(文本文件)追加(文本文件)建立新文件建立新文件在文件末尾添加在文件

15、末尾添加rb+讀取讀取/ /寫入(二進制文件)寫入(二進制文件)出錯出錯正常打開正常打開wb+寫入寫入/ /讀取(二進制文件)讀取(二進制文件)建立新文件建立新文件文件原有內容丟失文件原有內容丟失ab+讀取讀取/ /追加(二進制文件)追加(二進制文件)建立新文件建立新文件在文件末尾添加在文件末尾添加15打開文件打開文件l如果不能實現如果不能實現 打開打開 的任務,的任務,fopenfopen函數函數將會帶回一個出錯信息。此將會帶回一個出錯信息。此時時fopenfopen函數將帶回一個空指針值函數將帶回一個空指針值NULLNULL。出錯的原因可能是:。出錯的原因可能是:l用用rr方式打開一個并不

16、存在的文件方式打開一個并不存在的文件; ;l磁盤出故障磁盤出故障; ;l磁盤已滿無法建立新文件等。磁盤已滿無法建立新文件等。#include stdlib.h#include stdio.hmain() FILE *fp; if (fp=fopen(“c:/abc.txt”,“r+”)!=NULL) /如果換成fopen(“PRN”,”w”); 表示什么? printf(open file success); else printf(open file failed); exit(0); 說明說明: exit : exit 函數的作用是關閉所有文件函數的作用是關閉所有文件, , 結束程序結束程

17、序, , 并返回并返回 操作系統操作系統, , 也可寫成也可寫成 exit ( ) ; exit ( ) ; 注意注意: : 使用使用exitexit函數要包含頭文件函數要包含頭文件 stdlib.h 16系統標準文件系統標準文件u說明:說明:在程序開始運行時,系統自動打開在程序開始運行時,系統自動打開3個標準文件:個標準文件:標準標準輸入、標準輸出、標準出錯輸出輸入、標準輸出、標準出錯輸出。通常這通常這3個文件都與終端相聯系,因此我們所用到的從個文件都與終端相聯系,因此我們所用到的從終端輸入或輸出都不需要打開終端文件文件。終端輸入或輸出都不需要打開終端文件文件。系統自動定義了系統自動定義了3

18、個文件指針個文件指針stdin、stdout和和stderr,分,分別指向終端輸入、終端輸出和標準出錯輸出(也從終別指向終端輸入、終端輸出和標準出錯輸出(也從終端輸出)。端輸出)。如果程序中指定要從如果程序中指定要從stdin所指的文件輸入數據,就是所指的文件輸入數據,就是指從終端鍵盤輸入數據。指從終端鍵盤輸入數據。17關閉文件關閉文件u在使用完一個文件后應在使用完一個文件后應關閉關閉該文件,以防止它再被該文件,以防止它再被誤用。誤用。u關閉關閉就是使文件指針變量不指向該文件,此后不能就是使文件指針變量不指向該文件,此后不能再通過該指針對原來與其相聯系的文件進行讀寫操作再通過該指針對原來與其相

19、聯系的文件進行讀寫操作。uANSI C規定了標準輸入輸出函數庫,用規定了標準輸入輸出函數庫,用 fclose()函數關函數關閉文件。調用方式為:閉文件。調用方式為:fp=fclose(文件指針)(文件指針);例如:例如: fclose(fp);u在程序終止之前應關閉所有文件,否則將會丟失數據在程序終止之前應關閉所有文件,否則將會丟失數據。ufclose函數帶回一個值:函數帶回一個值:當順利地執行了關閉操作,則返回值為當順利地執行了關閉操作,則返回值為0;否則返回否則返回-1。可以用可以用ferror函數函數來測試。來測試。18文件的讀寫19文件字符輸入輸出函數文件字符輸入輸出函數u把一個字符寫

20、到磁盤文件上去。調用形式為:把一個字符寫到磁盤文件上去。調用形式為: fputc(字符,文件指針)(字符,文件指針);例如:例如: fputc(ch, fp);ufputc函數帶回一個值:函數帶回一個值:如果輸出成功,則返回值為如果輸出成功,則返回值為輸出的字符輸出的字符;如果輸出失敗,則返回如果輸出失敗,則返回-1。uputchar函數是從函數是從fputc函數派生出來的。函數派生出來的。putchar(c)是在是在stdio.h文件中用預處理命令文件中用預處理命令#define定義的定義的宏宏: #define putchar(c) fputc(c, stdout);從用戶角度看,可以把從

21、用戶角度看,可以把putchar(c)看作函數。看作函數。20文件字符輸入輸出函數文件字符輸入輸出函數u從指定的文件讀入一個字符,該文件必須是以從指定的文件讀入一個字符,該文件必須是以讀讀或或讀寫讀寫方式方式打開的。調用形式為:打開的。調用形式為: ch=fgetc(文件指針)(文件指針);例如:例如: ch=fgetc(fp);ufgetc函數帶回一個字符,賦給函數帶回一個字符,賦給ch。如果在執行如果在執行fgetc函數讀字符時遇到文件結束符,函數返函數讀字符時遇到文件結束符,函數返回一個文件結束標志回一個文件結束標志EOF(-1)。例如:例如: ch=fgetc(fp); while (

22、ch!=EOF) putchar(ch); ch=fgetc(fp); 21uEOF定義為定義為-1,只適用于讀文本文件的情況,不適用于讀二,只適用于讀文本文件的情況,不適用于讀二進制文件。進制文件。uANSI C提供一個提供一個feof函數函數來判斷文件是否真的結束。來判斷文件是否真的結束。feof(fp)用來測試用來測試fp所指向的文件當前狀態是否為所指向的文件當前狀態是否為文件文件結束結束。如果是如果是文件結束文件結束,函數的值為,函數的值為1(真真),否則為,否則為0(假假) 。例如:例如: while (! feof(fp) ch=fgetc(fp); ufeof函數既適用于二進制文

23、件,也適用于文本文件函數既適用于二進制文件,也適用于文本文件。文件字符輸入輸出函數文件字符輸入輸出函數22例:從鍵盤輸入一些字符,逐個把它們送到磁盤上去,直到輸入一個例:從鍵盤輸入一些字符,逐個把它們送到磁盤上去,直到輸入一個#為止。為止。 #include stdio.h #include stdlib.h main() FILE *fp; char ch, filename20; scanf(%s, filename); if (fp=fopen(filename, w)=NULL) printf(cannot open filen); exit(0); ch=getchar( ); ch

24、=getchar( ); while (ch!=#) fputc(ch, fp); putchar(ch); ch=getchar( ); fclose(fp); d:tmpfile1.c Computer and c# Computer and c文件字符輸入輸出函數文件字符輸入輸出函數23文件字符輸入輸出函數文件字符輸入輸出函數將一個磁盤文件中的信息讀到屏幕上將一個磁盤文件中的信息讀到屏幕上#include stdio.h main() FILE *fp1, *fp2; fp1=fopen(file1.c, r); fp2=fopen(file2.c, w); while ( !feof(

25、fp1) ) putchar(getc(fp1); fclose(fp1);24例:將一個磁盤文件中的信息復制到另一個磁盤文件中。例:將一個磁盤文件中的信息復制到另一個磁盤文件中。 #include stdio.h #include stdlib.h main() FILE *in, *out; char ch, infile20, outfile20; printf(Enter the infile name:n); scanf(%s, infile); printf(Enter the outfile name:n); scanf(%s, outfile); if (in=fopen(in

26、file, r)=NULL) printf(cannot open infilen); exit(0); if (out=fopen(outfile, w)=NULL) printf(cannot open outfilen); exit(0); while (!feof(in) fputc(fgetc(in), out); fclose(in); fclose(out); Enter the infile name: D:tmpfile1.c Enter the outfile name: D:tmpfile2.c 文件字符輸入輸出函數文件字符輸入輸出函數25文件字符串輸入輸出函數文件字符串

27、輸入輸出函數uANSI C設置兩個函數設置兩個函數fread和和fwrite,用來讀寫一個數據塊,用來讀寫一個數據塊(一組數據,如一個實數或一個結構體變量的值)。它們的(一組數據,如一個實數或一個結構體變量的值)。它們的一般調用形式為:一般調用形式為: fread(buffer, size, count, fp); fwrite(buffer, size, count, fp);buffer:是一個指針。對:是一個指針。對fread來說,它是讀入數據的存來說,它是讀入數據的存放地址放地址;對對fwrite來說,是要輸出數據的起始地址。來說,是要輸出數據的起始地址。size:要讀寫的字節數。:要

28、讀寫的字節數。count:要進行讀寫多少個:要進行讀寫多少個size字節的數據項字節的數據項。fp:文件型指針。:文件型指針。若函數調用成功,則返回值為若函數調用成功,則返回值為count的值。的值。u如果文件以二進制形式打開,用如果文件以二進制形式打開,用fread和和fwrite函數就可以讀函數就可以讀寫任何類型的信息,寫任何類型的信息,如:如: fread(f, 4, 2, fp);26u例:例: struct student_type char name10; int num; int age; char addr30; stu40; for(i=0; i40; i+) fread(&

29、amp;studi, sizeof(struct student_type), 1, fp); for(i=0; i40; i+) fwrite(&studi, sizeof(struct student_type), 1, fp);ufread和和fwrite函數一般用于二進制文件的輸入輸出,因為它們是函數一般用于二進制文件的輸入輸出,因為它們是按數據塊的長度來處理輸入輸出的。在字符發生轉換的情況下很按數據塊的長度來處理輸入輸出的。在字符發生轉換的情況下很可能出現與原設想不同的情況。可能出現與原設想不同的情況。文件字符串輸入輸出函數文件字符串輸入輸出函數27例:從鍵盤輸入例:從鍵盤輸

30、入4個學生的有關數據,然后把它們轉存到磁盤文件上去。個學生的有關數據,然后把它們轉存到磁盤文件上去。 #include stdio.h #define SIZE 4 struct student_type char name10; int num; int age; char addr15; studSIZE; main() void save( ); int i; for (i=0; iSIZE; i+) scanf(%s%dn, , &studi.num); scanf(%d%s, &studi.age, studi.addr); save( ); 文件

31、字符串輸入輸出函數文件字符串輸入輸出函數28例:從鍵盤輸入例:從鍵盤輸入4個學生的有關數據,然后把它們轉存到磁盤文件上去。個學生的有關數據,然后把它們轉存到磁盤文件上去。 void save( ) FILE *fp; int i; if ( (fp=fopen(stu_list, wb)=NULL) printf(cannot open filen); return; for (i=0; iSIZE; i+) if (fwrite(&studi, sizeof(struct student_type), 1, fp)!=1) printf(file write errorn); fcl

32、ose(fp); Zhang 1001 19room_101Fan 1002 20 room_102Tan 1003 21 room_103Ling 1004 21 room_104文件字符串輸入輸出函數文件字符串輸入輸出函數29例:從例:從stu_list文件中讀入數據,然后在屏幕上輸出。文件中讀入數據,然后在屏幕上輸出。 #include stdio.h #define SIZE 4 struct student_type char name10; int num; int age; char addr15; studSIZE; main() int i; FILE *fp; fp=fop

33、en(stu_list, rb); for (i=0; iSIZE; i+) fread(&studi, sizeof(struct student_type), 1, fp); printf(%-10s %4d, , studi.num); printf(%4d %-15s, studi.age, studi.addr); fclose(fp ); Zhang 1001 19 room_101Fan 1002 20 room_102Tan 1003 21 room_103Ling 1004 21 room_104文件字符串輸入輸出函數文件字符串輸入輸出函數30例:

34、從二進制文件例:從二進制文件stu_dat中讀入數據,并輸出到中讀入數據,并輸出到stu_list 文件中去。文件中去。 void load( ) FILE *fp; int i; if ( (fp=fopen(stu_dat, rb)=NULL) printf(cannot open infilen); return; for (i=0; iSIZE; i+) if (fread(&studi, sizeof(struct student_type), 1, fp)!=1) if (feof(fp) fclose(fp); return; printf(file read error

35、n); fclose(fp); main( ) load( ); save( ); 文件字符串輸入輸出函數文件字符串輸入輸出函數31文件的格式化輸入輸出函數文件的格式化輸入輸出函數u函數函數fprintf和和fscanf是格式化讀寫函數,讀寫對象不是終端是格式化讀寫函數,讀寫對象不是終端而是磁盤文件。它們的一般調用形式為:而是磁盤文件。它們的一般調用形式為: fprintf(文件指針文件指針, 格式字符串格式字符串, 輸出表列輸出表列); fscanf(文件指針文件指針, 格式字符串格式字符串, 輸入表列輸入表列);例如:例如: fprintf(fp, %d, %6.2f, i, t); fs

36、canf(fp, %d, %f, &i, &t);u用用fprintf和和fscanf函數對磁盤文件進行讀寫,使用方便,容函數對磁盤文件進行讀寫,使用方便,容易理解易理解;但由于在輸入時要將但由于在輸入時要將ASCII碼轉換為二進制形式,在碼轉換為二進制形式,在輸出時又要將二進制形式轉換成字符,花費時間比較多。輸出時又要將二進制形式轉換成字符,花費時間比較多。u在內存與磁盤頻繁交換數據的情況下,最好不用在內存與磁盤頻繁交換數據的情況下,最好不用fprintf和和fscanf函數,而用函數,而用fread和和fwrite函數。函數。32u函數函數putw和和getw,用來對磁盤文

37、件讀寫一個字(整數)。,用來對磁盤文件讀寫一個字(整數)。例如:例如: putw(10, fp); /*將整數將整數10輸出到輸出到fp指向的文件指向的文件*/ i=getw(fp); /*從從fp指向的文件中讀一個整數到內存,賦給整型變量指向的文件中讀一個整數到內存,賦給整型變量i*/u函數函數fgets和和fputs,是從指定文件讀入一個字符串。,是從指定文件讀入一個字符串。例如:例如: fgets(str, n, fp); n為要求得到的字符為要求得到的字符;但只從但只從fp指向的文件中輸入指向的文件中輸入n-1個字個字符,然后在最后加一個符,然后在最后加一個0字符。字符。若在讀完若在讀

38、完n-1個字符之前遇到換行符或個字符之前遇到換行符或EOF,讀入即結束,讀入即結束。得到的字符放到字符數組得到的字符放到字符數組str中。中。函數返回值為函數返回值為str的首地址。的首地址。其他讀寫函數其他讀寫函數33其他讀寫函數其他讀寫函數u函數函數fputs,作用是向指定文件輸出一個字符串。,作用是向指定文件輸出一個字符串。例如:例如: fputs(China, fp); /*將字符串將字符串China輸出到輸出到fp指向的文件指向的文件*/函數中第一個參數可以是字符串常量、字符數組名或字函數中第一個參數可以是字符串常量、字符數組名或字符型指針。符型指針。字符串末尾的字符串末尾的0字符不

39、輸出。字符不輸出。若輸出成功,函數返回值為若輸出成功,函數返回值為0;失敗時,為失敗時,為EOF(-1)。u函數函數fputs和和fgets類似于類似于puts和和gets函數,只是函數,只是fputs和和fgets函函數以指定的文件為讀寫對象。數以指定的文件為讀寫對象。u可以自己編寫讀寫任何類型數據的函數。可以自己編寫讀寫任何類型數據的函數。34文件的定位35 文件定位文件定位uftell函數的作用是得到流式文件中的當前位置,用相函數的作用是得到流式文件中的當前位置,用相對于文件開頭的位移量來表示。對于文件開頭的位移量來表示。u如果如果ftell函數的返回值為函數的返回值為-1L,表示出錯。

40、,表示出錯。例如:例如: i=ftell(fp); if (i=-1L) printf(errorn); /*變量變量i 存放當前位置存放當前位置*/ /*若調用函數出錯,則輸出若調用函數出錯,則輸出error*/36u文件中有一個位置指針,指向當前讀寫的位置。文件中有一個位置指針,指向當前讀寫的位置。u如果順序讀寫一個文件,每次讀寫一個字符,則讀寫完如果順序讀寫一個文件,每次讀寫一個字符,則讀寫完一個字符后,該位置指針自動移動指向下一個字符位置一個字符后,該位置指針自動移動指向下一個字符位置。可用有關函數強制使位置指針指向其他指定的位置。可用有關函數強制使位置指針指向其他指定的位置。u關閉關

41、閉就是使文件指針變量不指向該文件,此后不能再就是使文件指針變量不指向該文件,此后不能再通過該指針對原來與其相聯系的文件進行讀寫操作。通過該指針對原來與其相聯系的文件進行讀寫操作。urewind()函數的作用是使位置指針重新返回文件的開頭函數的作用是使位置指針重新返回文件的開頭。此函數沒有返回值。調用形式為:。此函數沒有返回值。調用形式為:rewind(文件指針)(文件指針);例如:例如: rewind(fp); 文件定位文件定位37例:有一個磁盤文件,第一次將它的內容顯示在屏幕上,第二次例:有一個磁盤文件,第一次將它的內容顯示在屏幕上,第二次把它復制到另一文件上。把它復制到另一文件上。 #in

42、clude stdio.h main() FILE *fp1, *fp2; fp1=fopen(file1.c, r); fp2=fopen(file2.c, w); while ( !feof(fp1) ) putchar(getc(fp1); rewind(fp1); while ( !feof(fp1) ) putc(getc(fp1), fp2); fclose(fp1); fclose(fp2); 文件定位文件定位38u對流式文件可以進行順序讀寫,也可以進行隨機讀寫。對流式文件可以進行順序讀寫,也可以進行隨機讀寫。關鍵在于控制文件的位置指針。關鍵在于控制文件的位置指針。如果位置指針是

43、按字節位置順序移動的,就是順序如果位置指針是按字節位置順序移動的,就是順序讀寫讀寫;如果能將位置指針按需要移動到任意位置,就可以如果能將位置指針按需要移動到任意位置,就可以實現隨機讀寫。實現隨機讀寫。u所謂隨機讀寫,是指讀完上一個字符(字節)后,并不所謂隨機讀寫,是指讀完上一個字符(字節)后,并不一定要讀寫其后續的字符(字節),而可以讀寫文件中一定要讀寫其后續的字符(字節),而可以讀寫文件中任意所需的字符(字節)。任意所需的字符(字節)。u用用fseek函數可以實現改變文件的位置指針。其調用形式函數可以實現改變文件的位置指針。其調用形式為:為: fseek(文件類型指針(文件類型指針, 位移量

44、位移量, 起始點)起始點); 文件定位文件定位39u調用形式為:調用形式為:fseek(文件類型指針文件類型指針, 位移量位移量, 起始點起始點);起始點起始點:用:用0、1或或2代替,含義如下:代替,含義如下:位移量位移量:以:以起始點起始點為基點,向前移動的字節數。為基點,向前移動的字節數。ANSI C標準要求位移量是標準要求位移量是long型數據,規定在數字型數據,規定在數字的末尾加一個的末尾加一個L,表示該數字是,表示該數字是long型型。ufseek函數一般用于二進制文件,因為文本文件要發生字函數一般用于二進制文件,因為文本文件要發生字符轉換,計算位置時往往會發生混亂。符轉換,計算位置時往往會發生混亂。起始點起

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論