1. 程式人生 > >C語言,檔案操作詳解

C語言,檔案操作詳解

在 C 語言中,檔案操作的函式大多包含在 標頭檔案中,使用時記得 #include。

一、開啟和關閉檔案

1. 開啟檔案

FILE * fopen ( const char * filename, const char * mode );

開啟一個檔案,成功則返回檔案的指標,失敗則返回 NULL。
任何開啟的檔案在不需要使用後都必須關閉。

模式:

  • r 開啟只讀檔案,檔案必須存在
  • r+ 開啟可讀寫檔案,檔案必須存在
  • w 開啟只寫檔案,檔案不存在會建立,檔案存在會覆蓋原內容
  • w+ 開啟可讀寫檔案,檔案不存在會建立,檔案存在會覆蓋原內容
  • a 附加形式開啟只寫檔案
  • a+ 附加形式開啟可讀寫檔案
  • b 加在上面模式之後,表示二進位制方式開啟,例如 “rb”、”r+b”、”wb” 等等

使用文字檔案方式讀寫檔案,在 Windows 下換行 \n 會自動替換為 \r\n,使用二進位制方式則不會。

2. 關閉檔案

int fclose ( FILE * stream );

關閉一個檔案指標,成功返回0,失敗返回 EOF,其值通常為 -1。

3. 程式碼示例

#include <stdio.h>
int main ()
{
  FILE * pFile;
  pFile = fopen ("D:\\myfile.txt", "wb"); // 以二進位制方式開啟只寫檔案
  if (pFile != NULL)
  {
    fputs ("fopen example", pFile);
    fclose (pFile); // 用完後一定要記得關閉
  }
  return 0;
}

二、讀檔案

1. 讀取一個字元

int fgetc ( FILE * stream );

返回讀取到的字元,讀到檔案末尾則返回 EOF。

示例:

#include <stdio.h>
int main ()
{
  FILE * pFile;
  int c;
  int n = 0;
  pFile = fopen ("D:\\myfile.txt", "r");
  if (pFile == NULL) perror ("Error opening file"); // 開啟失敗
  else
  {
    while (c != EOF)
    {
      c = fgetc (pFile); // 獲取一個字元
      if (c == '$') n++; // 統計美元符號 '$' 在檔案中出現的次數
    }
    fclose (pFile); // 一定記得要關閉檔案
    printf ("The file contains %d dollar sign characters ($).\n",n);
  }
  return 0;
}

2. 讀取字串

char * fgets ( char * str, int num, FILE * stream );
  • str 是將讀取到的內容複製到的目標字串陣列
  • num 是一次讀取的大小

這裡還要介紹一下 feof(FILE * stream) 函式,它用於判斷是否已經到檔案末尾了,如果到了檔案末尾則會返回 0。

示例:

#include <stdio.h>
#include <string.h>
 
int main()
{
  FILE * pFile;
  char mystring[100] = { 0 };
  pFile = fopen("D:\\myfile.txt", "r");
  if (pFile == NULL) perror ("Error opening file");
  else
  {
    while (!feof(p)) // 如果還沒有到檔案末尾
    {
      memset(s, 0, sizeof(s)); // 重置是個好習慣
      fgets(s, sizeof(s), p); // 一次讀取 100 個字元
      printf("%s", s);
    }
    fclose(p); // 一定記得要關閉檔案
  }
  return 0;
}

3. 讀取指定記憶體大小

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
  • ptr 為目標記憶體塊,其大小至少為 size * count
  • size 是一次讀取的位元組大小
  • count 是一次讀取多少個 size
  • 返回值是成功讀取的位元組大小

示例:

#include <stdio.h>
#include <string.h>
 
int main()
{
  FILE *pFile = fopen("I:\\test.txt", "rb");
  if (pFile == NULL) 
  {
    perror ("Error opening file");
    return -1;
  }
  char buf[100] = { 0 };
  while (!feof(pFile)) // 如果還沒有到檔案末尾
  {
    memset(buf, 0, sizeof(buf));
    size_t len = fread(buf, sizeof(char), sizeof(buf), pFile);
    printf("buf: %s, len: %d\n", buf, len);
  }
  fclose(pFile);
  return 0;
}

三、寫檔案

和讀檔案相對應,也分以下三個方法:

1. 寫一個字元

int fputc ( int character, FILE * stream );

成功則返回寫入的字元,失敗返回 EOF。

2. 寫入字串

int fputs ( const char * str, FILE * stream );

成功返回一個正數,失敗返回 EOF。

3. 寫入指定記憶體大小

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

返回成功寫入的記憶體大小,單位為位元組。

4. 示例:檔案拷貝

一個檔案拷貝的例子:

#include <stdio.h>
#include <string.h>
 
int main()
{
  FILE *src = fopen("D:\\src.avi", "rb"); // 原始檔
  if (src == NULL)
  {
    perror ("Error opening file");
    return -1;
  }
  FILE *dst = fopen("D:\\dst.avi", "wb"); // 需要拷貝的目標檔案
  char buf[1024 * 64] = { 0 }; // 一次讀取 64k 的大小
  while (!feof(p))
  {
    memset(buf, 0, sizeof(buf));
    size_t len = fread(buf, sizeof(char), sizeof(buf), src);
    // 注意這裡寫入的大小一定要使用讀取返回的大小 len,
    // 否則很可能出現檔案末尾多寫入了很多個 0 的情況
    fwrite(buf, sizeof(char), len, dst);
  }
  fclose(src);
  fclose(dst);
  printf("copy end\n");
  return 0;
}

四、其它常用函式

1. 檔案指標位置重定位

之前我們的檔案操作都只能一步步往下讀寫,想回頭的話怎麼辦,就需要使用下面這個函數了

int fseek ( FILE * stream, long int offset, int origin );
  • 成功返回 0,失敗返回一個非 0 數
  • offset 指相應對 origin 位置處的偏移量,單位為位元組
  • origin 是指標的參考位置,有以下三個值可以選擇
#define SEEK_CUR    1  // 當前位置
#define SEEK_END    2  // 末尾
#define SEEK_SET    0  // 開頭

2. 獲取指標當前位置

long int ftell ( FILE * stream );

成功返回指標相對於開頭的偏移量,失敗返回 -1。

3. 示例:獲取檔案大小

使用以上兩個函式,可以輕鬆獲取到檔案的大小:

#include <stdio.h>
 
int main ()
{
  FILE * pFile;
  long size = 0; // 檔案大小
 
  pFile = fopen ("D:\\myfile.txt","rb");
  if (pFile==NULL) perror ("Error opening file");
  else
  {
    fseek (pFile, 0, SEEK_END); // 直接定位到檔案末尾
    size = ftell (pFile); // 獲取到當前指標的偏移量,即檔案大小
    fclose (pFile);
    printf ("Size of myfile.txt: %ld bytes.\n", size);
  }
  return 0;
}

4. 將緩衝區內容寫入檔案

實際上,當我們在執行檔案寫入操作時,寫入的內容只是保留在了一個緩衝區內,並沒有實時寫入到檔案中去,而是等到 fclose 或者程式終止時才寫入。
使用下面這個函式則可以將緩衝區的內容即時寫入到檔案中去:

int fflush ( FILE * stream );
  • 成功返回 0,失敗返回 EOF。
  • 優點:
    防止由於斷電或者宕機造成重要資料沒有寫入到檔案中而導致資料丟失。
  • 缺點:
    磁碟讀寫次數增加,影響程式執行效率,降低磁碟使用壽命。

5. fprintf() 和 fscanf()

定義如下:

int fprintf ( FILE * stream, const char * format, ... );
int fscanf ( FILE * stream, const char * format, ... );


和 printf() 與 scanf() 使用方式基本相同,只不過他們是把結果讀入或者寫入到檔案中去了。

示例:

#include <stdio.h>
 
int main()
{
    char str[80];
    float f;
    FILE * pFile;
 
    pFile = fopen("D:\\myfile.txt", "w+");
    // 在檔案中寫入 "PI is 3.1416" 這個內容
    fprintf(pFile, "%s is %f", "PI", 3.14159f);
    rewind(pFile); // rewind 函式將指標重新回到起始位置
    fscanf(pFile, "%s is %f", str, &f);
    fclose(pFile);
    printf("I have read: %f and %s \n", f, str);
    return 0;
}

五、刪除和重新命名檔案

1. 重新命名檔案

int rename ( const char * oldname, const char * newname );

刪除成功返回 0,失敗返回非 0。

2. 刪除檔案

int remove ( const char * filename );

刪除成功返回 0,失敗返回非 0。

這兩個方法都很簡單,就不多說了。

相關推薦

C語言檔案操作

在 C 語言中,檔案操作的函式大多包含在 標頭檔案中,使用時記得 #include。 一、開啟和關閉檔案 1. 開啟檔案 FILE * fopen ( const char * filename, const char * mode ); 開啟一個檔案,成功則返回

【轉】 C語言文件操作

pri void rfi 識別 archive format 隨機 stat 文本文 轉自:http://www.cnblogs.com/likebeta/archive/2012/06/16/2551780.html C語言中沒有輸入輸出語句,所有的輸入輸出功能都用

嵌入式C語言之位操作

1.位操作符:     位操作直接將兩個運算元按照二進位制對應進行操作;     例:0xaa&(位與)0xf0=0xa0;     邏輯操作是  兩個運算元整體來操作;     例

C語言檔案操作

* 檔案狀態檢查 A. 檔案結束 (1) 函式原型 int feof(FILE *fp) (2) 功能說明    該函式用來判斷檔案是否結束。 (3) 引數說明    fp:檔案指標。 (4) 返回值    0:假值,表示檔案未結束。    1:真值,表示檔案結束。

C語言指標、連結串列與檔案操作

用兩個函式 Load_LinkList() 和 Save_LinkList() 讓連結串列與檔案操作結合,除了列印函式,其他都是在記憶體中操作連結串列,這樣寫更有條理,在建立連結串列時沒有采用書上的用一箇中間變數引導,並插入到結點前面,而是直接在連結串列尾的next申請記憶

C語言的結構體(轉載只是為了查閱方便若有侵權立刪)

C語言的結構體詳解 結構體(struct) 1、定義   一般格式為:          struct 結構名          {    

結構體指標C語言結構體指標

結構體指標,可細分為指向結構體變數的指標和指向結構體陣列的指標。 指向結構體變數的指標 前面我們通過“結構體變數名.成員名”的方式引用結構體變數中的成員,除了這種方法之外還可以使用指標。前面講過,&student1 表示結構體變數 student1 的首地址,即 student1 第一個項的地址

C# 檔案操作(二)FileInfo類

本篇讓我們一起看一下FileInfo類如何使用。     FileInfo類  提供了與File類相同的功能,不同的是FileInfo提供的都是成員方法   1、讀檔案 1 2 3 4 //摘要:建立只讀 System.IO.FileStrea

CC++ 檔案操作

CPP 的檔案操作 在C++中,有一個stream這個類,所有的I/O都以這個“流”類為基礎的,包括我們要認識的檔案I/O,stream這個類有兩個重要的運算子: 1、插入器(<<)   向流輸出資料。比如說系統有一個預設的標準輸出

C# 字符串操作

字符串操作 .get pan class line IV alt har 串操作 1、字符串轉字符數組 (1)、ToCharArray()方法,源碼如下: 調用代碼: var str = "Hello World"; //將字符串轉換成字符數組 var result =

C語言do while迴圈

do…while 迴圈不經常使用,其主要用於人機互動。它的格式是: do { 語句; } while (表示式); 注意,while 後面的分號千萬不能省略。 do…while 和 while 的執行過程非常相似,唯一的區別是:“do…while 是先執行一次迴圈體,然後再判別表示式

C語言(四 檔案操作、遞迴)

檔案讀寫 我們用**fopen()**來新建一個檔案或開啟一個已有的檔案. 函式原型為File *fopen(const char *filename , const char *mode) filename是檔名,mode代表訪問方式。 mode

C語言檔案操作

一、開啟檔案 1、函式 fopen(path, type) 2、引數介紹 引數 型別 說明 備註 path 字串 檔案路徑 如”./h

C語言正則表示式

標準的C和C++都不支援正則表示式,但有一些函式庫可以輔助C/C++程式設計師完成這一功能,其中最著名的當數Philip Hazel的Perl-Compatible Regular Expression庫,許多Linux發行版本都帶有這個函式庫。   C語言處理正則表示式常用的函

C語言專案的建立

最近為方便記錄我的IT學習生活和相關經驗,於是將有關自己對對相關知識的見解置於CSDN部落格上,以供各位學習交流。 今天我要分享的主題是有關C語言專案的建立和相關基礎知識,下面就以VS編譯器為例進行相關講解,若是有不當之處,還希望各位博友諒解並指出。 VS中

C語言for語句用法

在C語言中,for語句使用最為靈活,它完全可以取代 while 語句。它的一般形式為: for(表示式1; 表示式2; 表示式3) 語句 它的執行過程如下:先求解表示式1。 求解表示式2,若其值為真(非0),則執行for語句中指定的內嵌語句,然後執行下面第3)步;若其值

python檔案操作

檔案操作是程式設計中必不可少的,配置檔案,資料儲存都是對檔案操作;按檔案操作與格式主要內容如下圖: 檔案基本操作為開啟,讀取,寫入,關閉,我們按這個過程來詳解講解。 1.一個例子搞定開啟,讀取與關閉: 準備工作: 1>新建檔案:E:\workdir\readme.txt(或者自己準備一個其

kaldi中執行thchs30流程檔案配置

  本人是kaldi新手,前些階段運行了kaldi中中文最難的樣例aishell,終於跑成功了,修改了好多路徑、請教了好多大神,在此感謝,如果有想了解詳細的執行過程可以和鄙人交流。  由於要做線上識別,網上大多數都是關於thchs30的線上識別,aishell缺少線上識別的教

C語言預處理命令

本文參考諸多資料,詳細介紹常用的幾種預處理功能。因成文較早,資料來源大多已不可考證,敬請諒解。全文字數2萬,閱讀時間50分鐘,建議先收藏。 一 前言 預處理(或稱預編譯)是指在進行編譯的第一遍掃描(詞法掃描和語法分析)之前所作的工作。預處理指令指示在程式正式編譯前就由編譯器進行的操作

tensorflow gfile檔案操作

一、gfile模組是什麼    gfile模組定義在tensorflow/python/platform/gfile.py,但其原始碼實現主要位於tensorflow/tensorflow/python/lib/io/file_io.py,那麼gfile模組主要功能是什麼呢?