天天看點

C++ FILE 讀寫檔案

FILE 類結構:

struct _iobuf {
          char *_ptr;        // 檔案輸入的下一個位置
          int   _cnt;        // 目前緩沖區位置
          char *_base;      // 檔案起始位置
          int   _flag;      // 檔案标志
          int   _file;      // 檔案有效性驗證
          int   _charbuf;      // 目前緩沖區狀況
          int   _bufsiz;      // 緩沖區大小
          char *_tmpfname;    // 臨時檔案名
          };
  typedef struct _iobuf FILE;      

打開檔案

fopen() 、fopen_s():

// 傳回檔案指針,打開失敗傳回 0。
  fopen(
    char *filename,        // 檔案全路徑
    char *mode          // 打開方式(r/w/a/r+/w+/a+/t/b) 參考網址:http://c.biancheng.net/view/2054.html
  );
  
  // 成功傳回 0,失敗傳回錯誤碼。
  fopen_s( 
     FILE** pFile,        // 檔案指針
     const char *filename,    // 檔案全路徑
     const char *mode      // 打開方式(同上)
  );      

讀檔案

fgets():

// 成功傳回緩沖區指針,失敗傳回 NULL。
  fgets( 
     char *str,      // 接收檔案内容的緩沖區指針
     int n,        // 讀取的位元組數
     FILE *stream    // 檔案對象指針
  );      

讀取 txt 中所有内容:

// 每行最大長度不得超過 1024 位元組
  FILE* f = fopen("Group.txt","r");
  char buf[1024];
  while(fgets(buf,1024,f)){
    cout << buf << endl;
  }      

讀取 txt 中的某一行:

// 每行最大長度不得超過 1024 位元組
  char* readLineChars(FILE* fp,int line){
    char buf[1024];
    for(int i=0;i<line;i++){
      fgets(buf,1024,fp);
      // 找到第 i 行
      if(i == line-1){
        // 去掉換行符
        if(buf[strlen(buf)-1] == '\n'){
          buf[strlen(buf)-1] = '\0';
        }
        // 移動檔案指針到檔案頭
        fseek(fp,0L,SEEK_SET);
        return buf;
      }
    }
    return "error";
  }      

擷取 txt 行數:

// 每行最大長度不得超過 1024 位元組
  int getLineNum(FILE* fp){
    int result = 0;
    char buf_group[1024];
    while(fgets(buf_group,1024,fp)){
      result++;
    }
    // 移動檔案指針到檔案頭
    fseek(fp,0L,SEEK_SET);
    return result;
  }      

寫檔案

// 成功傳回非負值,失敗傳回 EOF(-1)
  fputs(
    const char *str,    // 要寫入的字元串
    FILE *stream      // 指向 FILE 對象的指針
  )      

繼續閱讀