C語言之標準檔案操作
主要介紹一下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個函式