C語言檔案大總結
1.檔案開啟
r 開啟文字檔案,只讀,該檔案必須存在
r+ 開啟文字檔案,可讀寫,該檔案必須存在。
w 開啟文字檔案,只寫,若檔案存在則檔案長度清為0,即該檔案內容會消失。若檔案不存在則建立該檔案。
w+ 開啟文字檔案,可讀寫,若檔案存在則檔案長度清為零,即該檔案內容會消失。若檔案不存在則建立該檔案。
a 以附加的方式開啟只寫檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾,即檔案原先的內容會被保留。
a+ 以附加方式開啟可讀寫的檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾後,即檔案原先的內容會被保留。
rb開啟二進位制檔案,只讀,該檔案必須存在
wb開啟二進位制檔案,只寫,若檔案不存在則建立該檔案。
總結:不帶b的是對文字檔案(如.txt)的操作,帶b的是對二進位制檔案(如.dat)進行操作,而我們最常用的是文字檔案,開啟後從頭寫則不加a,接著寫則加a,帶+的表示既可讀又可寫,r開啟沒有的話就出錯,w開啟沒有的話自己會建立一個檔案
FILE *fp;
if((fp=fopen("1.txt","r"))==NULL)
{
printf("cannot open this file\n");
exit();
}
簡潔寫的話:
例1:FILE *fp=fopen("1.txt","r");
///注意路徑,轉義字元
例2:FILE *fp = fopen("D:\\demo.txt" ,"rb");
例3:FILE *fp=fopen("F:\\Users\\My_2\\Desktop\\C\\程式碼備份\\揹包問題.txt","r");
程式末尾記得關閉檔案
fclose(fp);
2.讀入
從檔案裡讀出字元
fgetc(fp):從檔案(磁碟)中讀出
fgetc(ch,fp);將字元寫入到檔案(磁碟)中
從檔案裡讀出字串
fgets(str,n,fp)
fputs(str,fp)
fgets最多讀取n-1個字元,且一行行讀,結束標誌可以是讀了n-1個字元,也可以是讀到了換行符‘\n’,所以,平時用fgets都是為了讀一行故把n設大大的既可
例:
FILE * fp;
fp=fopen("1.txt","r");
while(fgets(b,100,fp)!=NULL)
{
printf("%s",b);
strcat(c,b);
}
fclose(fp);
fscanf(fp,"%s",str)
printf(fp,"%s",str)
FILE *fp;
if(fp=fopen("1.txt","r"))
while(fscanf(fp,"%s",b)!=EOF)
{
printf("%s",b);
printf("\n");
}
fclose(fp);
fgets與fscanf區別在於前者一行行讀,不管有沒有讀完那麼第二次進入下一行,後者碰到空格就會停下,第二個fscanf會從空格後開始讀,所以在讀字串時候,如果要求是一行算一個字串,那麼用fgets,如果要求以空行為分隔符,如單詞則用fscanf;還有要注意的是fgets結束標誌是NULL,fscanf結束標誌是EOF
讀結構體資料
fread(buffer, size, count, fp);
從fp所指檔案中將count個,每個所佔位元組數為size的資料賦給buffer,buffer是一個地址
經常應用是將檔案中結構體資料使用fread賦給buffer,也就是說fgets用於字串,fread用於其他型別,當然,fscanf通用的
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fp;
char c[] = "This is runoob";
char buffer[20];
/* 開啟檔案用於讀寫 */
fp = fopen("file.txt", "w+");
/* 寫入資料到檔案 */
fwrite(c, strlen(c) + 1, 1, fp);
/* 查詢檔案的開頭 */
fseek(fp, 0, SEEK_SET);
/* 讀取並顯示資料 */
fread(buffer, strlen(c)+1, 1, fp);
printf("%s\n", buffer);
fclose(fp);
return(0);
}
以上幾種讀取稱為順序讀取,意思是從頭開始讀,但是,有時我們需要檔案中中間位置資料,此時如果還順序讀取,那效率可就要了親命了啊!
fseek函式作用是移動檔案指標,就是把檔案指標移動到你想要讀資料位置,然後再利用fread等讀資料
fseek函式樣式:fseek(fp, long offset, fromwhere);
offset:偏移量,是long型資料,故加個L
fromwhere:起始位置,0表示檔案開始,1表示檔案當前位置,2表示檔案末尾
範例一:fseek(fp, 0L, 2);
解釋:檔案指標定位到檔案末尾,偏移0個位元組
範例二: fseek(fp,50L,0);或fseek(fp,50L,0);
解釋:其作用是將位置指標移到離檔案頭50個位元組處。
#include <stdio.h>
#include <stdlib.h>//fseek函式呼叫
int main()
{
FILE * fp = fopen("a.txt", "r+");
if (fp == NULL) {
printf("file error\n");
exit(1);
}
fseek(fp, 2, SEEK_SET);//游標移到檔案開始起第二個位元組處。
fwrite("yun", 1, 3, fp); //檔案內寫入內容yun
fclose(fp);
return 0;
}