c語言文件函數

c語言里面的各種字符/字符串讀寫一直搞得我分不清楚。。今天來學習總結一下:
原文章來自http://www.cnblogs.com/likebeta/archive/2012/06/16/2551780.html
http://sodino.com/2015/03/07/c-file-io/

打開(讀寫)文件

1.函數原型

FILE *fopen(char *pname,char *mode)

2.功能說明
   按照mode 規定的方式,打開由pname指定的文件。若找不到由pname指定的相應文件,就按以下方式之一處理:
(1) 此時如mode 規定按寫方式打開文件,就按由pname指定的名字建立一個新文件;
(2) 此時如mode 規定按讀方式打開文件,就會產生一個錯誤。

打開文件的作用是:
(1)分配給打開文件一個FILE 類型的文件結構體變量,并將有關信息填入文件結構體變量;
(2)開辟一個緩沖區;
(3)調用操作系統提供的打開文件或建立新文件功能,打開或建立指定文件;
FILE *:指出fopen是一個返回文件類型的指針函數;

3.參數說明
pname:是一個字符指針,它將指向要打開或建立的文件的文件名字符串。
mode:是一個指向文件處理方式字符串的字符指針,指出打開的方式:


補充:
t:text文本文件
b:二進制文件
各種模式可以組合:
rt,rt+,wt,rb,wb,at,ab。。。

//舉例說明:
    FILE *fin, *fout;
    fin = fopen("text1.txt", "r");
    if (!fin)
        printf("open file 1 failed! \n");
    fout = fopen("text2.txt", "w");
    if (!fopen)
        printf("open file2 failed! \n");

4.返回值
   正常返回:被打開文件的文件指針。
   異常返回:NULL,表示打開操作不成功。
5,要說明的是:C語言將計算機的輸入輸出設備都看作是文件。例如,鍵盤文件、屏幕文件等。ANSI C標準規定,在執行程序時系統先自動打開鍵盤、屏幕、錯誤三個文件。這三個文件的文件指針分別是:標準輸入stdin、標準輸出stdout和標準出錯 stderr。

關閉文件

要注意的是讀寫完成后一定要記得關閉文件否則數據可能沒保存

1. 函數原型

int fclose(FILE *fp);
2. 功能說明
  關閉由fp指出的文件。此時調用操作系統提供的文件關閉功能,關閉由fp->fd指出的文件;釋放由fp指出的文件類型結構體變量;返回操作結果,即0或EOF。

3. 參數說明
  fp:一個已打開文件的文件指針。

4. 返回值
  正常返回:0。
  異常返回:EOF,表示文件在關閉時發生錯誤。
例如:

int n=fclose(fp);

//當然也不一定要檢測,可以直接寫出來:
    fclose(fin);
    fclose(fout);

具體的讀寫函數

A. 從文件中讀取一個字符
  1. 函數原型

int fgetc(FILE *fp);

2. 功能說明
    從fp所指文件中讀取一個字符。
  3. 參數說明
    fp:這是個文件指針,它指出要從中讀取字符的文件。
  4. 返回值
    正常返回: 返回讀取字符的代碼。
    非正常返回:返回EOF。例如,要從"寫打開"文件中讀取一個字符時,會發生錯誤而返回一個EOF。
  5. 實例

    ch = fgetc(fin);
    while (ch != EOF)
    {
        putchar(ch);
        ch = fgetc(fin);//也就是說這個期間文件指針fp一直在移動
    }

B. 寫一個字符到文件中去

1. 函數原型

int fputc(int ch,FILE *fp)

2. 功能說明
  把ch中的字符寫入由fp指出的文件中去。
3. 參數說明
  ch:是一個整型變量,內存要寫到文件中的字符(C語言中整型量和字符量可以通用)。
  fp:這是個文件指針,指出要在其中寫入字符的文件。
4. 返回值
  正常返回: 要寫入字符的代碼。
  非正常返回:返回EOF。例如,要往"讀打開"文件中寫一個字符時,會發生錯誤而返回一個EOF。
5. 實例

//將in指向的文件復制到out指向的文件中去
    ch=fgetc(in); //從in所指文件的當前指針位置讀取一個字符
    while(ch!=EOF) //判斷剛讀取的字符是否是文件結束符
    {
        fputc(ch,out); //若不是結束符,將它寫入out所指文件
        ch=fgetc(in); //繼續從in所指文件中讀取下一個字符
    } //完成將in所指文件的內容寫入(復制)到out所指文件中
    fclose(in); //關閉in所指文件
    fclose(out); //關閉out所指文件

字符串:

C. 從文件中讀取一個字符串

1. 函數原型

char *fgets(char *str,int szie,FILE *fp)

2. 功能說明
  從由fp指出的文件中讀取n-1個字符,并把它們存放到由str指出的字符數組中去,最后加上一個字符串結束符'\0'。
3. 參數說明
  str:接收字符串的內存地址,可以是數組名,也可以是指針。
  n: 指出要讀取字符的個數。
  fp:這是個文件指針,指出要從中讀取字符的文件。
4. 返回值

正常返回:返回字符串的內存首地址,即str的值。
非正常返回:返回一個NULL值,此時應當用feof()或ferror()函數來判別是讀取到了文件尾,還是發生了錯誤。例如,要從"寫打開"文件中讀取字符串,將
發生錯誤而返回一個NULL值。

D. 寫一個字符串到文件中去

1. 函數原型

int fputs(char *str,FILE *fp)

2. 功能說明
  把由str指出的字符串寫入到fp所指的文件中去。
3. 參數說明
  str:指出要寫到文件中去的字符串。
  fp:這是個文件指針,指出字符串要寫入其中的文件。
4. 返回值
  正常返回: 寫入文件的字符個數,即字符串的長度。
  非正常返回:返回一個NULL值,此時應當用feof()或ferror()函數來判別是讀取到了文件尾,還是發生了錯誤。例如,要往一個"讀打開" 文件中寫字符串時,會發生錯誤而返回一個NULL值。

//example:將一個文件的內容以追加形式添加到另一個文件
#include <stdio.h>
#define SIZE 512
void main()
{
    char buffer[SIZE];
    FILE *fp1, *fp2;
    
    // 按追加方式打開argv[1] 所指文件
    if ((fp1 = fopen("text1.txt", "a")) == NULL)
    {
        printf("The file text1 can not be opened.\n");
        return;
    }
    if ((fp2 = fopen("text.txt", "r")) == NULL)
    {
        printf("The file text can not be opened.\n");
        return;
    }
    // 讀入一行立即寫出,直到文件結束
    while (fgets(buffer, SIZE, fp1) != NULL)
        printf("%s\n", buffer);
    while (fgets(buffer, SIZE, fp2) != NULL)
        fputs(buffer, fp1);
    fclose(fp1);
    fclose(fp2);
    if ((fp1 = fopen("text1.txt", "r")) == NULL)
    {
        printf("The file text1,line28 can not be opened.\n");
        return;
    }
    while (fgets(buffer, SIZE, fp1) != NULL)
        printf("%s\n", buffer);
    fclose(fp1);
}
  • 關于feof()函數
    1. 函數原型

int feof(FILE *fp)
2. 功能說明
   在文本文件(ASCII文件)中可以用值為-1的符號常量EOF來作為文件的結束符。但是在二進制文件中-1往往可能是一個有意義的數據,因此不能用它 來作為文件的結束標志。為了能有效判別文件是否結束,ANSI C提供了標準函數feof(),用來識別文件是否結束。
3. 參數說明
  fp:文件指針。
4. 返回值
  返回為非0值:已到文件尾。
  返回為0值:表示還未到文件尾。

  • 關于exit()函數
    1. 函數原型

void exit(int status)
2. 功能說明
  exit()函數使程序立即終止執行,同時將緩沖區中剩余的數據輸出并關閉所有已經打開的文件。
3. 參數說明
  status:為0值表示程序正常終止,為非0值表示一個定義錯誤。
4. 返回值
  無。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • C/C++輸入輸出流總結 前兩天寫C++實習作業,突然發現I/O是那么的陌生,打了好長時間的文件都沒有打開,今天終...
    LuckTime閱讀 1,752評論 0 6
  • php usleep() 函數延遲代碼執行若干微秒。 unpack() 函數從二進制字符串對數據進行解包。 uni...
    思夢PHP閱讀 2,002評論 1 24
  • PHP常用函數大全 usleep() 函數延遲代碼執行若干微秒。 unpack() 函數從二進制字符串對數據進行解...
    上街買菜丶迷倒老太閱讀 1,382評論 0 20
  • 晚餐要吃點清淡的,今天推薦幾款低脂少油的家常素菜譜,正在減肥期的小伙伴不妨來試試這幾款素菜的做法吧。 金針菇炒蛋做...
    云香姐姐閱讀 358評論 0 1
  • “終于畢業了!”是的我們畢業了,很高興。但更多的是傷感,一想到陪我們一起度過了六年的老師同學就要離別了,我...
    可愛貓咪a閱讀 174評論 0 0