C語言新建文件,向文件中輸入內容并讀出文件內容

jopen 10年前發布 | 25K 次閱讀 C語言 C/C++開發
一、讀寫一個字符函數--函數fgetc()和fputc()
調用形式分別為: ch=fgetc(fp); fputc(ch,fp); fgetc()函數將fp指向的文件的一個字符讀到內存,賦給字符變量ch.如果遇文件結束符時,函數返回值為1. 
例:從鍵盤輸入一些字符逐個送入磁盤,直到#為止。再將此盤文件讀入內存,逐個顯示在光屏。
    # include <stdio.h>  

    int main( )  
    {  
        FILE *fp;  
        char ch,filename[10];  
        scanf("%s",filename); /*讀入磁盤文件名*/  
        if((fp=fopen(filename,"w"))==NULL) /*建立新文件 */  
        {  
            printf("cannot open file\n"); /*建立新文件出錯誤信息*/  
            exit(1); /*終止調用過程、關閉所有文件*/  
        }  
        ch=getchar( ); /*從鍵盤讀入一個字符*/  
        while(ch!='#') /*讀到#時停止輸入*/  
        {  
            fputc(ch,fp); /*將ch內字符寫入fp指向的文件*/  
            ch=getchar( );  
        }  
        fclose(fp); /*關閉fp所指向的文件*/  
        if((fp=fopen(filename,"r"))==NULL) /*將filename 以'r'方式打開*/  
        {  
            printf("cannot open file\n");  
            exit (1);  
        }  
        ch=fgetc(fp); /*從fp指向的文件讀一個字符給ch變量 */  
        while(ch!=EOF) /*讀到文件結束符EOF時結束 */  
        {  
            putchar(ch);  
            ch=fgetc(fp);  
        }  
        fclose(fp); /*關閉文件*/  
        return 0;  
    }  



二、讀寫數據塊函數--fread( )和fwrite( )函數
調用方式分別為:
(1) 、fread(buffer,size,count,fp); 該函數將fp指向的文件的數據以數據塊的形式讀入內存buffer
(2)、write(buffer,size,count,fp);該函數將內存buffer的內容以數據塊的形式寫入fp指向的文件。
 其中:buffer:是一個指針。對于fread來說 它是讀入數據的有效地址。對 fwrite來說,是要寫盤的數據地址(起始地址)。 size:要讀寫的字節數。count:要進行讀寫多少個size字節的 數據項。 fp:文件型指針 如果fread或fwrite調用成功,則函數返回值為count的值。 若文件以二進制形式打開,用fread和fwrite函數就可以讀寫任何類型的信息。如: fread(f,4,2,fp); f為實型數組名,4表示個實型變量占4個字節,2表示讀入2次,fp向的文件數據. 
例:從鍵盤輸入4個學生的有關數據,然后把它們轉存到磁盤文件上去。

    #include<stdio.h>  
    #define SIZE 4  

    struct student_type  
    {  
        char name[10];  
        int num;  
        int age;  
        char addr[15];  
    }stud[SIZE];  
    void save();/*保存輸入數據到文件的函數聲明*/  
    void output();/*輸入文件內容的函數聲明*/  

    /*在主函數main( )中的終端讀入4個學生的數據,然后調用save( )函數。*/  
    int main()  
    {  
        int i;  
        for(i=0;i<SIZE;i++)  
            scanf("%s%d%d%s",stud[i].name,&stud[i].num,&stud[i].age, stud[i].addr);  
        save();  
        printf("**********************************\n");  
        printf("這是剛才寫到文件里的內容\n");  
        output();  
        return 0;  
    }  
    /*save( )函數,將數據送到"stu_list"磁盤文件中去。*/  
    void save()  
    {  
        FILE *fp;  
        int i;  
        if((fp=fopen("stu_list","wb"))==NULL)  
        {  
            printf("cannot open file\n");  
            return;  
        }  
        /*函數sizeof 計算一個結構體student_type的變量長度29(10+2+2+15)字節*/  
        for(i=0;i<SIZE;i++)  
            if(fwrite(&stud[i],sizeof(struct student_type),1,fp)!=1)  
                printf("file write error\n");  
    }  
    void output()  
    {  
        int i;  
        FILE *fp;  
        fp=fopen("stu_list","rb");  
        for(i=0;i<SIZE;i++)  
        {  
            fread(&stud[i],sizeof(struct student_type),1,fp);  
            printf("%-10s%4d%4d %-15s\n",stud[i].name, stud[i].num,stud[i].age,stud[i].addr);  
        }  
    }  


三、格式化讀寫函數--fscanf( )函數和fprint( )函數
調用方式分別是: fscanf(文件指針,格式字符串,輸入表);
fscanf 函數將指針指向的文件內容,以格式符要求的形式,讀入內存指定地址內 fprintf(文件指針,格式字符串,輸出表);fprintf 函數是將內存指定地址內的內容,以格式符要求的形式,輸出到指針指向的文件
說明: 以上兩個函數與scanf( ) 和printf( )函數 只有一點不同:即前二者的讀寫對象是磁盤數據文件,即是文件指針指向的磁盤文件。 用fscanf( )和fprintf( )函數對磁盤文件 進行讀寫,使用方便,容易理解,但是,由于輸入是要將ASCII碼轉換為二進制形式,輸出時又要將二進制形式轉換成字符,花費時間較多。因此,在內存與磁盤頻繁交換數據的情況下,最好不用fscanf( )和fprintf( )函數,而用fread和fwrite函數。

例:編制一個程序,建立一個電話簿,包括姓名和電話號碼兩項內容,該程序有增加新姓名和電話號碼的功能,也可以根據姓名查詢已經存入電話簿的電話號碼。
程序在設計時將分別設計成三個函數:
1.菜單選項--menu( )
2.增加新電話號碼--add-num( )
3.查詢老電話號碼--lookup( )。

    #include "stdio.h"   
    void add_num( ),lookup( );  
    main( )  
    { char choice;  
    do{choice=menu( );   
    switch(choice)  
    { case 'A':add_num( ); break;  
    case 'L':lookup( ); break; }  
    }while(choice!='Q');  
    }  
    menu( )  
    { char ch;  
    do{   
    printf("(A)dd,(L)ookup or (Q)uit:");   
    ch=tolower(getche( ));  
    printf("\n"); }  
    while(ch!='Q'&&ch!='A'&&ch!='L');  
    return ch;  
    }  
    void add_num( )  
    { FILE * fp;  
    char name[80];  
    int a_code,exchg,num;  
    if((fp=fopen("phone","a"))==NULL)  
    { printf("cannot open directory file\n"); exit(1); }  
    printf("enter name and number:");  
    fscanf(stdin,"%s%d%d%d",name,&a_code,&exchg,&num);  
    fscanf(stdin,"%*c");   
    fprintf(fp,"%s %d %d %d n",name,a_code,exchg,num);  
    fclose(fp);  
    }  
    void lookup( )  
    { FILE *fp;  
    char name[80],name2[80];  
    int a_code,exchg,num;  
    if((fp=fopen("phone","r"))==NULL)   
    { printf("cannot open directory file\n"); exit(1); }  
    printf("name?");  
    gets(name);  
    while(!feof(fp))   
    {fscanf(fp,"%s%d%d%d",name2,&a_code,&exchg,&num);  
    if(!strcmp(name,name2))   
    {printf("%s: (%d)%d-%d\n",name,a_code,exchg,num); break; }  
    }  
    fclose(fp);  
    }  
    請運行程序,可以得到如下結果:  
    (A)dd,(L)ookup or (Q)uit:A Enter name and number: Liming 6789 1234 135  
    (A)dd,(L)ookup or (Q)uit:A Enter name and number: Lihung 5678 235 357  
    (A)dd,(L)ookup or (Q)uit:L name?Liming Liming:(6789)1234-135   
    (A)dd,(L)ookup or (Q)uit:Q  
    四、讀入整型量函數--- getw( )函數和putw( )函數
    調用方式如下例:
    i=getw(fp);     它的作用是從磁盤文件讀一個整數到內存,賦給整型變量i。
    putw(10,fp);    它的作用是將整數10輸出到fp指向的文件。
    五、讀寫字符串函數-- fgets( )函數和fputs( )函數
    調用方式分別為:
    fgets(字符數組,n,fp);
    fgets( )函數的作用是將fp指向的文件中(n-1)個字符讀入字符數組,并且加結束符“\0”,若在(n-1) 個字符前遇到EOF或換行符,均結束讀入。
    fputs(字符數組,fp);
    fputs( )函數的作用是向指定的文件輸出一個字符串。如:fputs(“china”,fp);
    說明:fgets( )和fputs( )函數與gets( )和puts( )函數的不同之處也在于:前二者的讀寫對象為指定的文件。
     六、用戶自定義讀寫函數
    如果用戶對于讀寫盤文件還有特殊的要求,或者是在某些C編譯的庫函數中,不包括前面所介紹的那些讀寫函數,用戶也可以自己定義函數。
    比如:定義getw函數
        getw(fp)  
        {FILE *fp;  
        char *s; int i;  
        s=&i;  
        s[0]=getc(fp); s[1]=getc(fp);  
        return(i);  
        }  

    定義putw函數
        putw(i,fp)  
        {int i;  
        FILE *fp;  
        {char *s;  
        s=&i;  
        putc(s[0],fp);putc(s[1],fp);  
        return(i);  
        }  

      七、常見的文件讀、寫錯誤
      1. 使用文件時忘記打開文件。用后又忘記關閉文件,造成文件的數據丟失。
      2. 混淆文件指針與文件讀/寫的位置指針的概念。
      3. 不明確當前位置指針的位置,造成讀/寫錯誤。
      4. 不能使文件正確定位。
      5. 文件的打開與使用方式不匹配。
      例如,對文件以只讀方式打開,卻對文件進行讀寫,請看程序:
          if((fp=fopen(“test”,“r”))==NULL)  
          {printf(“cannot open this file\n”);  
          exit(1);  
          }  
          ch=fget(fp);  
          while(ch!=‘#’)  
          {ch=ch+4;  
          fputc(ch,fp);  
          ch=fget(fp);  
          }  

        以上程序段的“r”應改作“r+”。
         本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
         轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
         本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!