大原则:尽量不用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));
for (i = 0; i < N; i++)
{
data[i] = rand() % 10000 + 1;
}
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;
}