【C业务】按行读取文件并获取最大值和次大值

对一个文件实现按行读取数据,获取第二个字段的最大值以及次大值,以及各自对应的编号。

测试文件内容如下:

b5-00000001-00000303# 6
b5-00000001-00000404# 12
b5-00000001-00001003# 7
b4-00000001-00000904# 91
b5-00000001-00000a02# 1

实现代码:

#include "stdlib.h"
#include "stdio.h"
#include "string.h"
 
#define  LineMaxLen 1024*2
//需要求出多少行,按照行分配内存 
//在按行读文件,第二次分配内存,把结果copy到第二次分配的内存中
 
 
int readFile(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 readFile_Free(char **p, int lineNum)
{
	int i = 0;
	if (p==NULL)
	{
		return ;
	}
	for (i=0; i<lineNum; i++)
	{
		free(p[i]);
	}
	free(p);
}
  
void main()
{
	int ret = 0;
	char **p = NULL;
	const char *pfilename = "/home/nfs/test.log";
	int lineNum = 0, i = 0;
	char* str;
	int k = 0;
	int l = 0;
	int maxnum = 0;
	int secmaxnum = 0;
	int secmaxcnt = 0;
	int maxcnt = 0; 

	struct ECDistribut
	{
		int errstep;
		int errcode;
		int errnum;
	};
	struct ECDistribut ecd[100];
	
 
	ret = readFile(pfilename/*in*/, &p,  &lineNum/*in out*/);
	if (ret != 0)
	{
 
		return ;
	}

	for (i=0; i<lineNum-1; i++)
	{
		char a[2] = {0};
		strncpy(a,p[i],2);
		ecd[i].errstep = (int)strtol(a,&str,16);
		memset(a, 0, sizeof(a));

		char b[2] = {0};
		strncpy(b,p[i]+9,2);
		ecd[i].errcode = (int)strtol(b,&str,16);
		memset(a, 0, sizeof(a));

		ecd[i].errnum =  atoi(p[i]+21);
		if(ecd[i].errnum > maxnum)
		{
			secmaxnum = maxnum;
			secmaxcnt = maxcnt;
			maxnum = ecd[i].errnum;
			maxcnt = i;
		}
		if(secmaxnum < ecd[i].errnum && ecd[i].errnum <= maxnum && i != maxcnt)
		{
			secmaxnum = ecd[i].errnum;
			secmaxcnt = i;
		}
		
		printf("%d = %s", i, p[i]);
	}
	printf("%d ", maxcnt);
	printf("%d ", maxnum);
	printf("%d  ", ecd[k].errstep);
	printf("%d  ", ecd[k].errcode);
	printf("\n");
	printf("%d ", secmaxcnt);
	printf("%d ", secmaxnum);
	printf("%d  ", ecd[l].errstep);
	printf("%d  ", ecd[l].errcode);
 
	readFile_Free(p, lineNum);
	return;
}

输出结果:

0 = b5-00000001-00000303#	6
1 = b5-00000001-00000404#	12
2 = b5-00000001-00001003#	7
3 = b4-00000001-00000904#	91
4 = b5-00000001-00000a02#	1
3 91 181  1  
1 12 181  1  

参考连接:C语言实现按行读取文件

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值