模板方法模式之二
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 "file_reader.h"
#include <limits.h>
#include <string.h>
#include <stdlib.h>
#include "file_reader.h"
static int range_processor(FILE *fp){
int min = INT_MAX;
int max = INT_MIN;
char buf[256] = {0};
int min = INT_MAX;
int max = INT_MIN;
char buf[256] = {0};
while((fgets(buf, sizeof(buf), fp)) != NULL){
if(buf[0] == '\r'){
printf("empty line\n");
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," ");
}
}
if(buf[0] == '\r'){
printf("empty line\n");
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," ");
}
}
return max - min;
}
}
int range(const char *pFname){
return read_file(pFname, range_processor);
}
return read_file(pFname, range_processor);
}
file_reader.h
#ifndef _FILE_READER_H_
#define _FILE_READER_H_
#define _FILE_READER_H_
#include <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif
extern "C" {
#endif
int read_file(const char* pFname, int(*processor)(FILE *fp));
#ifdef __cplusplus
}
#endif
}
#endif
#endif
file_reader.c
#include "file_reader.h"
int read_file(const char* pFname, int(*processor)(FILE *fp)){
FILE *fp = fopen(pFname, "r");
FILE *fp = fopen(pFname, "r");
if(fp == NULL)
return -1;
int ret = processor(fp);
return -1;
int ret = processor(fp);
fclose(fp);
return ret;
}
return ret;
}
range_test.c
#include <stdio.h>
#include "range.h"
#include "range.h"
int main(int argc, char const *argv[])
{
int ret = range("nums.txt");
printf("ret is %d\n", ret);
return 0;
}
{
int ret = range("nums.txt");
printf("ret is %d\n", ret);
return 0;
}
如上: 文件的打开和关闭操作集中在read_file中。
这样代码的可读性提高了,函数的功能也更加专一。
此例中 range_processor 可以被替代为其他的功能函数,谓之模板方法模式。例如:
int ret = sum("nums.txt");
int sum(const char *pFname){
return read_file(pFname, sum_processor);
}
return read_file(pFname, sum_processor);
}
static int sum_processor(FILE *fp){
int sum = 0;
char buf[256] = {0};
while((fgets(buf, sizeof(buf), fp)) != NULL){
if(buf[0] == '\r'){
printf("empty line\n");
return -1;
}
char *temp = strtok(buf," ");
while(temp != NULL){
int value = atoi(temp);
sum += value;
temp = strtok(NULL," ");
}
}
return sum;
}
int sum = 0;
char buf[256] = {0};
while((fgets(buf, sizeof(buf), fp)) != NULL){
if(buf[0] == '\r'){
printf("empty line\n");
return -1;
}
char *temp = strtok(buf," ");
while(temp != NULL){
int value = atoi(temp);
sum += value;
temp = strtok(NULL," ");
}
}
return sum;
}

浙公网安备 33010602011771号