实现按行读取文件,把内容按照第三种内存模型打包数据传出,把行数通过函数参数传出。

来源:互联网 发布:开微店还是开淘宝店好 编辑:程序博客网 时间:2024/09/21 09:04
/*
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.txtint 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");}


0 0
原创粉丝点击