程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> 操作系統大型實驗進展(7)

操作系統大型實驗進展(7)

編輯:關於C
C語言函數fopen 函數簡介   函數功能:打開一個文件   函數原型:FILE * fopen(const char * path,const char * mode);   相關函數:open,fclose,fopen_s,_wfopen   所需庫:<stdio.h>   返回值:文件順利打開後,指向該流的文件指針就會被返回。如果文件打開失敗則返回NULL,並把錯誤代碼存在errno 中。   一般而言,打開文件後會作一些文件讀取或寫入的動作,若打開文件失敗,接下來的讀寫動作也無法順利進行,所以一般在fopen()後作錯誤判斷及處理。   參數說明:   參數path字符串包含欲打開的文件路徑及文件名,參數mode字符串則代表著流形態。   mode有下列幾種形態字符串:   r 以只讀方式打開文件,該文件必須存在。   r+ 以可讀寫方式打開文件,該文件必須存在。   rb+ 讀寫打開一個二進制文件,允許讀數據。   rw+ 讀寫打開一個文本文件,允許讀和寫。   w 打開只寫文件,若文件存在則文件長度清為0,即該文件內容會消失。若文件不存在則建立該文件。   w+ 打開可讀寫文件,若文件存在則文件長度清為零,即該文件內容會消失。若文件不存在則建立該文件。   a 以附加的方式打開只寫文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數據會被加到文件尾,即文件原先的內容會被保留。(EOF符保留)   a+ 以附加方式打開可讀寫的文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數據會被加到文件尾後,即文件原先的內容會被保留。 (原來的EOF符不保留)   wb 只寫打開或新建一個二進制文件;只允許寫數據。   wb+ 讀寫打開或建立一個二進制文件,允許讀和寫。   ab+ 讀寫打開一個二進制文件,允許讀或在文件末追加數據。   at+ 打開一個叫string的文件,a表示append,就是說寫入處理的時候是接著原來文件已有內容寫入,不是從頭寫入覆蓋掉,t表示打開文件的類型是文本文件,+號表示對文件既可以讀也可以寫。   上述的形態字符串都可以再加一個b字符,如rb、w+b或ab+等組合,加入b 字符用來告訴函數庫以二進制模式打開文件。如果不加b,表示默認加了t,即rt,wt,其中t表示以文本模式打開文件。由fopen()所建立的新文件會具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)權限,此文件權限也會參考umask 值。   有些C編譯系統可能不完全提供所有這些功能,有的C版本不用"r+","w+","a+",而用"rw","wr","ar"等,讀者注意所用系統的規定。   二進制和文本模式的區別   1.在windows系統中,文本模式下,文件以"\r\n"代表換行。若以文本模式打開文件,並用fputs等函數寫入換行符"\n"時,函數會自動在"\n"前面加上"\r"。即實際寫入文件的是"\r\n" 。   2.在類Unix/Linux系統中文本模式下,文件以"\n"代表換行。所以Linux系統中在文本模式和二進制模式下並無區別。 程序示例   程序示例1   #include <stdio.h>   #include <stdlib.h> //為了使用exit()   int main()   {   char ch;   FILE* fp;   char fname[50]; //用於存放文件名   printf("輸入文件名:");   scanf("%s",fname);   fp=fopen(fname,"r"); //只供讀取   if(fp==NULL) //如果失敗了   {   printf("錯誤!");   exit(1); //中止程序   }   //getc()用於在打開文件中獲取一個字符   while((ch=getc(fp))!=EOF)   putchar(ch);   fclose(fp); //關閉文件   return 0;   }   注意!初學者往往會犯一個錯誤,即在輸入文件名時不加後綴名,請注意加上!   程序示例2   #include <stdio.h>   FILE *stream, *stream2;   int main( void )   {   int numclosed;   // Open for read (will fail if file "crt_fopen.c" does not exist)   if( (stream = fopen( "crt_fopen.c", "r" )) == NULL ) // C4996   // Note: fopen is deprecated; consider using fopen_s instead   printf( "The file 'crt_fopen.c' was not opened\n" );   else   printf( "The file 'crt_fopen.c' was opened\n" );   // Open for write   if( (stream2 = fopen( "data2", "w+" )) == NULL ) // C4996   printf( "The file 'data2' was not opened\n" );   else   printf( "The file 'data2' was opened\n" );   // Close stream if it is not NULL   if( stream)   {   if ( fclose( stream ) )   {   printf( "The file 'crt_fopen.c' was not closed\n" );   }   }   // All other files are closed:   numclosed = _fcloseall( );   printf( "Number of files closed by _fcloseall: %u\n", numclosed );   } 在文件操作時,需要注意以下幾點問題   1、在定義文件指針時,要將文件指針指向空;如 FILE *fp = NULL;   2、文件操作完成後,需要將文件關閉,一定要注意,否則會造成文件所占用內存洩露和在下次訪問文件時出現問題。   3、文件關閉後,需要將文件指針指向空,這樣做會防止出現游離指針,而對整個工程造成不必要的麻煩;如:fp = NULL;   示例程序:   #include <stdio.h>   #define F_PATH "d:\myfile\file.dat"   int main(void)   {   FILE *fp = NULL; //需要注意   fp = fopen(F_PATH, "r");   if(NULL == fp)   {   return -1; //要返回錯誤代碼   }   fclose(fp);   fp = NULL; //需要指向空,否則會指向原打開文件地址   return 0;   }
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved