对一个文件实现按行读取数据,获取第二个字段的最大值以及次大值,以及各自对应的编号。
测试文件内容如下:
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语言实现按行读取文件