1. 程式人生 > >C語言檔案大總結

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;
}

在這裡插入圖片描述