C語言檔案讀寫命令

來源:互聯網
上載者:User

C語言把磁碟檔案看成是字元(或位元組)的序列,按照儲存資訊的形式來說,檔案主要是有文字檔和二進位檔案。文字檔由一個個字元組成,每個位元組存放一個ASCII碼制,代表一個字元。二進位檔案把記憶體中的資料按其在記憶體中的儲存形式原樣放入磁碟空間。

二進位檔案以及文字檔都可以看做是“資料流”。

流檔案的特點是,處理時不需考慮檔案中的資料的性質、類型和存放格式。訪問時只是以位元組為單位對資料進行存取,沒有記錄的概念,而將對資料結構的分析、處理等工作都交給後續程式區處理。系統會自動為這在使用的每個檔案開闢一個緩衝區,從記憶體向磁碟輸出資料必須先送到記憶體中的緩衝區,裝滿緩衝後才一起送到磁碟。

 

一、檔案的開啟與關閉

   檔案在進行讀寫操作之前要先開啟,使用完畢要關閉。所謂開啟檔案,實際上是建立檔案的各種有關資訊,並使檔案指標指向該檔案,以便進行其它操作。關閉檔案則斷開指標與檔案之間的聯絡,也就禁止再對該檔案進行操作。

fopen函數用來開啟一個檔案,其調用的一般形式為:
檔案指標名=fopen(檔案名稱,使用檔案方式);
其中:
“檔案指標名”必須是被說明為FILE 類型的指標變數;
“檔案名稱”是被開啟檔案的檔案名稱;
“使用檔案方式”是指檔案的類型和操作要求。
“檔案名稱”是字串常量或字串數組。

使用檔案的方式共有12種,下面給出了它們的符號和意義。
“r”
唯讀開啟一個文字檔,只允許讀資料
“w”
唯寫開啟或建立一個文字檔,只允許寫資料
“a”
追加開啟一個文字檔,並在檔案末尾寫資料
“rb”
唯讀開啟一個二進位檔案,只允許讀資料
“wb”
唯寫開啟或建立一個二進位檔案,只允許寫資料
“ab”
追加開啟一個二進位檔案,並在檔案末尾寫資料
“r+”
讀寫開啟一個文字檔,允許讀和寫
“w+”
讀寫開啟或建立一個文字檔,允許讀寫
“a+”
讀寫開啟一個文字檔,允許讀,或在檔案末追加資料
“rb+”
讀寫開啟一個二進位檔案,允許讀和寫
“wb+”
讀寫開啟或建立一個二進位檔案,允許讀和寫
“ab+”
讀寫開啟一個二進位檔案,允許讀,或在檔案末追加資料

對於檔案使用方式有以下幾點說明:
1) 檔案使用方式由r,w,a,t,b,+六個字元拼成,各字元的含義是:
r(read): 讀
w(write): 寫
a(append): 追加
t(text): 文字檔,可省略不寫
b(banary): 二進位檔案
+: 讀和寫
2) 凡用“r”開啟一個檔案時,該檔案必須已經存在,且只能從該檔案讀出。
3) 用“w”開啟的檔案只能向該檔案寫入。若開啟的檔案不存在,則以指定的檔案名稱建立該檔案,若開啟的檔案已經存在,則將該檔案刪去,重建一個新檔案。
4) 若要向一個已存在的檔案追加新的資訊,只能用“a”方式開啟檔案。但此時該檔案必須是存在的,否則將會出錯。
5) 在開啟一個檔案時,如果出錯,fopen將返回一個null 指標值NULL。在程式中可以用這一資訊來判別是否完成開啟檔案的工作,並作相應的處理。

二、檔案的讀寫
對檔案的讀和寫是最常用的檔案操作。在C語言中提供了多種檔案讀寫的函數:
·字元讀寫函數 :fgetc和fputc
·字串讀寫函數:fgets和fputs
·資料區塊讀寫函數:freed和fwrite
·格式化讀寫函數:fscanf和fprinf
下面分別予以介紹。使用以上函數都要求包含標頭檔stdio.h。

(1)字元讀寫函數 :fgetc和fputc

·fgetc函數的功能是從指定的檔案中讀一個字元,函數調用的形式為:
    字元變數=fgetc(檔案指標);
    對於fgetc函數的使用有以下幾點說明:
    1) 在fgetc函數調用中,讀取的檔案必須是以讀或讀寫方式開啟的。
    2) 讀取字元的結果也可以不向字元變數賦值, 例如: fgetc(fp); 但是讀出的字元不能儲存。
    3) 在檔案內部有一個位置指標。用來指向檔案的當前讀寫位元組。在檔案開啟時,該指標總是指向檔案的第一個位元組。使用fgetc 函數後,該位置指標將向後移動一個位元組。因此可連續多次使用fgetc函數,讀取多個字元。應注意檔案指標和檔案內部的位置指標不是一回事。檔案指標是指向整個檔案的,須在程式中定義說明,只要不重新賦值,檔案指標的值是不變的。檔案內部的位置指標用以指示檔案內部的當前讀寫位置,每讀寫一次,該指標均向後移動,它不需在程式中定義說明,而是由系統自動化佈建的。

·fputc函數的功能為向指定的檔案中寫入一個字元,函數調用的形式為:
    fputc(字元量,檔案指量或變數),
    例如:
    fputc('a',fp);
    其意putc函數的使用也要說明幾點:
    1) 被寫入的檔案可以用寫、讀寫、追加方式開啟,用寫或讀寫方式寫入字元從檔案首開始。如需保留原有檔案內容,希望寫入的字元被寫入的檔案若不存在,則建立該檔案。
    2) 每寫入一個字元,檔案內部位置指標向後移動一個位元組。
    3) fputc函數有一個傳回值,如寫入成功則返回寫入的字元,否則返回一個EOF。可用此來判斷寫符,寫入一個檔案,再把該檔案內容讀出顯示在螢幕上。

【樣本程式】
#include <stdio.h>
#include <stdlib.h>
#define MAXLEN 1024
main()
{
    FILE *fpr = fopen("1.txt","r");
    FILE *fpw = fopen("2.txt","a+");
    char *arrayCh = NULL;
    char ch;
    if(NULL == fpr){
        printf("1.txt open failed!\n");
        exit(1);
    }
    if(NULL == fpw){
        printf("2.txt open failed!\n");
        exit(1);
    }
    printf("Both file open successd!\n");
    while((ch = fgetc(fpr)) != EOF){
        fputc(ch,fpw);
    }
    while((ch = fgetc(fpw)) != EOF){
        printf("%c",ch);
    }
    fclose(fpw);
    fclose(fpr);
    exit(0);
}

(2) 字串讀寫函數:fgets和fputs

·fgets函數的功能是從指定的檔案中讀一個字串到字元數組中,函數調用的形式為:
    fgets(字元數組名,n,檔案指標);
    其中的n是一個正整數。表示從檔案中讀出的字串不超過 n-1個字元。在讀入的最後一個字元後加上串結束標誌'\0'。
    例如:fgets(str,n,fp);的意義是從fp所指的檔案中讀出n-1個字元送入字元數組str中。
    對fgets函數有兩點說明:
  1). 在讀出n-1個字元之前,如遇到了分行符號或EOF,則讀出結束。
  2). fgets函數也有傳回值,其傳回值是字元數組的首地址。

·fputs函數的功能是向指定的檔案寫入一個字串,其調用形式為:
    fputs(字串,檔案指標) 其中字串可以是字串常量,也可以是字元數組名 或 指標變數,
    例如:
    fputs(“abcd“,fp);其意義是把字串“abcd”寫入fp所指的檔案之中。

【程式樣本】
#include<stdio.h>
#include<stdlib.h>
main()
{
    char str[11];
    FILE *fpr = fopen("1.txt","r");  
    FILE *fpw = fopen("2.txt","a+");
    if(NULL == fpr){
        printf("1.txt open failed!\n");
        exit(1);
    }
    if(NULL == fpw){
        printf("2.txt open failed!\n");
        exit(1);
    }
    printf("file open successed!\n");
    fgets(str,11,fpr);
    printf("%s\n",str);
    fputs(str,fpw);
    fclose(fpr);
    fclose(fpw);
    exit(0);
}

(3)資料區塊讀寫函數:fread和fwrite

C語言還提供了用於整塊資料的讀寫函數。 可用來讀寫一組資料,如一個數組元素,一個結構變數的值等。

·讀資料區塊函數fread調用的一般形式為: fread(buffer,size,count,fp);

·寫資料區塊函數fwrite調用的一般形式為: fwrite(buffer,size,count,fp);

    其中buffer是一個指標,在fread函數中,它表示存放輸入資料的首地址。在fwrite函數中,它表示存放輸出資料的首地址。 size 表示資料區塊的位元組數。count 表示要讀寫的資料區塊塊數。fp 表示檔案指標。

【程式樣本】
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 2
struct stu{
    char name[20];
    int age;
    char addr[20];
}boy[MAXSIZE];
main()
{
    FILE *fp = fopen("2.txt","w+");
    struct stu rboy[MAXSIZE];
    int i;
    int temp = 0;
    if(NULL == fp){
        printf("2.txt open failed!\n");
        exit(1);
    }
    printf("File open successed!\n");
    printf("input data: ");
    for(i = 0;i < MAXSIZE;i++){
        scanf("%s%d%s",boy[i].name,&boy[i].age,boy[i].addr);
    }
    for(i = 0;i < MAXSIZE;i++){
        printf("%s  %d  %s\n",boy[i].name,boy[i].age,boy[i].addr);
    }
    fwrite(boy,sizeof(struct stu),MAXSIZE,fp);
    rewind(fp);
    fread(rboy,sizeof(struct stu),MAXSIZE,fp);
    for(i = 0;i < MAXSIZE;i++){
        printf("name:%s  age:%d  addr:%s\n",rboy[i].name,rboy[i].age,rboy[i].addr);
    }
    fclose(fp);
    exit(0);
}

(4)格式化讀寫函數:fscanf和fprinf

fscanf函數,fprintf函數與scanf和printf 函數的功能相似,都是格式化讀寫函數。 兩者的區別在於 fscanf 函數和fprintf函數的讀寫對象不是鍵盤和顯示器,而是磁碟檔案。

這兩個函數的調用格式為: 

·fscanf(檔案指標,格式字串,輸入表列);

·fprintf(檔案指標,格式字串,輸出表列);

例如:
  fscanf(fp,"%d%s",&i,s);
  fprintf(fp,"%d%c",j,ch);

【樣本程式】
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 2
struct stu{
    char name[20];
    int age;
    char addr[20];
}boy[MAXSIZE];
main()
{  
    FILE *fp = fopen("2.txt","w+");
    struct stu rboy[MAXSIZE];
    int i;
    if(NULL == fp){
        printf("2.txt open failed!\n");
        exit(1);
    }
    printf("enter data:\n");
    for(i = 0;i < MAXSIZE;i++){
        scanf("%s%d%s",boy[i].name,&boy[i].age,boy[i].addr);
    }
    for(i = 0;i < MAXSIZE;i++){
        fprintf(fp,"%s %d %s\n",boy[i].name,boy[i].age,boy[i].addr);
    }
    for(i = i;i < MAXSIZE;i++){
        fscanf(fp,"%s%d%s",rboy[i].name,&rboy[i].age,rboy[i].addr);
    }
    fclose(fp);
    exit(0);
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.