20201022-成信大-C語言程式設計-補充內容-在檔案操作中使用goto,做統一的出錯或是結束處理
阿新 • • 發佈:2020-12-16
大原則:儘量不用goto
- 易記程式變得混亂,特別是往回調,應對舉措:只往一個方向跳,跳完一般就是程式的結束
- 標籤大寫,規範化
- 標籤一般置於程式的出口位置,需要進行防禦性設計,因為自然順序下,程式也會走到出口
- 標籤頂行頂列寫
檔案操作的一般步驟
- 開啟檔案【為了讀,或是為了寫】
- 讀寫檔案操作
- 關閉檔案
可能出現的異常
- 檔案開啟時不成功,檢驗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;
}