檔案操作,及檔案操作時的許可權設定,快速實現檔案拷貝,C語言常用IO函式
定義一個檔案型別指標。用於儲存開啟檔案後的指標。
C語言中可以用 gets(char *str) 來輸入一行(包括空格)。
FILE *p = fopen("檔名",“開啟的許可權”);
其中許可權可以是w ,此時如果檔案不存在會自動建立,如果存在就會自動覆蓋(內容);
許可權也可以 r ,可以對檔案中的內容進行讀取。為r時檔案必須存在,不存在開啟則會失敗,返回NULL。
r+ ,對檔案可讀寫,但是隻要有r,檔案就必須存在。
rb+ , 不加b按文字檔案的方式來讀檔案,
加b按二進位制的方式來讀檔案,windows系統中,文字模式下,檔案以 "\r\n"結尾 ,如果用fputs將“\n”寫入檔案時,會自動在前面加個\r變成 “\r\n” ,而linux等unix系統下,是否加b不影響,即沒有區別。
w+ ,開啟可讀寫檔案,若檔案存在則檔案長度清0,即該檔案內容會消失。若檔案不存在則建立該檔案。
a+
許可權 a ,以追加方式新增文字。如果檔案不存在那麼就建立這個檔案,如果檔案存在就在檔案結尾處開始追加。
feof( FILE *p),判斷是否到了檔案尾。
fputs(*str, FILE); 將字串寫入檔案中。
fgets(char * str , sizeof(str), p) ; 讀取 str大小的內容到字串中。
從檔案指標中讀取一個字元
ch = getc(p) ;
讀出檔案中所有內容
while( (ch = getc(p)) != EOF)
{
printf("%c",ch);
}
將一個字元寫入檔案
putc(ch ,p) ;
開啟檔案後要用 fclose(p) ,關閉檔案指標。
feof(p) ; 判斷是否已經到了檔案結尾。如果到了,則返回真。
要讀取檔案中所有內容
while( !feof(p))
{
memset(s,0,sizeof(s));
fgets(s,sizeof(s),p);
}
檔案內容複製:
FILE * p1 = fopen("D:\\a.txt","r");
FILE * p2 = fopen("D:\\cp.txt","w");
char buf[1024] ;
while(!feof(p1))
{
memset(buf,0,sizeof(buf));
fgets(buf,sizeof(buf),p1);
fputs(buf,p2);
}
fclose(p1);
fclose(p2);
普通檔案加密:
在每次從檔案從讀出一行到buf後,呼叫加密函式。
code(char * str)
{
while(*str)
{
(*s)++ ;
s++;
}
}
二進位制檔案加密:
code函式中要加入一個length,因為可能傳入的引數可能不是一個字串
scanf printf
sscanf sprintf
fscanf fprintf // fscanf 與scanf用法基本一致,fscanf是從一個檔案讀取輸入。
fscanf(FILE * p, "%s",buf) ; 可以以解析檔案中固定格式的字元。
fscanf(FILE * p ,"%d + %d",&a,&b); 即能將檔案中 a1 + b1 中a1和b1的值存入a,b。
fprintf(FILE *p ,"%s",buf) ; 將buf中的字元全部輸出到檔案中。(即寫入到檔案)
getc putc //只能對文字檔案進行操作。
圖片,視訊以及word檔案都是二進位制檔案。
要操作二進位制檔案。可以使用 fread 和 fwrite,如果使用它們,而開啟的時候不加b ,則導致讀出的檔案大小缺失。(windows下必須要寫,linux下則可寫可不寫);
fread(buf, sizeof(char), ARTsize , p)
fread(buf, sizeof(char), sizeof(buf)-1,p) //按照位元組數進行讀寫。如果第三個引數不減1,列印buf的時候將出現亂碼,原因時\r\n為換行符。 如果buf的大小大於檔案中有的大小,則拷貝二進位制檔案時會出錯(因為新的檔案的大小為buf大小大於原二進位制檔案的大小)
解決辦法:
size_t res = fread(buf, sizeof(char), sizeof(buf), p1); //返回讀出的位元組數。
fwrite(buf, sizeof(char), res , p2 ) ; // 返回多少位元組就寫進去多少位元組
stat函式。 在 <sys/stat.h>標頭檔案中。結構體型別 stat 裡可以儲存檔案的各種資訊。
使用方式:
struct stat st ={0} ; 定義一個結構
stat("D:\\a.txt",&st); //呼叫完stat函式後,檔案的屬性就儲存在了 st結構體中。
例如現在就可以打印出a.txt檔案的大小。
printf("%d",st.st_size) ;
這樣當一個要拷貝的檔案特別大時,為了提高拷貝速率,可以在堆記憶體中生氣一個記憶體空間來拷貝。
char * array = malloc(st.st_size) ;
FILE * p = fopen("D:\\b.txt","rb");
fread(array, sizeof(char), st.st_size, p); 相當於將檔案內容一次性讀到堆空間中
fclose(p) ;
然後再呼叫fwrite將 array寫入另一個檔案即完成拷貝。
還可以將結構體寫入檔案,或者將檔案中的內容寫入結構體。
對一系列字串(裡面存的數字)進行排序並輸出:
int array[512] = {0};
while(!feof(p))
{
char buf[100] = {0};
fgets(buf,sizeof(buf),p); 讀取檔案中的一行到字元陣列中
if(buf[0] != 0) //如果不加此處,檔案如果有空行的話在下面atoi轉換時將會轉化成0這個值並記錄。
{
int value = atoi(buf) ; //預設字串裡全是 0-512之間的字元。
array[value]++ ; 記錄值為value所出現的次數。
}
}
for(int i =0 ; i<512; i++)
{
for(int j=0; j<array[i]; j++)
printf("%d",i);
}
可以通fseek調整檔案指標的位置。
fseek(FILE *p, sizeof(struct student), SEEK_END); //第二個引數為偏移量。
SEEK_SET 實際上定義了巨集 0
SEEK_CUR 1
SEEK_END 2
ftell用於得到檔案位置指標相對於檔案首的偏移位元組數。
long len = ftell( FILE * p) ;
程式通過C語言函式庫往檔案裡面寫資料時,並不是實時將資料直接寫入磁碟,而是放到記憶體裡面,當記憶體滿了或者明確的呼叫了fclose,才將資料一次性寫入磁碟。 C語言的檔案操作函式都是緩衝區函式。
而通過每次寫完後,呼叫fflush(FILE * p) ;資料就會實時進入檔案。
好處:停電,電腦宕機等故障導致緩衝區的內容丟失。
不好:硬碟讀寫次數增加,導致程式效率低下,同時硬碟壽命變短。
//修改配置檔案的時候,有時候會使用,或者做一些不經常修改的資料,但很重要資料,那麼就需要用fflush.
刪除檔案 remove("D\\a.txt") ;即刪除檔案。
檔案改名rename("D:\\a.txt","D:\\m.txt") ; 將D盤中的檔案a.txt改名為m.txt;
getchar putchar
fgets fputs
fgetc fputc