1. 程式人生 > >檔案操作,及檔案操作時的許可權設定,快速實現檔案拷貝,C語言常用IO函式

檔案操作,及檔案操作時的許可權設定,快速實現檔案拷貝,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,因為可能傳入的引數可能不是一個字串

C語言常用IO函式:

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