C語言檔案操作 fopen, fclose, mkdir(打開關閉檔案,建檔案夾,判斷檔案是否存在可讀或可寫)

1.建檔案夾

int _mkdir(const char *path,mode_t mode);

函數名: _mkdir   

功 能: 建立一個目錄   

用 法: int _mkdir( const char *dirname );   

頭檔案庫:direct.h   

傳回值:建立一個目錄,若成功則傳回0,否則傳回-1

=====================================================

2.打開檔案fopen()

函數功能: 打開一個檔案   

函數原型:FILE * fopen(const char * path,const char * mode);

所需庫: <stdio.h>

傳回值: 檔案順利打開後,指向該流的檔案指針就會被傳回。如果檔案打開失敗則傳回NULL,并把錯誤代碼存在errno 中。   

一般而言,打開檔案後會作一些檔案讀取或寫入的動作,若打開檔案失敗,接下來的讀寫動作也無法順利進行,是以一般在fopen()後作錯誤判斷及處理。

if((fin = fopen("a.txt","r")) == NULL)

 printf("Open file error.\n");

參數說明:   

參數path字元串包含欲打開的檔案路徑及檔案名,參數mode字元串則代表着流形态。   

mode有下列幾種形态字元串:  (常用的就前幾個,後面用到了再查,不用記) 

r 以隻讀方式打開檔案,該檔案必須存在。

w 打開隻寫檔案,若檔案存在則檔案長度清為0,即該檔案内容會消失。若檔案不存在則建立該檔案。

a 以附加的方式打開隻寫檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾,即檔案原先的内容會被保留。(EOF符保留)

rb 為輸入打開一個二進制檔案。

wb 隻寫打開或建立一個二進制檔案;隻允許寫資料。

ab 向二進制檔案尾添加資料

r+ 以可讀寫方式打開檔案,該檔案必須存在。

w+ 打開可讀寫檔案,若檔案存在則檔案長度清為零,即該檔案内容會消失。若檔案不存在則建立該檔案。

a+ 以附加方式打開可讀寫的檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾後,即檔案原先的内容會被保留。 (原來的EOF符不保留)

rb+ 讀寫打開一個二進制檔案,隻允許讀資料。

wb+ 讀寫打開或建立一個二進制檔案,允許讀和寫。

ab+ 讀寫打開一個二進制檔案,允許讀或在檔案末追加資料。   

rt+ 讀寫打開一個文本檔案,允許讀和寫。  

wt+ 讀寫打開或着建立一個文本檔案;允許讀寫。   

at+ 讀寫打開一個文本檔案,允許讀或在文本末追加資料。   

上述的形态字元串都可以再加一個b字元,如rb、w+b或ab+等組合,加入b 字元用來告訴函數庫打開的檔案為二進制檔案,而非純文字檔案。

不過在POSIX系統,包含Linux都會忽略該字元。由fopen()所建立的新檔案會具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)權限,此檔案權限也會參考umask 值。   

有些C編譯系統可能不完全提供所有這些功能,有的C版本不用"r+","w+","a+",而用"rw","wr","ar"等,讀者注意所用系統的規定。

==========================================================

3.關閉檔案 fclose()

在使用完一個檔案後應該關閉它,以防止它再誤用,關閉就是指檔案指針變量不指向該檔案,也就是檔案指針變量與檔案脫鈎,此後不能再通過該指針對原來與其相聯系的檔案進行讀寫操作。除非再次打開,使該指針變量重新指向該檔案。

  用 fclose 函數關閉檔案,fclose 函數調用的一般形式為

  fclose(檔案指針);

  例如:

  fclose(fp);

  應該養成在程式終止之前關閉所有檔案的習慣,如果不關閉檔案将丢失資料。因為如前所述,在向檔案寫資料時,是先将資料輸到緩沖區,待緩沖區充滿後才正式輸出給檔案,如果當資料未充滿緩沖區,而程式結束運作,就會将緩沖區中的資料丢失,用 fclose 函數關閉檔案,可以避免這個問題,它先把緩沖區中的資料輸出到磁盤檔案,然後才釋放檔案指針變量。

  fclose 函數也帶回一個值,當順利地執行了關閉操作,則傳回值為 0 ,否則傳回 EOF (-1) 。可以用 ferror 函數來測試。

==============================================================

下面用一個程式來說明上面幾個函數用法:

将a.txt拷貝到/test目錄下,名字也為a.txt

/**
 * Author: Gneveek
 * Data: 2011-10-6
 * Descripition:  Clock Chen's Homework : File operation #1
 * 一、将a.txt拷貝到/test目錄下,名字也為a.txt
 */ 
#include <stdio.h>
#include <direct.h> //用 _mkdir()建立一個檔案夾(目錄) 
int main()
{
	_mkdir("test");
	
	char c;
	FILE *fin, *fout;
	if((fin = fopen("a.txt","r")) == NULL)
		printf("I'm so sorry,Open file error.\n");
	if((fout = fopen("test\\a.txt","w")) == NULL) //以 w 方式,隻能用于往檔案中寫,如果不存在,則以指定的檔案名建立一個檔案
		printf("I'm so sorry,Open file error.\n");
		
	while((c = fgetc(fin)) != EOF)
		fputc(c,fout);	 
		
	fclose(fin);
	fclose(fout);
	return 0;
}
           

================================================================

4.判斷檔案是否存在和是否可讀可寫

int access(const char *pathname,int mode);

pathname:是檔案名稱

mode是我們要判斷的屬性.可以取以下值或者是他們的組合:

R_OK檔案可以讀

W_OK檔案可以寫

X_OK檔案可以執行

F_OK檔案存在.

當我們測試成功時,函數傳回0,否則如果有一個條件不符時,傳回-1.

用一個程式執行個體來認識這個函數:

輸入一個檔案名(在指令行中輸入),判斷該檔案是否存在,并且可讀,不存在提示不存在,不可讀提示不可讀,如果存在并可讀,則在目前目錄下,建立一個目錄test,并将該檔案拷貝到test中

/**
 * Author: Gneveek
 * Data: 2011-10-6
 * Descripition:  Clock Chen's Homework : File operation #2
 *二、輸入一個檔案名(在指令行中輸入),判斷該檔案是否存在,并且可讀,
 *不存在提示不存在,不可讀提示不可讀,如果存在并可讀,
 *則在目前目錄下,建立一個目錄test,并将該檔案拷貝到test中
 */ 
#include <stdio.h>
#include <io.h>
#include <direct.h> 
#include <string.h>

int main()
{
	FILE *fin, *fout;
	char filename[256];	
	char pathname[256] = "test\\";   
	scanf("%s",filename);
	if(access(filename,F_OK) == -1) //判斷存在與否 
		printf("This file does not exist!\n");
	else if(access(filename,R_OK) == -1) //如果存在,判斷可讀否 
		printf("Cann't Read!\n");
	else                              //到這裡,說明即存在又可讀 
	{
		char c;
		_mkdir("test");		
		
		strcat(pathname,filename);			
		
		fin = fopen(filename,"r");	
		fout = fopen(pathname,"w");
		
		while((c = fgetc(fin)) != EOF)
			fputc(c,fout);
	}
	return 0;
}
           

===================================================================

c語言 c 語言 homework file access null
最近更新

C語言檔案操作 fopen, fclose, mkdir(打開關閉檔案,建檔案夾,判斷檔案是否存在可讀或可寫)

1.建檔案夾

int _mkdir(const char *path,mode_t mode);

函數名: _mkdir   

功 能: 建立一個目錄   

用 法: int _mkdir( const char *dirname );   

頭檔案庫:direct.h   

傳回值:建立一個目錄,若成功則傳回0,否則傳回-1

=====================================================

2.打開檔案fopen()

函數功能: 打開一個檔案   

函數原型:FILE * fopen(const char * path,const char * mode);

所需庫: <stdio.h>

傳回值: 檔案順利打開後,指向該流的檔案指針就會被傳回。如果檔案打開失敗則傳回NULL,并把錯誤代碼存在errno 中。   

一般而言,打開檔案後會作一些檔案讀取或寫入的動作,若打開檔案失敗,接下來的讀寫動作也無法順利進行,是以一般在fopen()後作錯誤判斷及處理。

if((fin = fopen("a.txt","r")) == NULL)

 printf("Open file error.\n");

參數說明:   

參數path字元串包含欲打開的檔案路徑及檔案名,參數mode字元串則代表着流形态。   

mode有下列幾種形态字元串:  (常用的就前幾個,後面用到了再查,不用記) 

r 以隻讀方式打開檔案,該檔案必須存在。

w 打開隻寫檔案,若檔案存在則檔案長度清為0,即該檔案内容會消失。若檔案不存在則建立該檔案。

a 以附加的方式打開隻寫檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾,即檔案原先的内容會被保留。(EOF符保留)

rb 為輸入打開一個二進制檔案。

wb 隻寫打開或建立一個二進制檔案;隻允許寫資料。

ab 向二進制檔案尾添加資料

r+ 以可讀寫方式打開檔案,該檔案必須存在。

w+ 打開可讀寫檔案,若檔案存在則檔案長度清為零,即該檔案内容會消失。若檔案不存在則建立該檔案。

a+ 以附加方式打開可讀寫的檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾後,即檔案原先的内容會被保留。 (原來的EOF符不保留)

rb+ 讀寫打開一個二進制檔案,隻允許讀資料。

wb+ 讀寫打開或建立一個二進制檔案,允許讀和寫。

ab+ 讀寫打開一個二進制檔案,允許讀或在檔案末追加資料。   

rt+ 讀寫打開一個文本檔案,允許讀和寫。  

wt+ 讀寫打開或着建立一個文本檔案;允許讀寫。   

at+ 讀寫打開一個文本檔案,允許讀或在文本末追加資料。   

上述的形态字元串都可以再加一個b字元,如rb、w+b或ab+等組合,加入b 字元用來告訴函數庫打開的檔案為二進制檔案,而非純文字檔案。

不過在POSIX系統,包含Linux都會忽略該字元。由fopen()所建立的新檔案會具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)權限,此檔案權限也會參考umask 值。   

有些C編譯系統可能不完全提供所有這些功能,有的C版本不用"r+","w+","a+",而用"rw","wr","ar"等,讀者注意所用系統的規定。

==========================================================

3.關閉檔案 fclose()

在使用完一個檔案後應該關閉它,以防止它再誤用,關閉就是指檔案指針變量不指向該檔案,也就是檔案指針變量與檔案脫鈎,此後不能再通過該指針對原來與其相聯系的檔案進行讀寫操作。除非再次打開,使該指針變量重新指向該檔案。

  用 fclose 函數關閉檔案,fclose 函數調用的一般形式為

  fclose(檔案指針);

  例如:

  fclose(fp);

  應該養成在程式終止之前關閉所有檔案的習慣,如果不關閉檔案将丢失資料。因為如前所述,在向檔案寫資料時,是先将資料輸到緩沖區,待緩沖區充滿後才正式輸出給檔案,如果當資料未充滿緩沖區,而程式結束運作,就會将緩沖區中的資料丢失,用 fclose 函數關閉檔案,可以避免這個問題,它先把緩沖區中的資料輸出到磁盤檔案,然後才釋放檔案指針變量。

  fclose 函數也帶回一個值,當順利地執行了關閉操作,則傳回值為 0 ,否則傳回 EOF (-1) 。可以用 ferror 函數來測試。

==============================================================

下面用一個程式來說明上面幾個函數用法:

将a.txt拷貝到/test目錄下,名字也為a.txt

/**
 * Author: Gneveek
 * Data: 2011-10-6
 * Descripition:  Clock Chen's Homework : File operation #1
 * 一、将a.txt拷貝到/test目錄下,名字也為a.txt
 */ 
#include <stdio.h>
#include <direct.h> //用 _mkdir()建立一個檔案夾(目錄) 
int main()
{
	_mkdir("test");
	
	char c;
	FILE *fin, *fout;
	if((fin = fopen("a.txt","r")) == NULL)
		printf("I'm so sorry,Open file error.\n");
	if((fout = fopen("test\\a.txt","w")) == NULL) //以 w 方式,隻能用于往檔案中寫,如果不存在,則以指定的檔案名建立一個檔案
		printf("I'm so sorry,Open file error.\n");
		
	while((c = fgetc(fin)) != EOF)
		fputc(c,fout);	 
		
	fclose(fin);
	fclose(fout);
	return 0;
}
           

================================================================

4.判斷檔案是否存在和是否可讀可寫

int access(const char *pathname,int mode);

pathname:是檔案名稱

mode是我們要判斷的屬性.可以取以下值或者是他們的組合:

R_OK檔案可以讀

W_OK檔案可以寫

X_OK檔案可以執行

F_OK檔案存在.

當我們測試成功時,函數傳回0,否則如果有一個條件不符時,傳回-1.

用一個程式執行個體來認識這個函數:

輸入一個檔案名(在指令行中輸入),判斷該檔案是否存在,并且可讀,不存在提示不存在,不可讀提示不可讀,如果存在并可讀,則在目前目錄下,建立一個目錄test,并将該檔案拷貝到test中

/**
 * Author: Gneveek
 * Data: 2011-10-6
 * Descripition:  Clock Chen's Homework : File operation #2
 *二、輸入一個檔案名(在指令行中輸入),判斷該檔案是否存在,并且可讀,
 *不存在提示不存在,不可讀提示不可讀,如果存在并可讀,
 *則在目前目錄下,建立一個目錄test,并将該檔案拷貝到test中
 */ 
#include <stdio.h>
#include <io.h>
#include <direct.h> 
#include <string.h>

int main()
{
	FILE *fin, *fout;
	char filename[256];	
	char pathname[256] = "test\\";   
	scanf("%s",filename);
	if(access(filename,F_OK) == -1) //判斷存在與否 
		printf("This file does not exist!\n");
	else if(access(filename,R_OK) == -1) //如果存在,判斷可讀否 
		printf("Cann't Read!\n");
	else                              //到這裡,說明即存在又可讀 
	{
		char c;
		_mkdir("test");		
		
		strcat(pathname,filename);			
		
		fin = fopen(filename,"r");	
		fout = fopen(pathname,"w");
		
		while((c = fgetc(fin)) != EOF)
			fputc(c,fout);
	}
	return 0;
}
           

===================================================================

繼續閱讀