/* 题目58: 编写一个业务函数,实现按行读取文件。把内容按照第三种内存模型打包数据传出,把行数通过函数参数传出。 函数原型有两个,任意选择其一 要求1:请自己任意选择一个接口(函数),并实现功能;70分 要求2:编写测试用例。30分 要求3:自己编写内存释放函数 */ #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> //按行读取文件 int ReadFile(const char *path/*in*/,char ***pout/*out*/,int *row){ int ERRO_MSG = 0; if (path == NULL || pout == NULL || row==NULL) { ERRO_MSG = 1; printf("", ERRO_MSG); return ERRO_MSG; } //定义文件行数 int index = 1; //定义二维数组 char **parr1 = (char **)malloc(sizeof(char *)*index); memset(parr1, 0, sizeof(sizeof(char *)*index)); if (parr1==NULL) { ERRO_MSG = 2; printf("分配内存失败 erro msg:%d\n", ERRO_MSG); return ERRO_MSG; } //定义文件指针 FILE *pfr = NULL; //打开文件 pfr = fopen(path, "r"); if (pfr == NULL) { ERRO_MSG = 3; printf("打开文件失败 文件路径是%s; erro msg:%d\n",path, ERRO_MSG); return ERRO_MSG; } while (!feof(pfr)){ //定义缓存数组 char *buf = (char *)malloc(sizeof(char)* 100); if (buf==NULL) { ERRO_MSG = 5; printf("分配内存失败 erro msg:%d\n", ERRO_MSG); goto FileEND; } memset(buf, 0, sizeof(char)* 100); //fgets()读取的数据保存在buf指向的字符数组中,每次最多读取bufsize-1个字符(第bufsize个字符赋'\0') char *pflag= fgets(buf, 100, pfr); //ferror()函数:获取文件流状态,如果ferror返回值为0(假),表示未出错。如果返回一个非零值,表示出错。 if (pflag == NULL || ferror(pfr)) { ERRO_MSG = 4; //重置文件流状态,清除错误信号 clearerr(pfr); //注:如果不重置文件流状态,那么下次读取该文件正确状态仍然会报这个错误 printf("按行读取文件失败 erro msg:%d\n", path, ERRO_MSG); goto FileEND; } //数据加入二维数组 parr1[index - 1] = buf; index++; //重新分配内存空间 parr1 = (char **)realloc(parr1, sizeof(char *)*index); } FileEND: //关闭文件指针 if (pfr!=NULL) { fclose(pfr); pfr = NULL; } //二维数组最后一个元素置零 parr1[index - 1] = NULL; *pout = parr1; *row = index - 1; return ERRO_MSG; } //打印数据 void PeintfA(char **pin/*in*/){ if (pin==NULL) { printf("二维数组指针为空\n"); } printf("以下是读取的数据\n"); while (*pin){ printf("%s\n", *pin); pin++; } } //释放内存 int FreeAll(char ***pin/*in*/){ int ERRO_MSG = 0; if (pin == NULL) { ERRO_MSG = 1; printf("", ERRO_MSG); return ERRO_MSG; } char **ptemp = *pin; while (*ptemp){ free(*ptemp); *ptemp = NULL; ptemp++; } //报错:触发了一个断点 //原因:ptemp指针移动位置了 if (*pin != NULL) { free(*pin); *pin = NULL; } return ERRO_MSG; } void main(){ char *path = "E:/Look/a.txt"; //定义返回数组 char **pres = NULL; //定义返回行 测试参数 int row = 0,ret=0; ret = ReadFile(path, &pres, &row); if (ret!=0) { printf("读取文件出错\n"); goto END; } //打印文件 PeintfA(pres); END: FreeAll(&pres); system("pause"); }