/*
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");
}