C語言新建文件,向文件中輸入內容并讀出文件內容
一、讀寫一個字符函數--函數fgetc()和fputc()
調用形式分別為: ch=fgetc(fp); fputc(ch,fp); fgetc()函數將fp指向的文件的一個字符讀到內存,賦給字符變量ch.如果遇文件結束符時,函數返回值為1.
例:從鍵盤輸入一些字符逐個送入磁盤,直到#為止。再將此盤文件讀入內存,逐個顯示在光屏。
例:從鍵盤輸入一些字符逐個送入磁盤,直到#為止。再將此盤文件讀入內存,逐個顯示在光屏。
二、讀寫數據塊函數--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個學生的有關數據,然后把它們轉存到磁盤文件上去。
例:從鍵盤輸入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 函數是將內存指定地址內的內容,以格式符要求的形式,輸出到指針指向的文件
fscanf 函數將指針指向的文件內容,以格式符要求的形式,讀入內存指定地址內 fprintf(文件指針,格式字符串,輸出表);fprintf 函數是將內存指定地址內的內容,以格式符要求的形式,輸出到指針指向的文件
說明: 以上兩個函數與scanf( ) 和printf( )函數 只有一點不同:即前二者的讀寫對象是磁盤數據文件,即是文件指針指向的磁盤文件。 用fscanf( )和fprintf( )函數對磁盤文件 進行讀寫,使用方便,容易理解,但是,由于輸入是要將ASCII碼轉換為二進制形式,輸出時又要將二進制形式轉換成字符,花費時間較多。因此,在內存與磁盤頻繁交換數據的情況下,最好不用fscanf( )和fprintf( )函數,而用fread和fwrite函數。
例:編制一個程序,建立一個電話簿,包括姓名和電話號碼兩項內容,該程序有增加新姓名和電話號碼的功能,也可以根據姓名查詢已經存入電話簿的電話號碼。
程序在設計時將分別設計成三個函數:
1.菜單選項--menu( )
2.增加新電話號碼--add-num( )
3.查詢老電話號碼--lookup( )。
2.增加新電話號碼--add-num( )
3.查詢老電話號碼--lookup( )。
四、讀入整型量函數--- getw( )函數和putw( )函數
調用方式如下例:
i=getw(fp); 它的作用是從磁盤文件讀一個整數到內存,賦給整型變量i。
putw(10,fp); 它的作用是將整數10輸出到fp指向的文件。
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(字符數組,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函數
七、常見的文件讀、寫錯誤
1. 使用文件時忘記打開文件。用后又忘記關閉文件,造成文件的數據丟失。
2. 混淆文件指針與文件讀/寫的位置指針的概念。
3. 不明確當前位置指針的位置,造成讀/寫錯誤。
4. 不能使文件正確定位。
5. 文件的打開與使用方式不匹配。
例如,對文件以只讀方式打開,卻對文件進行讀寫,請看程序:
2. 混淆文件指針與文件讀/寫的位置指針的概念。
3. 不明確當前位置指針的位置,造成讀/寫錯誤。
4. 不能使文件正確定位。
5. 文件的打開與使用方式不匹配。
例如,對文件以只讀方式打開,卻對文件進行讀寫,請看程序:
以上程序段的“r”應改作“r+”。
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!