模板方法模式之一
range.h
#ifndef _RANGE_H_
#define _RANGE_H_
#define _RANGE_H_
#ifdef __cplusplus
extern "C" {
#endif
extern "C" {
#endif
int range(const char *pFname);
#ifdef __cplusplus
}
#endif
}
#endif
#endif
range.c
#include <stdio.h>
#include <limits.h>
#include <string.h>
#include <stdlib.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;
}
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};
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," ");
}
}
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;
}
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," ");
}
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," ");
}
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、以及下一节的模板方法模式。

浙公网安备 33010602011771号