fscanf 函數只能從文本文件中按格式輸入。fscanf 函數和 scanf 函數相似,只是輸入的對象是磁盤上文本文件的數據。函數的調用形式如下:
fscanf( 文件指針,格式控制字符串,輸入項表 );
例如,若文件指針 fp 指向一個已打開的文本文件,a、b 分別為整型變量,則以下語句從 fp 所指的文件中讀入兩個整數放入變量 a 和 b 中:
fscanf( fp, "%d%d", &a, &b );
注意:文件中的兩個整數之間用空格(跳格符、回車符)隔開。
fscanf( stdin, "%d%d", &a, &b );
等價於:
scanf( “%d%d”, &a, &b );
因為文件指針 stdin 代表終端鍵盤。
fprintf 函數按格式將內存中的數據轉換成對應的字符,並以 ASCII 代碼形式輸出到文本文件中。fprintf 函數和 printf 函數相似,只是輸出的內容將按格式存放在磁盤的文本文件中。函數的調用形式如下:
fprintf( 文件指針,格式控制字符串,輸出項表);
例如,若文件指針 fp 指向一個已打開的文本文件,x、y 分別為整型變量,則以下語句將把 x 和 y 兩個整型變量中的整數按 %d 格式輸出到 fp 所指的文件中。
fprintf( fp, "%d %d", x, y );
注意:為了便於以後讀入,兩個數之間應當用空格隔開。同時為了以後便於讀入,最好不要輸出附加的其他字符串。
fprintf( stdout, "%d %d", x, y);
等價於:
printf("%d %d", x, y);
文件指針 stdout 代表終端屏幕。
fgets 函數用來從文件中讀入字符串。fgets 函數的調用形式如下:
fgets( str, n, fp );
此處,fp 是文件指針,str 是存放字符串的起始地址,n 是一個 int 型變量。函數的功能是從 fp 所指文件中讀入 n-1 個字符放入以 str 為起始地址的空間內。如果在未讀滿 n-1 個字符時,已讀到一個換行符或一個 EOF(文件結束標志),則結束本次讀操作,讀入字符串的最後包含讀到的換行符。因此,調用 fgets 函數時,最多能讀入 n-1 個字符。讀入結束後,系統將自動在最後加 '\0',並以 str 作為函數值返回。
fputs 函數用來把字符串輸出到文件中。fputs 函數的調用形式如下:
fputs( str, fp );
此處,fp 是文件指針;str 是待輸出的字符串,可以是字符串常量、指向字符串的指針或存放字符串的字符數組名等。用此函數進行輸出時,字符串中最後的 '\0' 並不輸出,也不自動加 '\n'。輸出成功函數值為正整數,否則為 -1(EOF)。
需要注意的是:調用函數輸出字符串時,文件中個字符串將首尾相接,它們之間將不存在任何間隔符。為了便於讀入,在輸出字符串時,應當注意人為地加入諸如 "\n" 這樣的字符串。
fread 函數和 fwrite 函數分別用來讀、寫二進制文件。它們的調用形式如下:
fread( buffer, size, count, fp );
fwrite( buffer, size, count, fp );
其中,buffer 是數據塊的指針,對 fread 來說,它是內存塊的首地址,輸入的數據存入此內存塊中;對於 fwrite 來說,它是准備輸出的數據塊的起始地址。size 表示每個數據塊的字節數。count 用來指定讀、寫一次,輸入或輸出數據塊的個數(每個數據塊具有 size 字節)。
例如有以下結構體:
struct st
{
char num[8];
float mk[5];
} pers[30];
假設 pers 數組每個元素包含有學生的學號和五門課的成績,並假設 pers 數組的30個元素中都已有值,文件指針 fp 所指文件已正確打開,則執行以下循環將把這30個元素中的數據輸出到 fp 所指文件中。
for( i = 0; i < 30; i++ )
{
fwrite( &pers[i], sizeof( struct st ), 1, fp );
}
以上 for 循環中,每執行一次 fwrite 函數調用,就從 &pers[i] 地址開始輸出由第三個參數指定的“1”個數據塊,每個數據塊含有 sizeof( struct st ) 個字節,也就是一次輸出一個結構體變量中的值。
也可以用以下步驟從上面建立的文件中再次將每個學生的數據逐個讀入到 pers 數組中。這時,文件必須為“讀”而打開。
i = 0;
fread( &pers[i], sizeof( struct st ), 1, fp );
while ( !feof( fp ) )
{
i++;
fread( &pers[i], sizeof( struct st ), 1, fp );
}