TC中開啟檔案和寫入檔案

woodcol發表於2017-11-03

    四年前在大學的時候學過這個,沒有想到,在現在看來這個東西還是這麼的流行.這正驗證了那句話,越是簡單的東西,功能越是強大,生命力越是頑強!你可別小看這簡單的TC.聽說很多高手都在用,很多骨灰級的高手也用這個。就像很多電路電子高手都會對組合語言情有獨鍾一樣。只因為她太單純!所以人人都喜歡。

檔案開啟fopen函式


TAG:檔案,ANSI C檔案處理函式,檔案開啟與關閉,檔案開啟fopen函式
TEXT:在C語言中,檔案的開啟操作是通過fopen函式來實現的,此函式的宣告在“stdio.h”中,原型如下:
FILE *  fopen (const char *path, const char *mode);
函式形式引數說明如下:
const char *path ——檔名稱,用字串表示;
const char *mode ——檔案開啟方式,同樣用字串表示。
函式返回值——FILE型別指標。如果執行成功,fopen 返回檔案的地址,否則返NULL。
提示: 注意檢測fopen函式的返回值,防止開啟檔案失敗後,繼續對檔案進行讀寫而出現嚴重錯誤。
檔名稱一般要求為檔案全名,檔案全名由檔案所在目錄名加檔名構成。例如檔案8_4.C儲存在C驅動器的temp目錄中,則檔案所在目錄名為“c:\temp”,檔名為“8_4.C”,檔案全名為“c:\temp\8_4.C”。如果用字串來儲存檔案全名,語句如下:
char szFileName[256]=“c:\\temp\\8_4.c”
fopen函式允許檔名稱僅僅為檔名,那麼此檔案的目錄名由系統自動確定,一般為系統的當前目錄名。
假設ctest.c中包括如下的程式語句:
FILE *fpFile;
fpFile =fopen(“C:\\a.txt”, “w+”);
編譯連線後形成可執行程式ctest.exe。無論ctest.exe在什麼目錄下執行,都會準確的開啟C盤根目錄下的a.txt檔案。但是如果包括如下的程式語句:
FILE *fpFile;
fpFile =fopen (“a.txt”, “w+”);
則檔案“a.txt”的位置則與ctest.exe所在的目錄有關。假設Ctest.exe儲存在c:\tc目錄下,執行下面的dos命令:
c:\>cd c:\tc
c:\tc>Ctest
則在c:\tc目錄下建立了名為a.txt的檔案。
但是如果執行下面的dos命令:
c:\>cd c:\
c:\>C:\TC\ctest
則在c:\目錄下建立了名為a.txt的檔案。因此在確定檔名稱時,要非常注意。
提示: 注意檔名稱的格式要求路徑的分割符為“\\”,而不是“\”,因為在C語言中“\\”代表字元\。例如“C:\\Test.dat”
根據不同的需求,檔案的開啟方式有如下幾種模式:
1) 只讀模式
2) 只寫模式
3) 追加模式
4) 讀寫模式
char *mode 含義 註釋
“r”只讀 開啟文字檔案,僅允許從檔案讀取資料
“w”只寫 開啟文字檔案,僅允許向檔案輸出資料
“a”追加 開啟文字檔案,僅允許從檔案尾部追加資料
“rb” 只讀 開啟二進位制檔案,僅允許從檔案讀取資料
“wb” 只寫 開啟二進位制檔案,僅允許向檔案輸出資料
“ab” 追加 開啟二進位制檔案,僅允許從檔案尾部追加資料
“r+” 讀寫 開啟文字檔案,允許輸入/輸出資料到檔案
“w+” 讀寫 建立新文字檔案,允許輸入/輸出資料到檔案
“a+” 讀寫 開啟文字檔案,允許輸入/輸出資料到檔案
“rb+”讀寫 開啟二進位制檔案,允許輸入/輸出資料到檔案
“wb+”讀寫 建立新二進位制檔案,允許輸入/輸出資料到檔案
“ab+”讀寫 開啟二進位制檔案,允許輸入/輸出資料到檔案
提示:注意檔案開啟模式引數為字串,不是字元。另外,對不同的作業系統或不同的C語言編譯器,檔案開啟模式引數可能不同。
REF:.txt,只讀模式.txt,只寫模式.txt,追加模式.txt,讀寫模式.txt
只讀模式

TAG:檔案,ANSI C檔案處理函式,檔案開啟與關閉,檔案開啟fopen函式,檔案開啟模式,只讀模式
TEXT:只能從檔案讀取資料,也就是說只能使用讀取資料的檔案處理函式,同時要求檔案本身已經存在。如果檔案不存在,則fopen的返回值為NULL,開啟檔案失敗。由於檔案型別不同,只讀模式有兩種不同引數。“r”用於處理文字檔案(例如.c檔案和..txt檔案),“rb” 用於處理二進位制檔案(例如.exe檔案和.zip檔案)。
REF:.txt
只寫模式

TAG:檔案,ANSI C檔案處理函式,檔案開啟與關閉,檔案開啟fopen函式,檔案開啟模式,只寫模式
TEXT:只寫模式;只能向檔案輸出資料,也就是說只能使用寫資料的檔案處理函式。如果檔案存在,則刪除檔案的全部內容,準備寫入新的資料。如果檔案不存在,則建立一個以當前檔名命名的檔案。如果建立或開啟成功,則fopen返回檔案的地址。同樣只寫模式也有兩種不同引數,“w”用於處理文字檔案,“wb”用於處理二進位制檔案。
REF:.txt
追加模式

TAG:檔案,ANSI C檔案處理函式,檔案開啟與關閉,檔案開啟fopen函式,檔案開啟模式,追加模式
TEXT:
追加模式;一種特殊寫模式。如果檔案存在,則準備從檔案的末端寫入新的資料,檔案原有的資料保持不變。如果此檔案不存在,則建立一個以當前檔名命名的新檔案。如果建立或開啟成功,則fopen的返回此檔案的地址。其中引數“a”用於處理文字檔案,引數“ab”用於處理二進位制檔案。
REF:.txt
讀寫模式

TAG:檔案,ANSI C檔案處理函式,檔案開啟與關閉,檔案開啟fopen函式,檔案開啟模式,讀寫模式
TEXT:
讀寫模式:可以向檔案寫資料,也可從檔案讀取資料。此模式下有如下的幾個引數:“r+”,“rb”:要求檔案已經存在,如果檔案不存在,則開啟檔案失敗。“w+”和“wb+”:如果檔案已經存在,則刪除當前檔案的內容,然後對檔案進行讀寫操作;如果檔案不存在,則建立新檔案,開始對此檔案進行讀寫操作。“a+”和“ab+”如果檔案已經存在,則從當前檔案末端的內容,然後對檔案進行讀寫操作;如果檔案不存在,則建立新檔案,然後對此檔案進行讀寫操作。
REF:.txt
檔案關閉fclose函式

TAG:
TEXT:在C語言中,檔案的關閉是通過fclose函式來實現。此函式的宣告在“stdio.h”中,原型如下:
int fclose (FILE *stream);
函式形式引數說明如下:
FILE *stream ——開啟檔案的地址。
函式返回值 ——int 型別,如果為0,則表示檔案關閉成功,否則表示失敗。.
檔案處理完成之後,最後的一步操作是關閉檔案,保證所有資料已經正確讀寫完畢,並清理與當前檔案相關的記憶體空間。在關閉檔案之後,不可以再對檔案進行讀寫操作,除非再重新開啟檔案。
例13-2 開啟名為“a.txt”的檔案,並向檔案輸出字串“TestFile”,然後關閉檔案,同時在螢幕上輸出fclose的返回值。
#include "stdio.h"
void main()
{
FILE *fpFile;
int nStatus=0;
If((fpFile=fopen("a.txt","w+"))==NULL)
{
printf(“Open file failed!\n”);
exit(0);
}
fprintf(fpFile,"%s","TestFile");
nStatus=fclose(fpFile);
printf("%d",nStatus);
}
提示:注意在檔案處理的最後呼叫fclose函式關閉檔案。在關閉檔案之後,不可再對檔案進行讀寫操作。
REF:.txt
 
1.從鍵盤輸入一行字元,寫入一個檔案,再把該檔案內容讀出顯示在螢幕上。   #include<stdio.h>   main()   {   FILE *fp;   char ch;   if((fp=fopen("d:\\ string","w+"))==NULL)   {   printf("Cannot open file strike any key exit!");   getch();   exit(1);   }   printf("input a string:\n");   ch=getchar();   while (ch!='\n')   {   fputc(ch,fp);   ch=getchar();   }   rewind(fp);   ch=fgetc(fp);   while(ch!=EOF)   {   putchar(ch);   ch=fgetc(fp);   }   printf("\n");   fclose(fp);   }     2.把命令列引數中的前一個檔名標識的檔案,複製到後一個檔名標識的檔案中, 如命令列中只有一個檔名則把該檔案寫到標準輸出檔案(顯示器)中。   #include<stdio.h>   main(int argc,char *argv[])   {   FILE *fp1,*fp2;   char ch;   if(argc==1)   {   printf("have not enter file name strike any key exit");   getch();   exit(0);   }   if((fp1=fopen(argv[1],"r+"))==NULL)   {   printf("Cannot open %s\n",argv[1]);   getch();   exit(1);   }   if(argc==2) fp2=stdout;   else if((fp2=fopen(argv[2],"w+"))==NULL)   {   printf("Cannot open %s\n",argv[1]);   getch();   exit(1);   }   while((ch=fgetc(fp1))!=EOF)   fputc(ch,fp2);   fclose(fp1);   fclose(fp2);   }   這兩個程式執行一下試一試. 
 
#include   <stdio.h> 
ANSI   C規定了標準輸入輸出函式庫,可用fopen()函式來實現開啟檔案,fclose()關閉指定的檔案。函式原型為:

FILE*   fopen(char*   filepathname,   char*   mode);
int   fclose(FILE*   fp);

關於檔案的字尾名支援樓上

"檔案"是指儲存在計算機外部儲存器中的資料的集合。計算機根據檔案的名字,完成對檔案的操作。
C語言將檔案看作是字元構成的序列,即字元流。其基本的儲存單位是位元組。
C語言中的檔案,按照它的ASC程式碼存放,稱為ASC檔案或文字檔案。按照資料值的二進位制程式碼存放,稱為二進位制檔案。
C語言在stdio.h中定義了一個file檔案結構體型別,包含管理和控制檔案所需要的各種資訊。
在c程式中系統對檔案進行的各種操作是通過指向檔案結構體的指標變數來實現的。
定義一個指向檔案結構體型別的指標變數的形式:
FILE * 指標變數名;
例如:FILE *fp1,*fp2;
則fp1,fp2是可以指向2個FILE檔案結構體的指標變數。檔案指標變數的賦值操作是由開啟檔案函式fopen()實現的。
fopen()函式的原型是:
FILE *fopen(char *filename,char *mode);
其中filename 是要開啟的檔名,mode是說明處理檔案的方式。它的呼叫方式一般為:
檔案指標變數=fopen(檔名,處理檔案方式);
例如:fopen("a:\\exam1.c","r")
注意:檔名是要開啟的檔案的檔名字,可以是包含碟符、路徑、檔名、副檔名的檔案識別符號。但在書寫時要符合c語言的規定。例如檔名“a:\tc\w1.c”,在該函式中的檔名應寫成“a:\\tc\\w1.c”。
如果是二進位制檔案,在使用時值要在模式後新增字元b即可,如“rb”\"rb+"分別表示讀取二進位制檔案和一讀取/寫入開啟二進位制檔案。
由於檔案不存在等原因造成不能開啟檔案,則呼叫fopen()後將返回一個空指標null.
if(fp=fopen("a:\\exam1.c","r")==NULL)
{
 printf("Bu neng da kai wen jian \n");
 gets();
 exit(1);
}
一般exit(0)表示程式正常退出,exit(非零值)表示程式出錯後退出。
檔案的關閉
當c語言檔案使用完後,應該立即關閉檔案,防止由於誤操作等原因破壞已經開啟的檔案。檔案的關閉通過stdio.h中的fclose()函式實現。具體用法是:
fclose(檔案指標);
例如:fclose(fp);
則程式將檔案型別指標fp所指向的檔案關閉。fp不再指向該檔案。
1。fputc()函式
函式fputc()的作用是向檔案寫入一個字元。其呼叫形式為:
fputc(字元,檔案型指標變數)
例:fputc('A',fp);
fp為一個檔案型別指標變數,上式將字元常量‘A’(也可以是字元型變數)寫入檔案當前位置,並且使檔案位置指標下移一個位元組。如果寫入操作成功,返回值是該字元,否則返回EOF.
通過鍵盤輸入字元到檔案中,直到輸入“*”結束。
#include "stdio.h"
main()
{
    FILE *fp;
    char f_name[30];
    char choise,in_char;
    printf("\n\tPlease input the file name\n");
    scanf("%s",f_name);
    fp=fopen(f_name,"w+");
    printf("\nPlease input :\n");
    in_char=getchar();
    while(in_char!='*')
    {
     fputc(in_char,fp);
     in_char=getchar(); 
    }
    fclose(fp);
}
從檔案中讀取一個字元
函式fgetc()的作用是從一個檔案中讀取一個字元。其呼叫形式為:
fgetc(檔案型指標變數)
例:a=fgetc(fp);
fp為一個檔案型別的指標變數,函式fgetc(fp)不僅返回檔案當前位置的字元,並且使檔案位置指標下移一個字元。如果遇到檔案結束,則返回值為檔案結束標誌EOF。
輸入檔名,輸出該檔案的內容。
#include <stdio.h>

void main()
{
 FILE *fp;
 char out_ch,f_name[30];
 printf("Please input the filename\n");
 scanf("%s",f_name);
 fp=fopen(f_name,"r");
 if(fp!=NULL)
 {
  printf("The file is:\n");
  while((out_ch=fgetc(fp))!=EOF)
  {
   putchar(out_ch); 
  } 
 }
 else
 {
  printf("\n\n\t\t%s The file not find!\n",f_name); 
 }
 fclose(fp);
}
按字串讀寫的函式
函式fputs()的作用是向檔案寫入一個字串。其呼叫形式為:
fputs(字串,檔案型指標變數)
其中字串可以是字串常量、指向字串的指標變數、存放字串陣列的陣列名。寫入檔案成功,函式返回值為0,否則為EOF。
注意:字串的結束標誌‘\0’ 不寫入。例如:
fputs("Hello",fp);
fp為一個檔案型指標變數,上式將字串中的字元h,e,l,l,o寫入檔案指標的當前位置。
fgets函式
函式fgets()的作用是從一個檔案中讀取一個字串。其呼叫形式為:
fgets(字元陣列,字元數,檔案型指標變數)
例:fgets(str,n,fp);
其作用是從fp指向的檔案的當前位置開始讀取n-1個字元,並加上字串結束標誌‘\0’一起放入字元陣列str中。如果從檔案讀取字元時遇到換行符或檔案結束標誌EOF,讀取結束。函式返回值為字元陣列str的首地址。
將檔案tsu.txt 複製到tsu1.txt中
#include "stdio.h"
main()
{
    FILE *f_in,*f_out;
    char str[50];
    f_out=fopen("tsu.txt","r");
    f_in=fopen("tsu1.txt","w");
    while(!feof(f_out))
    {
     fgets(str,30,f_out);
     fputs(str,f_in); 
    }
    fclose(f_out);
    fclose(f_in);
    printf("The file copy finish!");
}

fprintf()函式
函式fprintf()的作用與printf()相似,只是輸出物件不是標準輸出裝置而是檔案,即按照格式要求將資料寫入檔案。它呼叫的一般形式為:
fprintf(檔案型指標變數,格式控制,輸出列表)
例如:
fprintf(fp,"%d,%s,%5.1f",num,name,score);
它的作用是將變數num,name,score按照%d,%s,%5.1f的格式寫入fp指向的檔案當前
位置

fscanf()函式是按照格式要求從檔案中讀取資料。它呼叫的一般形式為:
fscanf(檔案型指標變數,格式控制,輸入表列);
例如:
fscanf(fp,"%ld,%s,%5.1f",&num,name,&score);
它的作用是從fp指向的檔案的當前位置開始,按照的格式取出資料,賦給變數num,name,score.
。主要用於資料檔案的讀寫,即可以使用asc檔案也可以使用二進位制檔案。
將10個學生紀錄輸入檔案tsu.txt中,並顯示在螢幕上。
#include "stdio.h"
main()
{
    FILE *fp;
    long num;
    int n,score;
    char name[20];
    fp=fopen("tsu.txt","w");
    printf("Please input :\n");
    for(n=1;n<=10;n++)
    {
     scanf("%s%10ld%d",name,&num,&score);
     fprintf(fp,"%20s%10ld%5d\n",name,num,score);
     
    }
    fclose(fp); 
    fp=fopen("tsu.txt","r");
    for(n=1;n<=10;n++)
    {
     fscanf(fp,"%20s%10ld%5d\n",name,&num,&score);
     printf("%20s%10ld%5d\n",name,num,score);
    }
    fclose(fp);
}

fwrite()函式
作用是將成批的資料塊寫入檔案。
fwrite(寫入檔案的資料塊的存放地址,一個資料塊的位元組數,資料塊的個數,檔案型指標變數);
如果函式fwrite()操作成功,則返回值為實際寫入檔案的資料塊的個數。
例如:已知struct student型別的陣列stu[20],則語句
則fwrite(&stu[1],sizeof(struct student),2,fp);
從結構體陣列元素str[1]存放的地址開始,以一個結構體struct student型別變數所佔位元組數為一個資料塊,共寫入檔案型別指標fp指向的檔案2個資料塊,即stu[1]\stu[2]的內容寫入檔案。如果操作成功,函式的返回值為2。

fread()函式
作用是從檔案中讀出成批的資料塊。
fread(從檔案讀取得資料塊的存放地址,一個資料塊的位元組數,資料塊的個數,檔案型指標變數);
如果函式fread()操作成功,則返回值為實際從檔案中讀取資料塊的個數。
例如已知stu1是一個結構體struct student變數,則
fread(&stu1,sizeof(struct student),1,fp);
從檔案型別指標fp指向的檔案的當前位置開始,讀取1個資料塊,該資料塊為結構體struct student型別變數所佔位元組數,然後將讀取得內容放入變數stu1中。
注意:fwrite()和fread()函式讀寫檔案時,只有使用二進位制方式,才可以讀寫任何型別的資料。最常用於讀寫陣列和結構體型別資料。

函式feof()
用來檢測一個指向檔案的指標是否已經指到了檔案最後的結束標誌eof。
呼叫的一般形式為:
feof(檔案型指標變數);
如果檔案型指標指向的檔案的當前位置為結束標誌eof,則函式返回一個非零值,否則返回0值。

函式rewind()將令指向檔案的指標重新指向檔案的開始位置。函式無返回值。其呼叫形式為:
rewind(檔案型指標變數);
例如:
rewind(fp);
fp是一個指向檔案的指標,執行該語句後,fp指向檔案的開始位置,即檔案的第一個資料。

函式fseek()可以將使得指向檔案的指標變數指向檔案的任何一個位置,實現隨即讀寫檔案。它呼叫的形式為:
fseek(檔案型指標變數,偏移量,起始位置);
函式fseek()將以檔案的起始位置為基準,根據偏移量往前或往後移動指標。其中偏移量是一個長整型數,表示從起始位置移動的位元組數,正數表示指標往後移,負數表示指標往前移。起始位置用0、1、2或者用名字seek_set\seek_cur\seek_end代表檔案開始、檔案當前位置和檔案結束位置。如果指標設定成功,返回值為0,否則為非0值。

函式ftell()用於測試指向檔案的指標的當前位置。它的呼叫方式為:
ftell(檔案型指標變數);
函式的返回值是一個長整形數,如果測試成功,則返回指向檔案的指標當前指向的位置距離檔案開頭的位元組數,否則返回-1L

作業:
1、將鍵盤輸入的10個浮點數儲存到一個二進位制檔案中,然後在檔案末尾再追加若干資料,最後統計檔案中資料的個數。
2、已知2個檔案data1和data2,將他們的內容和並起來,生成第3個檔案data3.
3、已知一個由西文字元組成的ask檔案,要求將檔案中的英文字母按照如下形勢變換,然後生成一個新的密碼檔案。a<=>z b<=>y c<=>x.......
4、已知一個檔案包含若干人的姓名、通訊地址、郵政編碼和電話,要求根據此檔案生成一個只包含所有人姓名和電話的新檔案。

相關文章