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

/*
2 编写一个业务函数,实现按行读取文件。把内容按照第三种内存模型打包数据传出,把行数通过函数参数传出。
函数原型有两个,任意选择其一
要求1:请自己任意选择一个接口(函数),并实现功能;70分
要求2:编写测试用例。30分
要求3:自己编写内存释放函数
*/

#include "stdlib.h"
#include "stdio.h"
#include "string.h"

#define  LineMaxLen 1024*2
//需要求出多少行,按照行分配内存 
//在按行读文件,第二次分配内存,把结果copy到第二次分配的内存中

char **readFile1(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("readFile1() 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;
}

int readFile2(const char *pfilename/*in*/, char ***p/*out*/, int *lineNum/*int 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("readFile1() 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;
	*p = tmpFile;
	return 0;

}

void readFile2_Free(char **p, int lineNUm)
{
	int i = 0;
	if (p==NULL)
	{
		return ;
	}
	for (i=0; i<lineNUm; i++)
	{
		free(p[i]);
	}
	free(p);
}

void main21()
{
	char **p = NULL;
	const char *pfilename = "c:/1.txt";
	int lineNum = 0, i = 0;


	p = readFile1(pfilename/*in*/,  &lineNum/*in out*/);
	if (p == NULL)
	{
		return ;
	}

	for (i=0; i<lineNum; i++)
	{
		printf("%s", p[i]);
	}

	readFile2_Free(p, lineNum);
	
	system("pause");
}

void main()
{
	int ret = 0;
	char **p = NULL;
	const char *pfilename = "c:/1.txt";
	int lineNum = 0, i = 0;

	ret = readFile2(pfilename/*in*/, &p,  &lineNum/*in out*/);
	if (ret != 0)
	{

		return ;
	}

	for (i=0; i<lineNum; i++)
	{
		printf("%s", p[i]);
	}

	readFile2_Free(p, lineNum);

	system("pause");
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值