本文分享了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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
/********************************************************************** * 版权所有 (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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
/********************************************************************** * 版权所有 (C)2015, Zhou Zhaoxiong。 * * 文件名称:CtlFileCreate.h * 文件标识:无 * 内容摘要:目录中文件的读取及控制文件的生成 * 其它说明:无 * 当前版本:V1.0 * 完成日期:20151102 * **********************************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <dirent.h> // 数据类型重定义 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
|
/********************************************************************** * 版权所有 (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,并将新的记录内容写入到控制文件中。
第四,在处理完当前目录下的所有文件之后,程序会休眠一段时间,然后继续扫描目录。在实际的开发中,休眠间隔也是可以配置的。
以上就是本文的全部内容,希望对大家的学习有所帮助。