20201022-成信大-C语言程序设计-补充内容-在文件操作中使用goto,做统一的出错或是结束处理

大原则:尽量不用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;
}

猜你喜欢

转载自blog.csdn.net/matrixbbs/article/details/111209732
今日推荐