fopen(開啟檔案)相關函數 open,fclose表標頭檔 #include<stdio.h>定義函數 FILE * fopen(const char * path,const char * mode);函數說明 參數path字串包含欲開啟的檔案路徑及檔案名稱,參數mode字串則代表著流形態。mode有下列幾種形態字串:r 開啟唯讀檔案,該檔案必須存在。r+ 開啟可讀寫的檔案,該檔案必須存在。w 開啟唯寫檔案,若檔案存在則檔案長度清為0,即該檔案內容會消失。若檔案不存在則建立該檔案。w+ 開啟可讀寫檔案,若檔案存在則檔案長度清為零,即該檔案內容會消失。若檔案不存在則建立該檔案。a 以附加的方式開啟唯寫檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾,即檔案原先的內容會被保留。a+ 以附加方式開啟可讀寫的檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾後,即檔案原先的內容會被保留。上述的形態字串都可以再加一個b字元,如rb、w+b或ab+等組合,加入b 字元用來告訴函數庫開啟的檔案為二進位檔案,而非純文字檔案。不過在POSIX系統,包含Linux都會忽略該字元。由fopen()所建立的新檔案會具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)許可權,此檔案許可權也會參考umask 值。傳回值 檔案順利開啟後,指向該流的檔案指標就會被返回。若果檔案開啟失敗則返回NULL,並把錯誤碼存在errno 中。附加說明 一般而言,開檔案後會作一些檔案讀取或寫入的動作,若開檔案失敗,接下來的讀寫動作也無法順利進行,所以在fopen()後請作錯誤判斷及處理。範例 #include<stdio.h>main(){FILE * fp;fp=fopen(“noexist”,”a+”);if(fp= =NULL) return;fclose(fp);}
fread和fwrite函數功能
用來讀寫一個資料區塊。
一般調用形式
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
說明
(1)buffer:是一個指標,對fread來說,它是讀入資料的存放地址。對fwrite來說,是要輸出資料的地址。
(2)size:要讀寫的位元組數;
(3)count:要進行讀寫多少個size位元組的資料項目;
(4)fp:檔案型指標。
注意:1 完成次寫操(fwrite())作後必須關閉流(fclose());
2 完成一次讀操作(fread())後,如果沒有關閉流(fclose()),則指標(FILE * fp)自動向後移動前一次讀寫的長度,不關閉流繼續下一次讀操作則接著上次的輸出繼續輸出;
3 fprintf() : 按格式輸入到流,其原型是int fprintf(FILE *stream, const char *format[, argument, ...]);其用法和printf()相同,不過不是寫到控制台,而是寫到流罷了。注意的是傳回值為此次操作寫入到檔案的位元組數。如int c = fprintf(fp, "%s %s %d %f", str1,str2, a, b) ;str1:10位元組;str2: 10位元組;a:2位元組;b:8位元組,c為33,因為寫入時不同的資料間自動加入一個空格。
檔案使用之後一定要關閉,否則將不能正確顯示內容.fwrite:讀入兩個學生資訊然後用fwrite存入檔案
fread:用fread從檔案中讀出學生資訊。
fwrite.c
#include <stdio.h>
#define SIZE 2
struct student_type
{
char name[10];
int num;
int age;
char addr[10];
}stud[SIZE];
void save()
{
FILE *fp;
int i;
if((fp=fopen("stu_list","wb"))==NULL)
{
printf("cant open the file");
exit(0);
}
for(i=0;i<SIZE;i++)
{
if(fwrite(&stud[i],sizeof(struct student_type),1,fp)!=1)
printf("file write error\n");
}
fclose(fp);
}
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();
}
for(i=0;i<SIZE;i++)
{
printf("%s,%d,%d",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);
}
}
fread.c
#include <stdio.h>
#define SIZE 2
struct student_type
{
char name[10];
int num;
int age;
char addr[10];
}stud[SIZE];
void read()
{
FILE *fp;
int i;
if((fp=fopen("stu_list","rb"))==NULL)
{
printf("cant open the file");
exit(0);
}
for(i=0;i<SIZE;i++)
{
if(fread(&stud[i],sizeof(struct student_type),1,fp)!=1)
printf("file write error\n");
}
fclose(fp);
}
main()
{
int i;
read();
for(i=0;i<SIZE;i++)
{
printf("%s,%d,%d,%s",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);
printf("\n");
}
}