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

简介: <div style="font-family:'Microsoft YaHei UI','Microsoft YaHei',SimSun,'Segoe UI',Tahoma,Helvetica,sans-serif,'Microsoft YaHei',Georgia,Helvetica,Arial,sans-serif,宋体,PMingLiU,serif; font-size:14.28
/*
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");
}


 
目录
相关文章
|
13天前
|
程序员 C语言
C语言库函数 — 内存函数(含模拟实现内存函数)
C语言库函数 — 内存函数(含模拟实现内存函数)
24 0
|
24天前
|
编译器 C语言 C++
【C语言】memset()函数(内存块初始化函数)
【C语言】memset()函数(内存块初始化函数)
26 0
|
24天前
|
编译器 C语言 C++
【C语言】memcpy()函数(内存块拷贝函数)
【C语言】memcpy()函数(内存块拷贝函数)
41 0
|
25天前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
67 0
|
1天前
|
编译器 C语言
字符串与内存函数
字符串与内存函数
10 0
|
4天前
|
存储 NoSQL Oracle
Oracle 12c的内存列存储:数据的“闪电侠”
【4月更文挑战第19天】Oracle 12c的内存列存储以超高速度革新数据处理,结合列存储与内存技术,实现快速查询与压缩。它支持向量化查询和并行处理,提升效率,但需合理配置以平衡系统资源。作为数据管理员,应善用此功能,适应业务需求和技术发展。
|
14天前
|
存储 C语言
数据在内存中的存储2
数据在内存中的存储2
|
14天前
|
存储 编译器
数据在内存中的存储1
数据在内存中的存储
|
24天前
|
编译器 C语言 C++
【C语言】calloc()函数详解(动态内存开辟函数)
【C语言】calloc()函数详解(动态内存开辟函数)
25 0

热门文章

最新文章