1. 程式人生 > 其它 >20201022-成信大-C語言程式設計-補充內容-在檔案操作中使用goto,做統一的出錯或是結束處理

20201022-成信大-C語言程式設計-補充內容-在檔案操作中使用goto,做統一的出錯或是結束處理

技術標籤:cc語言成信大

大原則:儘量不用goto

  • 易記程式變得混亂,特別是往回調,應對舉措:只往一個方向跳,跳完一般就是程式的結束
  • 標籤大寫,規範化
  • 標籤一般置於程式的出口位置,需要進行防禦性設計,因為自然順序下,程式也會走到出口
  • 標籤頂行頂列寫

檔案操作的一般步驟

  1. 開啟檔案【為了讀,或是為了寫】
  2. 讀寫檔案操作
  3. 關閉檔案

可能出現的異常

  • 檔案開啟時不成功,檢驗fp指標即可
  • 檔案讀寫時不成功,檢驗讀寫方法的返回結果是不是EOF
  • 檔案關閉不成功,檢驗fclose方法的返回值,給使用者提示,再強制置fp為NULL即可

進行程式的防禦性設計

  • 使用檔案之前,先檢驗開啟是否成功
  • 讀寫檔案之後,檢驗讀寫是否正常完成,特別是寫,一定要寫完
  • 一定要記得關閉檔案,否則,易靠成檔案資源的浪費

示例

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define N 100

int main(int argc, char const *argv[])
{
    int i;
    int data[N];
    FILE *fp;
    int res = 0;
    int result;

    srand((unsigned int)time(NULL)); // 植入隨機種子

    // 產生N個隨機數,先暫存在記憶體陣列中
for (i = 0; i < N; i++) { data[i] = rand() % 10000 + 1; // 產生N個1-10000之間的數 } // 開啟檔案 fp = fopen("mydata.txt", "w"); // 以寫方式建立檔案 if (NULL == fp) { res = 1; goto ERROR; } // 寫資料到檔案中 for (i = 0; i < N; i++) { result =
fprintf(fp, "%6d", data[i]); // 格式化寫入 if (result == EOF) { res = 2; goto ERROR; } if ((i + 1) % 10 == 0) { result = fprintf(fp, "\n"); // 回車換行 if (result == EOF) { res = 2; goto ERROR; } } } goto EXIT; // 出錯處理處 ERROR: if (1 == res) { printf("file open error!\n"); exit(res); } if (2 == res) { printf("file write error!\n"); if ( fp!= NULL) { fclose(fp); } exit(res); } // 程式出口處 EXIT: // 關閉檔案 if ( fp!= NULL) { fclose(fp); } return res; }