linux下生成源程序控制流图,Linux下控制(统计)文件的生成的C代码实现

本文分享了Linux下控制(统计)文件的生成的C代码实现案例,供大家参考,具体内容如下

一、需求描述不定时地在Linux机器下的某目录中放入文件,文件内容中包含了用户号码、起止时间等字段,现要求编写一程序来统计目前该目录中所有文件中的记录总条数及所有记录中的最早起始时间和最晚结束时间。

例如,该目录中有两个文件Test_1.txt和Test_2.txt,其中Test_1.txt文件内容为:

15696192591|15696192592|20151103 120909|20151103 201545|

15696192593|15696192594|20151103 110909|20151103 191545|

02344273522|02344273523|20160108 110909|20160109 091545|

Test_2.txt文件内容为:

15696192595|15696192596|20151102 120909|20151104 201545|

15696192597|15696192598|20151101 110909|20151103 191545|

即文件中的每条记录的格式为:呼叫号码|被呼叫号码|呼叫起始时间|呼叫结束时间|,要求生成的控制文件CtlFile.txt的内容为:

20151101 110909|20160109 091545|5|

即Test_1.txt和Test_2.txt两个文件中五条记录的开始时间的最小值为“20151101 110909”,结束时间的最大值为“20160109 091545”,目前共处理了5条记录。也就是说,控制文件的格式为:呼叫起始时间最小值|呼叫结束时间最大值|记录总条数|。

二、程序代码

本程序一共包括了三个代码文件:main.c、CtlFileCreate.c和CtlFileCreate.h,具体代码如下:

main.c

/**********************************************************************

* 版权所有 (C)2016, Zhou Zhaoxiong。

*

* 文件名称:CtlFileCreate.c

* 文件标识:无

* 内容摘要:目录中文件的读取及控制文件的生成

* 其它说明:无

* 当前版本:V1.0

* 完成日期:20160109

*

**********************************************************************/

#include "CtlFileCreate.h"

/**********************************************************************

* 功能描述:主函数

* 输入参数:无

* 输出参数:无

* 返 回 值:无

* 其它说明:无

* 修改日期 版本号 修改人 修改内容

* -------------------------------------------------------------------

* 20160109 V1.0 Zhou Zhaoxiong 创建

***********************************************************************/

INT32 main()

{

ReadCtlFile(); // 获取控制文件存放路径、控制文件全路径名及文件内容字段值

ReadSrcFileAndWriteCtlFile(); // 扫描源文件目录, 并写控制文件

return 0;

}

CtlFileCreate.h

/**********************************************************************

* 版权所有 (C)2015, Zhou Zhaoxiong。

*

* 文件名称:CtlFileCreate.h

* 文件标识:无

* 内容摘要:目录中文件的读取及控制文件的生成

* 其它说明:无

* 当前版本:V1.0

* 完成日期:20151102

*

**********************************************************************/

#include

#include

#include

#include

// 数据类型重定义

typedef unsigned char UINT8;

typedef unsigned short int UINT16;

typedef unsigned int UINT32;

typedef signed int INT32;

typedef unsigned char BOOL;

// 参数类型

#define MML_INT8_TYPE 0

#define MML_INT16_TYPE 1

#define MML_INT32_TYPE 2

#define MML_STR_TYPE 3

#define TRUE (BOOL)1

#define FALSE (BOOL)0

// 字段最大长度

#define MAX_RET_BUF_LEN 1024

// 源文件字段结构体

typedef struct

{

UINT8 szSrcNumber[50];

UINT8 szDstNumber[50];

UINT8 szDataStartTime[50];

UINT8 szDataEndTime[50];

} T_SrcFileContent;

// 函数声明

void Sleep(UINT32 iCountMs);

void ReadCtlFile(void);

void ReadSrcFileAndWriteCtlFile(void);

void GetSrcFileContentAndWriteCtlFile(UINT8 *pszSrcFileName);

void GetSrcFileFieldValue(UINT8 *pszContentLine, T_SrcFileContent *ptSrcFileContent);

void GetCtlFileContentAndWrite(T_SrcFileContent *ptSrcFileContent, UINT8 *pszContentBuffer);

BOOL GetValueFromStr(UINT16 iSerialNum, UINT8 iContentType, UINT8 *pSourceStr, UINT8 *pDstStr, UINT8 cIsolater, UINT32 iDstStrSize);

void RemoveLineEnd(UINT8 *pszStr);

void WriteToCtlFile(UINT8 *pszContentLine);

CtlFileCreate.c

/**********************************************************************

* 版权所有 (C)2015, Zhou Zhaoxiong。

*

* 文件名称:CtlFileCreate.c

* 文件标识:无

* 内容摘要:目录中文件的读取及控制文件的生成

* 其它说明:无

* 当前版本:V1.0

* 完成日期:20151102

*

**********************************************************************/

#include "CtlFileCreate.h"

// 全局变量

UINT8 g_szSourceDir[500] = {0}; // 需扫描的源目录

UINT8 g_szCtlFileDir[500] = {0}; // 生成的控制文件的存放目录

UINT8 g_szSourceBakDir[500] = {0}; // 处理之后的源文件的备份目录

UINT8 g_szCtlFileName[256] = {0}; // 控制文件全路径名

UINT8 g_szDataStartTime[50] = {0}; // 所有源文件中数据记录的最早开始时间

UINT8 g_szDataEndTime[50] = {0}; // 所有源文件中数据记录的最晚结束时间

UINT32 g_iRecordsSum = 0; // 已处理的记录的总条数

/**********************************************************************

* 功能描述: 读取控制文件中的开始时间、结束时间和记录条数

* 输入参数: 无

* 输出参数: 无

* 返 回 值: 无

* 其它说明: 无

* 修改日期 版本号 修改人 修改内容

* ------------------------------------------------------------------

* 20151102 V1.0 Zhou Zhaoxiong 创建

********************************************************************/

void ReadCtlFile(void)

{

UINT8 *pszHomePath = NULL;

FILE *fpCtlFile = NULL;

UINT8 szBuf[500] = {0};

// 读取控制文件中的开始时间、结束时间和记录条数, 如果是当天程序重启, 则记录条数继续编号

pszHomePath = getenv("HOME");

if (pszHomePath == NULL)

{

return;

}

snprintf(g_szCtlFileDir, sizeof(g_szCtlFileDir)-1, "%s/zhouzhaoxiong/zzx/CtlFileCreate/CtlFile", pszHomePath); // 控制文件存放目录

snprintf(g_szCtlFileName, sizeof(g_szCtlFileName)-1, "%s/CtlFile.txt", g_szCtlFileDir); // 控制文件全路径名

fpCtlFile = fopen(g_szCtlFileName, "r");

if (fpCtlFile != NULL)

{

fgets(szBuf, sizeof(szBuf), fpCtlFile);

// 获取开始时间g_szDataStartTime

if (TRUE != GetValueFromStr(1, MML_STR_TYPE, szBuf, g_szDataStartTime, '|', sizeof(g_szDataStartTime)))

{

printf("ReadCtlFile: exec GetValueFromStr to get g_szDataStartTime failed!\n");

return;

}

// 获取结束时间g_szDataEndTime

if (TRUE != GetValueFromStr(2, MML_STR_TYPE, szBuf, g_szDataEndTime, '|', sizeof(g_szDataEndTime)))

{

printf("ReadCtlFile: exec GetValueFromStr to get g_szDataEndTime failed!\n");

return;

}

// 获取记录条数g_iRecordsSum

if (TRUE != GetValueFromStr(3, MML_INT32_TYPE, szBuf, (UINT8 *)&g_iRecordsSum, '|', sizeof(g_iRecordsSum)))

{

printf("ReadCtlFile: exec GetValueFromStr to get g_iRecordsSum failed!\n");

return;

}

fclose(fpCtlFile);

fpCtlFile = NULL;

printf("ReadCtlFile: DataStartTime=%s, DataEndTime=%s, RecordsSum=%d\n", g_szDataStartTime, g_szDataEndTime, g_iRecordsSum);

}

}

/**********************************************************************

* 功能描述: 扫描源文件目录, 并写控制文件

* 输入参数: 无

* 输出参数: 无

* 返 回 值: 无

* 其它说明: 无

* 修改日期 版本号 修改人 修改内容

* ------------------------------------------------------------------

* 20151102 V1.0 Zhou Zhaoxiong 创建

********************************************************************/

void ReadSrcFileAndWriteCtlFile(void)

{

UINT8 *pszHomePath = NULL;

UINT8 szCommandBuf[500] = {0};

UINT8 szSrcFile[500] = {0};

DIR *pDir = NULL;

struct dirent *pDirent = NULL;

pszHomePath = getenv("HOME");

if (pszHomePath == NULL)

{

return;

}

snprintf(g_szSourceDir, sizeof(g_szSourceDir)-1, "%s/zhouzhaoxiong/zzx/CtlFileCreate/SrcFile", pszHomePath); // 源文件存放目录

snprintf(g_szSourceBakDir, sizeof(g_szSourceBakDir)-1, "%s/zhouzhaoxiong/zzx/CtlFileCreate/SrcFile_bak", pszHomePath); // 源文件备份目录

while (1)

{

pDir = opendir(g_szSourceDir);

if (NULL == pDir)

{

printf("ReadSrcFileAndWriteCtlFile: pDir is NULL!\n");

continue;

}

while ((pDirent = readdir(pDir)) != NULL) // 扫描源目录, 获取文件名

{

if (strncmp(pDirent->d_name, "Test_", strlen("Test_")) == 0) // 如果匹配上了源文件的前缀, 则读取文件内容并写控制文件

{

memset(szSrcFile, 0x00, sizeof(szSrcFile));

snprintf(szSrcFile, sizeof(szSrcFile)-1, "%s/%s", g_szSourceDir, pDirent->d_name, g_szSourceBakDir);

GetSrcFileContentAndWriteCtlFile(szSrcFile); // 获取源文件中的内容, 并写控制文件

// 处理完成之后, 将文件剪切到备份目录中

memset(szCommandBuf, 0x00, sizeof(szCommandBuf));

snprintf(szCommandBuf, sizeof(szCommandBuf)-1, "mv %s %s", szSrcFile, g_szSourceBakDir);

system(szCommandBuf);

printf("ReadSrcFileAndWriteCtlFile: now, move %s to %s\n", pDirent->d_name, g_szSourceBakDir);

}

}

closedir(pDir);

pDir = NULL;

Sleep(60 * 1000); // 每1分钟扫描一次

}

}

/**********************************************************************

* 功能描述: 获取源文件中的内容, 并写控制文件

* 输入参数: pszSrcFileName-带路径的源文件名

* 输出参数: 无

* 返 回 值: 无

* 其它说明: 无

* 修改日期 版本号 修改人 修改内容

* ------------------------------------------------------------------

* 20151102 V1.0 Zhou Zhaoxiong 创建

********************************************************************/

void GetSrcFileContentAndWriteCtlFile(UINT8 *pszSrcFileName)

{

FILE *fp = NULL;

UINT8 szContentLine[1024] = {0};

T_SrcFileContent tSrcFileContent = {0};

if (pszSrcFileName == NULL)

{

printf("GetSrcFileContentAndWriteCtlFile: pDir is NULL!\n");

return;

}

if ((fp = fopen(pszSrcFileName, "r")) == NULL) // 只读方式打开

{

printf("GetSrcFileContentAndWriteCtlFile: open src file failed!\n");

return;

}

else

{

while (feof(fp) == 0 && ferror(fp) == 0)

{

// 每行对应一条源文件记录

memset(szContentLine, 0x00, sizeof(szContentLine));

if (fgets(szContentLine, sizeof(szContentLine), fp) == NULL)

{

printf("GetSrcFileContentAndWriteCtlFile: exec fgets to get line null.\n");

}

else

{

printf("GetSrcFileContentAndWriteCtlFile: get content line: %s\n", szContentLine);

}

RemoveLineEnd(szContentLine); // 去掉字符串后面的回车换行符

if (strlen(szContentLine) == 0) // 如果为空行, 则继续处理下一条

{

printf("GetSrcFileContentAndWriteCtlFile: the length of ContentLine is 0, continue.\n");

continue;

}

GetSrcFileFieldValue(szContentLine, &tSrcFileContent); // 获取一条记录中各个字段的值

memset(szContentLine, 0x00, sizeof(szContentLine));

GetCtlFileContentAndWrite(&tSrcFileContent, szContentLine); // 组装写入控制文件中的内容

WriteToCtlFile(szContentLine); // 将内容写到控制文件中

}

fclose(fp);

fp = NULL;

}

}

/**********************************************************************

* 功能描述: 组装写入控制文件中的内容

* 输入参数: ptSrcFileContent-源文件中一条记录中各个字段的值

* 输出参数: pszContentBuffer-存放内容的缓存

* 返 回 值: 无

* 其它说明: 控制文件中记录为: DataStartTime|DataEndTime|RecordsSum|

* 修改日期 版本号 修改人 修改内容

* ------------------------------------------------------------------

* 20151102 V1.0 Zhou Zhaoxiong 创建

********************************************************************/

void GetCtlFileContentAndWrite(T_SrcFileContent *ptSrcFileContent, UINT8 *pszContentBuffer)

{

UINT8 szContentLine[500] = {0};

if (ptSrcFileContent == NULL || pszContentBuffer == NULL)

{

printf("GetCtlFileContentAndWrite: ptSrcFileContent or pszContentBuffer is NULL!\n");

return;

}

// 根据值的大小对g_szDataStartTime进行赋值

if (strlen(g_szDataStartTime) == 0) // 当天第一条

{

strncpy(g_szDataStartTime, ptSrcFileContent->szDataStartTime, strlen(ptSrcFileContent->szDataStartTime));

}

else

{

if (strncmp(g_szDataStartTime, ptSrcFileContent->szDataStartTime, strlen(ptSrcFileContent->szDataStartTime)) > 0) // 修改成最小时间

{

memset(g_szDataStartTime, 0x00, sizeof(g_szDataStartTime));

strncpy(g_szDataStartTime, ptSrcFileContent->szDataStartTime, strlen(ptSrcFileContent->szDataStartTime));

}

}

// 根据值的大小对g_szDataEndTime进行赋值

if (strlen(g_szDataEndTime) == 0) // 当天第一条

{

strncpy(g_szDataEndTime, ptSrcFileContent->szDataEndTime, strlen(ptSrcFileContent->szDataEndTime));

}

else

{

if (strncmp(g_szDataEndTime, ptSrcFileContent->szDataEndTime, strlen(ptSrcFileContent->szDataEndTime)) < 0) // 修改成最大时间

{

memset(g_szDataEndTime, 0x00, sizeof(g_szDataEndTime));

strncpy(g_szDataEndTime, ptSrcFileContent->szDataEndTime, strlen(ptSrcFileContent->szDataEndTime));

}

}

// 记录总条数加1

g_iRecordsSum = g_iRecordsSum + 1; // 当天所有记录的总条数加1

// 打印三个字段的内容

printf("GetCtlFileContentAndWrite: DataStartTime is %s, DataEndTime is %s, RecordsSum is %d\n", g_szDataStartTime, g_szDataEndTime, g_iRecordsSum);

// 组装写到控制文件中的消息内容

snprintf(szContentLine, sizeof(szContentLine)-1, "%s|%s|%d|", g_szDataStartTime, g_szDataEndTime, g_iRecordsSum);

printf("GetCtlFileContentAndWrite: ContentLine is %s\n", szContentLine);

strncpy(pszContentBuffer, szContentLine, strlen(szContentLine));

}

/**********************************************************************

* 功能描述: 获取源文件中的各个字段的值

* 输入参数: pszContentLine-一条记录

* 输出参数: ptSrcFileContent-源文件中一条记录中各个字段的值

* 返 回 值: 无

* 其它说明: 源文件中每条记录的格式为: SrcNumber|DstNumber|DataStartTime|DataEndTime|

* 修改日期 版本号 修改人 修改内容

* ------------------------------------------------------------------

* 20151102 V1.0 Zhou Zhaoxiong 创建

********************************************************************/

void GetSrcFileFieldValue(UINT8 *pszContentLine, T_SrcFileContent *ptSrcFileContent)

{

if (pszContentLine == NULL || ptSrcFileContent == NULL)

{

printf("GetSrcFileFieldValue: ContentLine or SrcFileContent is NULL!\n");

return;

}

// 获取源号码

if (TRUE != GetValueFromStr(1, MML_STR_TYPE, pszContentLine, ptSrcFileContent->szSrcNumber, '|', sizeof(ptSrcFileContent->szSrcNumber)))

{

printf("GetSrcFileFieldValue: exec GetValueFromStr to get szSrcNumber failed!\n");

return;

}

// 获取目的号码

if (TRUE != GetValueFromStr(2, MML_STR_TYPE, pszContentLine, ptSrcFileContent->szDstNumber, '|', sizeof(ptSrcFileContent->szDstNumber)))

{

printf("GetSrcFileFieldValue: exec GetValueFromStr to get szDstNumber failed!\n");

return;

}

// 获取开始时间

if (TRUE != GetValueFromStr(3, MML_STR_TYPE, pszContentLine, ptSrcFileContent->szDataStartTime, '|', sizeof(ptSrcFileContent->szDataStartTime)))

{

printf("GetSrcFileFieldValue: exec GetValueFromStr to get szDataStartTime failed!\n");

return;

}

// 获取结束时间

if (TRUE != GetValueFromStr(4, MML_STR_TYPE, pszContentLine, ptSrcFileContent->szDataEndTime, '|', sizeof(ptSrcFileContent->szDataEndTime)))

{

printf("GetSrcFileFieldValue: exec GetValueFromStr to get szDataEndTime failed!\n");

return;

}

printf("GetSrcFileFieldValue: SrcNumber=%s, DstNumber=%s, DataStartTime=%s, DataEndTime=%s\n", ptSrcFileContent->szSrcNumber, ptSrcFileContent->szDstNumber,

ptSrcFileContent->szDataStartTime, ptSrcFileContent->szDataEndTime);

}

/**********************************************************************

* 功能描述: 程序休眠

* 输入参数: iCountMs-休眠时间(单位:ms)

* 输出参数: 无

* 返 回 值: 无

* 其它说明: 无

* 修改日期 版本号 修改人 修改内容

* ------------------------------------------------------------------

* 20151102 V1.0 Zhou Zhaoxiong 创建

********************************************************************/

void Sleep(UINT32 iCountMs)

{

struct timeval t_timeout = {0};

if (iCountMs < 1000)

{

t_timeout.tv_sec = 0;

t_timeout.tv_usec = iCountMs * 1000;

}

else

{

t_timeout.tv_sec = iCountMs / 1000;

t_timeout.tv_usec = (iCountMs % 1000) * 1000;

}

select(0, NULL, NULL, NULL, &t_timeout); // 调用select函数阻塞程序

}

/**********************************************************************

*功能描述:获取字符串中某一个字段的值

*输入参数:iSerialNum-字段编号(为正整数)

iContentType-需要获取的内容的类型

pSourceStr-源字符串

pDstStr-目的字符串(提取的值的存放位置)

cIsolater-源字符串中字段的分隔符

iDstStrSize-目的字符串的长度

*输出参数:无

*返 回 值:TRUE-成功 FALSE-失败

*其它说明:无

*修改日期 版本号 修改人 修改内容

* --------------------------------------------------------------

* 20151102 V1.0 Zhou Zhaoxiong 创建

***********************************************************************/

BOOL GetValueFromStr(UINT16 iSerialNum, UINT8 iContentType, UINT8 *pSourceStr, UINT8 *pDstStr, UINT8 cIsolater, UINT32 iDstStrSize)

{

UINT8 *pStrBegin = NULL;

UINT8 *pStrEnd = NULL;

UINT8 szRetBuf[MAX_RET_BUF_LEN] = {0}; // 截取出的字符串放入该数组中

UINT8 *pUINT8 = NULL;

UINT16 *pUINT16 = NULL;

UINT32 *pUINT32 = NULL;

UINT32 iFieldLen = 0; // 用于表示每个字段的实际长度

if (pSourceStr == NULL) // 对输入指针的异常情况进行判断

{

return FALSE;

}

//字段首

pStrBegin = pSourceStr;

while (--iSerialNum != 0)

{

pStrBegin = strchr(pStrBegin, cIsolater);

if (pStrBegin == NULL)

{

return FALSE;

}

pStrBegin ++;

}

//字段尾

pStrEnd = strchr(pStrBegin, cIsolater);

if (pStrEnd == NULL)

{

return FALSE;

}

iFieldLen = (UINT16)(pStrEnd - pStrBegin);

if(iFieldLen >= MAX_RET_BUF_LEN) //进行异常保护, 防止每个字段的值过长

{

iFieldLen = MAX_RET_BUF_LEN - 1;

}

memcpy(szRetBuf, pStrBegin, iFieldLen);

//将需要的字段值放到pDstStr中去

switch (iContentType)

{

case MML_STR_TYPE: //字符串类型

{

strncpy(pDstStr, szRetBuf, iDstStrSize);

break;

}

case MML_INT8_TYPE: //字符类型

{

pUINT8 = (UINT8 *)pDstStr;

*pDstStr = (UINT8)atoi(szRetBuf);

break;

}

case MML_INT16_TYPE: // short int类型

{

pUINT16 = (UINT16 *)pDstStr;

*pUINT16 = (UINT16)atoi(szRetBuf);

break;

}

case MML_INT32_TYPE: // int类型

{

pUINT32 = (UINT32 *)pDstStr;

*pUINT32 = (UINT32)atoi(szRetBuf);

break;

}

default: // 一定要有default分支

{

return FALSE;

}

}

return TRUE;

}

/**********************************************************************

* 功能描述: 去掉字符串后面的回车换行符

* 输入参数: pszStr-输入的字符串

* 输出参数: 无

* 返 回 值: 无

* 其它说明: 无

* 修改日期 版本号 修改人 修改内容

* ------------------------------------------------------------------

* 20151102 V1.0 Zhou Zhaoxiong 创建

********************************************************************/

void RemoveLineEnd(UINT8 *pszStr)

{

UINT32 iStrLen = 0;

if (pszStr == NULL)

{

printf("RemoveLineEnd: pszStr is NULL!\n");

return;

}

iStrLen = strlen(pszStr);

while (iStrLen > 0)

{

if (pszStr[iStrLen-1] == '\n' || pszStr[iStrLen-1] == '\r')

{

pszStr[iStrLen-1] = '\0';

}

else

{

break;

}

iStrLen --;

}

return;

}

/**********************************************************************

* 功能描述: 把内容写到控制文件中

* 输入参数: pszContentLine-一条文件记录

* 输出参数: 无

* 返 回 值: 无

* 其它说明: 无

* 修改日期 版本号 修改人 修改内容

* ------------------------------------------------------

* 20151103 V1.0 Zhou Zhaoxiong 创建

***********************************************************************/

void WriteToCtlFile(UINT8 *pszContentLine)

{

FILE *fpCtlFile = NULL;

if (pszContentLine == NULL)

{

printf("WriteToCtlFile: pszContentLine is NULL.\n");

return;

}

fpCtlFile = fopen(g_szCtlFileName, "w");

if (fpCtlFile != NULL)

{

fputs(pszContentLine, fpCtlFile);

fclose(fpCtlFile);

fpCtlFile = NULL;

printf("WriteToCtlFile: write ctl file successfully! file=%s, content=%s\n", g_szCtlFileName, pszContentLine);

}

else

{

printf("WriteToCtlFile: write ctl file failed! file=%s, content=%s\n", g_szCtlFileName, pszContentLine);

}

}

三、程序编译及运行

将程序代码上传到Linux机器上,并在当前用户的zhouzhaoxiong/zzx/CtlFileCreate/SrcFile目录下上传一些满足命名规范的源文件,然后使用“gcc -g -o CtlFileCreate main.c CtlFileCreate.c”命令对程序进行编译,生成“CtlFileCreate”文件;接着运行“CtlFileCreate”命令,可以看到在当前用户的zhouzhaoxiong/zzx/CtlFileCreate/CtlFile目录下有控制文件生成,在当前用户的zhouzhaoxiong/zzx/CtlFileCreate/SrcFile_bak目录下有源文件的备份文件生成。

查看控制文件内容,里面记录的就是当前所处理的所有文件中的记录总条数及所有记录中的呼叫起始时间最小值和呼叫结束时间最大值。

四、程序说明第一,为了便于说明,在本程序中,源文件的前缀是“Test_”,控制文件命名为“CtlFile.txt”。在实际的开发中,大家完全可以通过配置项来决定源文件及控制文件的命名规则。

第二,为了防止源文件被重复处理,当某个源文件处理完成之后,会被剪切到备份目录中。这样做也是为了方便之后校对控制文件中的内容。

第三,在读取文件中的第一条记录时,将该条记录中的呼叫起始时间和呼叫结束时间分别存放到两个全局变量中,并按照格式写控制文件;在读取该文件中的其他记录时,首先将该条记录中的呼叫起始时间和呼叫结束时间与全局变量进行比较,确保全局变量中存放的是呼叫起始时间最小值和呼叫结束时间最大值,记录总条数加1,并将新的记录内容写入到控制文件中。

第四,在处理完当前目录下的所有文件之后,程序会休眠一段时间,然后继续扫描目录。在实际的开发中,休眠间隔也是可以配置的。

以上就是本文的全部内容,希望对大家的学习有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263755.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SharePoint Online 创建门户网站系列之首页布局

前 言 SharePoint Online中创建首页布局&#xff0c;一般都是首先将美工提供的效果图&#xff0c;切图成为Html Css Script的形式&#xff0c;然后&#xff0c;将所有资源文件传到SharePoint Online的资源库&#xff0c;在Designer中创建页面&#xff0c;添加Html页面&#x…

Android 3.0细节曝光:Google程序更耀眼

来源&#xff1a;腾讯科技 发布者&#xff1a;腾讯科技 Phandroid 网站今天披露了Android 3.0&#xff08;Gingerbread&#xff09;的一些细节。新系统仍在开发之中&#xff0c;不过有些 Google 员工已经在自己的 Nexus One 上安装了 Android 3.0&#xff0c;下面是一张模糊到…

2014技术总结

2014年,毕业的第四年,技术感觉遇到了瓶颈。整天只会写写crud.偶尔写写其他语言的hello world.写写博客,聊以安慰。 新公司,新契机 公司NLNDIDEeclipseeclipse/ideaJDK57jsjqueryknockoutjs开发框架ssh(spring2.5hibernate3)sh(spring4hibernate5)代码管理svngitmaven项目管理do…

解决无法将java项目部署到tomcat中去

project facets java转成web项目 用Eclipse开发项目的时候&#xff0c;把一个Web项目导入到Eclipse里会变成了一个Java工程&#xff0c;将无法在Tomcat中进行部署运行。 方法&#xff1a; 1.找到.project文件&#xff0c;找到里面的<natures>标签&#xff0c;查看是否有下…

linux查看fcsan设备,fc-san存储

对象存储服务 OBS对象存储服务(Object Storage Service)是一款稳定、安全、高效、易用的云存储服务&#xff0c;具备标准Restful API接口&#xff0c;可存储任意数量和形式的非结构化数据对象存储服务 OBS对象存储服务(Object Storage Service)是一款稳定、安全、高效、易用的云…

VC6安装错误——Error Launching acmboot.exe

因项目需要&#xff0c;我需要安装Microsoft Visual C Professional Version 6 SP5。但是在安装时运行安装目录下的setup.exe&#xff0c;出现Error Launching acmboot.exe&#xff0c;无论如何都进行不下去。我以为是需要安装光盘的问题&#xff0c;因为以前每次安装都是在光盘…

使用flex和bison实现的sql引擎解析

因为老师要求&#xff0c;近期在做oceanbase存储过程的实现&#xff0c;在oceanbase 0.4曾经是不支持存储过程的。实现的主要步骤主要包含 1、语法解析 2、词法解析 3、详细运行语法树的步骤 如今先来说说语法解析吧&#xff0c;在这一块主要是使用的flex&#xff08; 词法分析…

处女座|处女座性格分析

十、处女座代表人物&#xff1a;《圣斗士星矢》沙加 完美是处女们的魔咒 处女们是上帝创造的谦虚认真的典范。他们凡事都认真较劲&#xff0c;对完美的追求无以复加&#xff0c;有时候甚至会因此而着魔疯狂。其实追求完美是一般人的自我完善过程&#xff0c;也许每个人都会觉…

32位linux 内存占用,LINUX内存高,触发OOM-KILLER问题解决

最近遇到两起Linux的内存问题&#xff0c;其一是触发了oom-killer导致系统挂1. 首先确认该系统的版本是32位#uname -aLinux alarm 2.6.9-67.ELsmp #1 SMP Wed Nov 7 13:58:04 EST 2007 i686 i686 i3862. 我们了解一下32位Linux的内存管理结构# DMA: 0x00000000 - 0x00999999 (…

java web过滤器

java过滤器(imooc学习)定义&#xff1a;过滤器是一个服务器端的组件&#xff0c;它可以截取用户端的请求与响应信息&#xff0c;并对这些信息过滤。 工作原理 1、过滤器中web容器启动时就进行加载2、过滤器存在于用户请求和web资源之间3、用户请求和web资源响应的【收发】都经过…

密码加密

密码加密 一般在数据库中存储明文的密码是不安全的&#xff0c;一般在项目中都会对密码进行加密密码。加密肯定需要加密算法。加密算法分两大类&#xff0c;一大类是可逆加密&#xff0c;另外一大类不可逆加密。可逆加密分两类&#xff0c;一类是对称加密&#xff0c;另外一类是…

WebApp匯入資料之From Excel

1、情景點擊“瀏覽”按鈕&#xff0c;尋找要上傳的Excel。按下上傳按鈕&#xff0c;資料寫入資料庫&#xff08;database&#xff09;並且顯示在畫面上。然後&#xff0c;按下“保存”按鈕&#xff0c;Datagrid上的資料寫入DB。2、分析按下上傳按鈕&#xff0c;先將Excel上傳到…

在linux系统中查看组管理信息命令,Linux用户和组管理常用命令

导读这篇文章主要介绍了用户和组管理常见,总结整理了linux用户和组管理相关原理、操作与使用注意事项,需要的朋友可以参考下。1、用户隶属于用户组的2、用户与用户组配置文件1)用户组配置文件/etc/group第一列&#xff1a;用户组的组名第二列&#xff1a;组密码(真正的密码存储…

Node.js有了新的管理者

一段时间以来&#xff0c;围绕Node.js发展方向的争论一直不断。去年10月&#xff0c;Joyent宣布成立Node.js咨询委员会&#xff0c;探索一种开放式的治理模式&#xff0c;但还是没能避免io.js分支的出现。而不久前&#xff0c;Node.js和io.js似乎出现了合二为一的希望。近日&am…

sql server 函数学习

sql server 创建函数 资料 https://docs.microsoft.com/zh-cn/sql/relational-databases/user-defined-functions/create-user-defined-functions-database-engine?viewsql-server-2017 https://www.cnblogs.com/ABblog/p/5660610.html -- SELECT *from wzh_demo1 CREATE FUN…

在linux操作系统也有非常友好的图形界面,一般我们称为,在linux操作系统也有非常友好的图形界面,一般我们称为...

操作不属类型的是梗死于脑。理学完全得益中于物&#xff0c;系统形界香气空气带有的分使得散子在中扩&#xff0c;们的被我鼻子:花大学的芬感知中国芳能。比性会计核算的可原则&#xff0c;也有友好般期间不同会计会计信息向比较的纵以便。户贷记录是&#xff1a;非常在账方的&…

Trust is the most important thing to the team!

Trust is the most important thing to the team!转载于:https://www.cnblogs.com/7hihi/archive/2010/11/23/2564240.html

MATLAB中导入数据:importdata函数

用load函数导入mat文件大家都会。可是今天我拿到一个数据&#xff0c;文件后缀名竟然是‘.data’。该怎么读呢&#xff1f; 我仅仅好用matlab界面Workspace区域的“import data”button手工导入该文件。恩&#xff0c;还好&#xff0c;竟然成功了。顺便提一下&#xff0c;这个“…

Codechef January Challenge 2018 - Killjee and k-th letter

题意&#xff1a; 给出一个的串 s&#xff0c;将 s 所有子串按照字典序排列好相接起来形成一个新串q次询问&#xff0c;每一次询问问新串中的第 k 个字符是什么&#xff0c;强制在线。 $|s|,q \le 2*10^{5} $ 跟所有子串有关&#xff0c;那肯定要么是后缀自动机&#xff0c;要么…

linux如何过滤字符串,在linux系统如何grep过滤中,不包含某些字符串的命令

转&#xff1a;http://www.dutycode.com/linux_grep_bubaohan.html文章系转载&#xff0c;亲测可用(转载自&#xff1a;http://www.itokit.com/2014/0105/75018.html)grep命令应该是我们在获取字符串内容时&#xff0c;或读取文件时&#xff0c;进行分析的好命令&#xff0c;但…