?作者:末央&
?系列:C語言初階(適合小白入門)
?說明:以凡人之筆墨,書寫未來之大夢
目錄
- 前言
- 字符輸入輸出函數 - fgetc和fputc
- 文本行輸入輸出函數 - fgets和fputs
- 格式化輸入輸出函數 - fscanf和fprintf
前言
對文件數據的讀寫可以分為順序讀寫和隨機讀寫。順序讀寫,即挨著順序對文件中的數據進行輸入或輸出。
在這片博客中,我們首先介紹文件的順序讀寫需要用到的文件操作函數。
字符輸入輸出函數 - fgetc和fputc
一、fputc函數
int fputc( int c, FILE *stream );
fputc函數的第一個參數是待輸出的字符,第二個參數該字符輸出的位置,即fputc函數的功能是將一個字符輸出到指定的位置。該函數調用完畢會返回用戶傳入的字符。
例如,我們要將小寫字母a~z寫入到data.txt文件中。
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{//打開文件FILE* pf = fopen("data.txt", "w");if (pf == NULL){printf("%s\n", strerror(errno));return 1;//文件打開失敗,失敗返回}//對文件進行輸出字符操作char i = 0;for (i = 'a'; i <= 'z'; i++){fputc(i, pf);}//關閉文件fclose(pf);pf = NULL;return 0;
}
二、fgetc函數
int fgetc( FILE *stream );
fgetc函數只有一個參數,即你要讀取的文件的文件指針。fgets函數的功能就是從指定位置讀取一個字符。該函數調用成功會返回讀取到的的字符;若讀取文件時發生錯誤,或是已經讀取到文件末尾,則返回EOF。
例如,我們要將文件data.txt文件中的內容全部讀取,并打印到屏幕上。
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{//打開文件FILE* pf = fopen("data.txt", "r");if (pf == NULL){printf("%s\n", strerror(errno));return 1;//文件打開失敗,失敗返回}//對文件進行輸入字符操作int ch = 0;while ((ch = fgetc(pf))!= EOF){printf("%c", ch);}//關閉文件fclose(pf);pf = NULL;return 0;
}
文本行輸入輸出函數 - fgets和fputs
一、fputs函數
int fputs( const char *string, FILE *stream );
fputs函數的第一個參數是待輸出的字符串,第二個參數該字符串輸出的位置,即fputs函數的功能是將一個字符串輸出到指定的位置(有沒有發現fputs函數的參數設計和fputc函數參數的設計非常類似)。該函數調用成功會返回一個非負值;若輸出時發生錯誤,則返回EOF。
例如,我們要將字符串"hello world!"寫入到data.txt文件中。
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{//打開文件FILE* pf = fopen("data.txt", "w");if (pf == NULL){printf("%s\n", strerror(errno));return 1;//文件打開失敗,失敗返回}//對文件進行輸出字符串操作char arr[] = "hello world!";fputs(arr, pf);//關閉文件fclose(pf);pf = NULL;return 0;
}
二、fgets函數
char *fgets( char *string, int n, FILE *stream );
fgets函數的第三個參數是你要讀取的文件的文件指針,第二個參數是你要讀取的字符個數(也可以說是字節個數),第一個參數是你所讀取到的數據的儲存位置。fgets函數的功能就是從指定位置讀取指定字符個數的數據儲存到指定位置。該函數調用成功會返回用于儲存數據的位置的地址,如果讀取過程中發生錯誤,或是讀取到了文件末尾,則返回一個空指針(NULL)。
例如,我們要從data.txt文件中提取數據。
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{//打開文件FILE* pf = fopen("data.txt", "r");if (pf == NULL){printf("%s\n", strerror(errno));return 1;//文件打開失敗,失敗返回}//對文件進行輸入字符串操作char arr[10] = { 0 };fgets(arr, 6, pf);printf("%s\n", arr);//關閉文件fclose(pf);pf = NULL;return 0;
}
fgets函數讀取字符的過程中會出現兩種情況:
- 在fgets函數讀取到指定字符數之前,若讀取到換行符(’\n’),則停止讀取,讀取帶回的字符包含換行符。
- 直到fgets函數讀取到第n-1個字符時都沒有遇到換行符(’\n’),則返回讀取到的n-1個字符,并在末尾加上一個空字符(一般是\0)一同返回(共n個字符)。
格式化輸入輸出函數 - fscanf和fprintf
一、fprintf函數
int fprintf( FILE *stream, const char *format [, argument ]...);
fprintf函數的第一個參數是數據輸出的目的地,后面的參數博友們可能看不太懂,但是我們可以看看庫函數printf函數的函數聲明:
int printf( const char *format [, argument]... );
//printf函數的聲明
我們發現fprintf函數除了第一個參數以外,其它參數都與printf函數的參數一樣,雖然我們不知道fprintf函數后面的參數代表的意思,但是我們會用printf函數啊,所以我們使用fprintf函數傳參時可以模仿者printf的傳參形式。
例如我們要將一個結構體類型的變量信息輸出到data.txt文件中去
#include <stdio.h>
#include <string.h>
#include <errno.h>
struct S
{char name[20];char sex[5];int age;
};
int main()
{//打開文件FILE* pf = fopen("data.txt", "w");if (pf == NULL){printf("%s\n", strerror(errno));return 1;//文件打開失敗,失敗返回}//對文件進行格式化輸出操作struct S s = { "zhangsan", "nan", 20 };fprintf(pf, "%s %s %d\n", s.name, s.sex, s.age);//關閉文件fclose(pf);pf = NULL;return 0;
}
其實,fprintf函數的功能就是將“區域三”的數據,以“區域二”的格式輸出到“區域一”
二、fscanf函數
int fscanf( FILE *stream, const char *format [, argument ]... );
fscanf函數的第一個參數是讀取數據的位置,后面的參數我們也可以類比scanf函數的參數:
int scanf( const char *format [,argument]... );
我們可以看到fscanf函數的參數也是,除了第一個參數以外,其他參數就是scanf函數的參數,于是我們可以試著嘗試使用。
例如,我們要將剛才用fprintf函數輸出到data.txt文件中的數據讀取出來。
#include <stdio.h>
#include <string.h>
#include <errno.h>
struct S
{char name[20];char sex[5];int age;
};
int main()
{//打開文件FILE* pf = fopen("data.txt", "r");if (pf == NULL){printf("%s\n", strerror(errno));return 1;//文件打開失敗,失敗返回}//對文件進行格式化輸入操作struct S tmp = { 0 };fscanf(pf, "%s %s %d", tmp.name, tmp.sex, &(tmp.age));printf("%s %s %d\n", tmp.name, tmp.sex, tmp.age);//將tmp中的內容打印出來,看是否讀取成功//關閉文件fclose(pf);pf = NULL;return 0;
}
其實,fscanf函數的功能就是將“區域一”的數據,以“區域二”的格式輸入到“區域三”。