模板方法模式之一

range.h

#ifndef _RANGE_H_
#define _RANGE_H_
#ifdef __cplusplus
extern "C" {
#endif
int range(const char *pFname);
#ifdef __cplusplus
}
#endif
#endif
 
range.c
#include <stdio.h>
#include <limits.h>
#include <string.h>
#include <stdlib.h>
int range(const char *pFname){
    FILE *fp = fopen(pFname, "rb");
    if(fp == NULL)
    {
        printf("Failed to open file\n");
        return -1;
    }
    int min = INT_MAX;
    int max = INT_MIN;
    char buf[256] = {0};
    while((fgets(buf, sizeof(buf), fp)) != NULL){
        char *temp = strtok(buf," ");
        while(temp != NULL){
            int value = atoi(temp);
            min = min > value ? value : min;
            max = max < value ? value : max;
            temp = strtok(NULL," ");
        }
    }
    fclose(fp);
    return max - min;
}
 
range_test.c
#include <stdio.h>
#include "range.h"

int main(int argc, char const *argv[])
{
    int ret = range("nums.txt");
    printf("ret is %d\n", ret);
    return 0;
}
 
以上代码从一个nums.txt中读取一行的数字,并返回这一行的数值的范围。
比如nums.txt里是 1 2 3 4 5 6 7 8 9,那么将返回8(9-1)。
如果文件nums.txt里是空行呢?
    while((fgets(buf, sizeof(buf), fp)) != NULL){
  if(buf[0] == '\r')  return -1;    //内存泄漏。文件打开后未正常关闭。
        char *temp = strtok(buf," ");
        while(temp != NULL){
            int value = atoi(temp);
            min = min > value ? value : min;
            max = max < value ? value : max;
            temp = strtok(NULL," ");
        }
那么先关闭文件,再返回
    while((fgets(buf, sizeof(buf), fp)) != NULL){
  if(buf[0] == '\r') {
    fclose(fp);
    return -1;
  }
        char *temp = strtok(buf," ");
        while(temp != NULL){
            int value = atoi(temp);
            min = min > value ? value : min;
            max = max < value ? value : max;
            temp = strtok(NULL," ");
        }
这样就由两个地方调用了fclose。本例简单,复杂的例子这样编写代码,代码将变得难以阅读。
解决办法:break 和 goto、以及下一节的模板方法模式。
posted @ 2019-12-09 16:15    阅读(148)  评论(0)    收藏  举报