C語言之標準檔案操作

丶幻一發表於2018-03-22

主要介紹一下C語言檔案操作的api。

檔案指標與檔案開關

FILE * p;檔案指標,可以直接操作檔案中的內容。
fopen(dir,type);開啟一個檔案,返回檔案指標,指向檔案中的第一個位置。
fclose(p);關閉檔案
p = NULL;使用完,注意將檔案指標賦值為NULL,不讓其成為野指標。

int main(){
    FILE * p;
    p = fopen("d://a.txt","r");
    if(p == NULL){
        printf("檔案開啟失敗\n");
        exit(-1);
    }
    fclose(p);
    p = NULL;   
    return 0;
}

檔案開啟型別

檔案開啟型別有多種,最常用的幾種有
r,只讀的方式開啟一個文字檔案,不存在則開啟失敗
w,只寫的方式開啟一個檔案,不存在則建立
a,追加的方式開啟一個檔案,不存在則建立
r+,讀寫的方式,不存在則開啟失敗
w+,讀寫方式開啟或者新建一個檔案,允許讀寫。
a+,讀寫方式開啟文字檔案,在文字末尾追加資料,不存在則建立一個。
ab,追加的方式開啟一個二進位制檔案,不存在則開啟失敗。
rb,讀的方式開啟一個二進位制檔案,不存在則開啟失敗。
wb,寫的方式開啟一個二進位制檔案,不存在則建立。
上面有的多,但是事實上,卻很好記憶,你只要認識3個單詞,read,write,append即可

常用操作檔案的函式

fgetc(p) != EOF;讀取一個字元,這裡的EOF事實上就是常量-1

int main(){
    FILE * p;
    if((p = fopen("d://a.txt","r")) == NULL){
        printf("檔案開啟失敗\n");
    };
    char c[100];
    int i = 0;
    while((c[i] = fgetc(p)) != EOF){
        i++;
    }
    c[i] = '\0';
    printf("%s",c);
    fclose(p);
    p = NULL;
    return 0;
}

fputc(c,p);寫出一個字元,c為字元,p為檔案指標。

char s[] = "qwe";
int length = strlen(s);
int index = 0;
while(index < length){
    fputc(s[index ++],p);//p為檔案指標
}

ftell(p);獲取當前檔案的指標的位置
fseek(p,0L,SEEK_END);設定當前檔案指標的位置,這裡有三個引數,第一個引數是檔案指標,第二個引數是便宜量,第三個引數是,設定的位置
通常的,我們通過檔案指標來獲取到檔案的體積

int curIndex = ftell(p);
fseek(p,0L,SEEK_END);
int lastIndex = ftell(p);
int length = lastIndex - curIndex;
feek(p,curIndex,SEET_SET); //將檔案指標設定回原位置

fwrite(&node,sizeof(Node),1,p);
這裡4個引數,第一個引數,將存放哪個結構體,第二個引數是結構體的大小,第三個引數是準備存放幾個結構體,p是檔案指標。寫入成功返回1。
fread(&node,sizeof(Node),1,p);第一個引數是準備存放到哪個結構體,其他引數跟fwrite的意義是一樣的。這個函式讀取成功返回1。

typedef struct Student {
    int age;
    char * name;
    int c;
    int d;
}Student;

void writeTest() {
    Student s;
    s.age = 1;
    s.c = 1;
    s.d = 1;
    s.name = (char *)malloc(10);
    strcpy(s.name, "abcde");
    FILE * f;
    if ((f = fopen("D://a.dat", "wb")) == NULL) {
        printf("程式開啟失敗\n");
        exit(-1);
    }
    fwrite(&s, sizeof(s), 1, f);
    fwrite(s.name, 10, 1, f);
    fclose(f);
    f = NULL;   
    free(s.name);
}

void readTest() {
    Student s;
    FILE * p;
    if ((p = fopen("D://a.dat", "rb")) == NULL) {
        printf("程式開啟失敗\n");
        exit(-1);
    }
    fread(&s, sizeof(s), 1, p);
    s.name = (char *)malloc(10);
    fread(s.name, 10, 1, p);
    printf("%s", s.name);
    free(s.name);
    fclose(p);
    p = NULL;
}

fputs(str,f);//兩個引數,第一個引數是將要存的字串的指標,第二個引數是檔案指標,直接輸出str中的所有字串,輸出完成之後不會輸出換行符。注意這裡與puts的區別。

void fputsTest() {
    FILE * f;
    if ((f = fopen("d://a.txt", "w")) == NULL) {
        printf("檔案開啟失敗\n");
        exit(1);
    }
    const char * str = "hello word";
    const char * str2 = "abc";
    fputs(str, f);
    fputs(str2, f);
    fclose(f);
    f =`
NULL;
}

fgets(str,length + 1,f);這裡三個引數,第一個引數是存放到哪個字串,第二個引數是讀取幾個位元組,注意這裡要寫成讀取的位元組數+1,原因是最後加一個’\0’,第三個引數是檔案指標。同時應該注意到的一點是,漢子是佔2個位元組佔2個位元組。

void fgetsTest() {
    FILE * f;
    if ((f = fopen("d://a.txt","r")) == NULL) {
        puts("檔案開啟失敗");
        exit(1);
    }
    char s[200];
    fgets(s, 5,f);
    puts(s);
    fclose(f);
    f = NULL;
}

重點掌握,fgetc,fputc,fread,fwrite;4個函式

相關文章