檔案之輸入與輸出
C++軟體本身提供了許多檔案的輸入與輸出,以方便讀者設計與檔案有關的系統函數。基本上,我們可以將這些函數分成兩大類。
1.
有緩衝區輸入與輸出(Buffered I/O)
當它在讀取檔案資料或將資料寫入檔案時,一定都先經過一個緩衝區。

2.
無緩衝區輸入與輸出(Unbuffered I/O)
所謂沒有緩衝區的輸入與輸出,表示輸入與輸出的動作是直接在磁碟內,執行讀取資料和寫入資料動作。

有緩衝區的輸入與輸出函數
|
函數名稱 |
功能說明 |
|
fopen(
) |
開啟一個檔案 |
|
fclose(
) |
關閉一個檔案 |
|
putc( ) |
輸出一個字元到檔案 |
|
getc( ) |
從某一個檔案讀取一個字元 |
|
fprintf(
) |
輸出資料至某檔案 |
|
fscanf(
) |
從某檔案讀取資料 |
|
feof( ) |
測試是否到了檔案結束位置 |
|
ferror(
) |
測試檔案操作是否正常 |
|
fseek(
) |
設定準備讀取檔案資料的位置 |
|
rewind(
) |
將準備讀取檔案資料位置,設定在檔案起始位置 |
|
remove(
) |
檔案的刪除 |
fopen( ) 用於開啟檔案,檔案在使用前是需先經過開啟動作的
使用格式如下:
|
FILE *fopen(char *filename, char
*mode); |
各項資料的定義如下所示:
1. *filename:檔案指標,指的是欲開啟的檔案名稱。
2. *mode:檔案使用模式,指的是檔案被開啟之後,它的使用方式。
下面是檔案開啟之後,一般常使用的方式:
|
"r" |
開啟一個文字檔(text),供程式讀取。 |
|
"w" |
開啟一個文字檔(text),供程式將資料寫入此檔案內。如果磁碟內不包含這個檔案,則系統會自行建立這個檔案。如果磁碟內包含這個檔案,則此檔案內容會被蓋過而消失。 |
|
"a" |
開啟一個文字檔(text),供程式將資料寫入此檔案的末端。如果此檔案不存在,則系統會自行建立此檔案。 |
|
"rb" |
開啟一個二元檔(binary),供程式讀取。 |
|
"wb" |
開啟一個二元檔,供程式將資料寫入此檔案內。如果磁碟內不包含這個檔案,則系統會自行建立這個檔案。如果磁碟內包含這個檔案,此檔案內容會被蓋過而消失。 |
|
"ab" |
開啟一個二元檔(binary),供程式將資料寫入此檔案末端,如果此檔案不存在,則系統會自行建立此檔案。 |
fclose( ) 用於關閉檔案,如果fclose( )執行失敗,它的傳回值是非零值
在C語言中關閉檔案主要有兩個目的:
1.
檔案在關閉前會將檔案緩衝區資料寫入磁碟檔案內,否則檔案緩衝區資料會遺失。
2.
一個C語言程式,在同一時間可開啟的檔案數量有限,一般是20個,如果你的程式很大,要開啟超過20個檔案時,你必須將暫時不用的檔案關閉。
fprintf( ) 主要目的是供你將資料,以格式化方式寫入某檔案內
使用格式如下:
|
fprintf( fp
, "……." , ………); |
此函數控制列印區和列印和列印變數區的使用,格式和printf( )使用格式相同. fprintf( )和printf( )兩者唯一的差別是,printf( )會將資料列印在螢幕上,而fprintf( )會將資料列印在某個檔案內。
|
#include <stdio.h> void main() { FILE *fp; int
var,i; int
sum = 0; float average; fp =
fopen("data1.txt","w"); /* open file pointer */ for ( i = 0; i < 5; i++ ) { printf("\1: input
number %d here ==>
",i+1);
scanf("%d",&var); sum += var; fprintf(fp,"%d\n",var); } average = (float) sum / 5.0; fprintf(fp,"\2: The average is
%6.2f",average); fclose(fp); } |
fscanf( ) 主要的目的是讓我們從某個檔案讀取資料
使用格式如下:
|
fscanf( fp
, "……." , ………); |
fscanf( )函數和scanf( )函數兩者之間最大的差別在,scanf( )函數主要用於從鍵盤輸入讀取資料,fscanf( )函數則是從fp檔案指標所指的檔案讀取資料。
|
#include <stdio.h> void main() { FILE *fp; int
i,j,var; fp =
fopen("data2.txt","r"); /* open file pointer */ for ( i = 0; i < 5; i++ ) { for ( j = 0; j < 5; j++ ) { fscanf(fp,"%d",&var); printf("%c",var); } printf("\n"); } fclose(fp); } |
putc( ) 主要功能是將一個字元寫入某檔案內,
格式如下
|
int putc( int
ch, FILE *fp ); |
此函數如果執行成功,它的傳回值是ch字元值,如果執行失敗,它的傳回值是EOF。且上述格式中,ch代表所欲輸出的字元,fp則是檔案指標。
下列為一個簡單建立一個檔案的程式應用。
|
1.
#include <stdio.h> 2.
void main() 3.
{
FILE *fp; 4.
char ch; 5.
fp =
fopen("sample.txt","w"); /*開啟一個文字檔(sample.txt),供程式將資料寫入此檔案內*/ 6.
printf("\1: Please input text here.
\n"); 7.
while ( (ch = getche()) != '\r' ) putc(ch,fp); /* 將讀入之字元輸出所設定的sample.txt檔案內*/ 8.
9.
fclose(fp); /*關閉指標為fp之檔案 */ 10.
} |
getc( ) 主要目的是某一個檔案中,讀取一個字元。,
使用格式如下:
|
int getc(FILE *fp); |
當執行getc( )函數成功時,傳回值是所讀取的字元,如果所讀取的是檔案結束字元,則此值是EOF,在stdio.h內,此值是 -1。