/*
2 编写一个业务函数,实现按行读取文件。把内容按照第三种内存模型打包数据传出,把行数通过函数参数传出。
函数原型有两个,任意选择其一
要求1:请自己任意选择一个接口(函数),并实现功能;70分
要求2:编写测试用例。30分
要求3:自己编写内存释放函数
*/
/********************************************************************** * 版权所有 (C)2015, Wu Yingqiang。 * * 文件名称:ReadFile.c * 文件标识:无 * 内容摘要:利用二级指针,按行读取文件 * 其它说明:无 * 当前版本: V1.0 * 作 者: Wu Yingqiang * 完成日期: 20150112 * **********************************************************************/ #define _CRT_SECURE_NO_WARNINGS #include "stdlib.h" #include "stdio.h" #include "string.h" #define LineMaxLen 1024*2 //每行最大的字符个数 /********************************************************************** * 功能描述:将文件的内容读取到内存中 * 输入参数:pfilename-文件名称,全路径;lineNum--文件的行数 * 输出参数:lineNum--文件的行数 * 返 回 值:文件内容在内存中的首地址 * 其它说明:无 * 修改日期 版本号 修改人 修改内容 * ------------------------------------------------------------------- * 20150112 V1.0 Wu Yingqiang 创建 ***********************************************************************/ char **ReadFile(const char *pfilename/*in*/, int *lineNum/*in out*/) { int rv = 0, tmplineNum = 0; FILE *fp = NULL; char lineBuf[LineMaxLen]; char *pTmp = NULL; char **tmpFile = NULL; if (pfilename == NULL || lineNum == NULL) { rv = -1; printf("ReadFile() err. param err \n"); goto End; } fp = fopen(pfilename, "r"); if (fp == NULL) { rv = -2; printf("fopen() err. \n"); goto End; } //第一遍读出多少行 while (!feof(fp)) { //读每一行 memset(lineBuf, 0, sizeof(lineBuf)); pTmp = fgets(lineBuf, LineMaxLen, fp); if (pTmp == NULL) { continue; } else { tmplineNum++; } } tmpFile = (char **)malloc((tmplineNum + 1)*sizeof(char *)); if (tmpFile == NULL) { goto End; } //第二遍读内容 //准备环境 tmplineNum = 0; fseek(fp, 0L, SEEK_SET); while (!feof(fp)) { //读每一行 memset(lineBuf, 0, sizeof(lineBuf)); pTmp = fgets(lineBuf, LineMaxLen, fp); if (pTmp == NULL) { continue; } else { int tmplen = strlen(lineBuf); tmpFile[tmplineNum] = (char *)malloc((tmplen + 1)*sizeof(char)); if (tmpFile[tmplineNum] == NULL) { goto End; } strcpy(tmpFile[tmplineNum], lineBuf); //printf("%s", lineBuf); tmplineNum++; } } End: if (fp != NULL) { fclose(fp); } *lineNum = tmplineNum; return tmpFile; } /********************************************************************** * 功能描述:释放文件内容在内存中的内存 * 输入参数:p--文件内容在内存中的首地址,lineNUm--文件的行数 * 输出参数:无 * 返 回 值:无 * 其它说明:无 * 修改日期 版本号 修改人 修改内容 * ------------------------------------------------------------------- * 20150112 V1.0 Wu Yingqiang 创建 ***********************************************************************/ void ReadFileFree(char **p, int lineNUm) { int i = 0; if (p == NULL) { return; } for (i = 0; i<lineNUm; i++) { free(p[i]); } free(p); } /********************************************************************** * 功能描述:主函数 * 输入参数:无 * 输出参数:无 * 返 回 值:无 * 其它说明:无 * 修改日期 版本号 修改人 修改内容 * ------------------------------------------------------------------- * 20150112 V1.0 Wu Yingqiang 创建 ***********************************************************************/ void main() { char **p = NULL; const char *pfilename = "e:/1.txt";//E:\\1.txt int lineNum = 0, i = 0; p = ReadFile(pfilename/*in*/, &lineNum/*in out*/); if (p == NULL) { return; } for (i = 0; i<lineNum; i++) { printf("%s", p[i]); } ReadFileFree(p, lineNum); system("pause"); }