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
|
#ifndef MY_TABLE_STRUCT_H#define MY_TABLE_STRUCT_H#define POLICY_UTIL_ARRAY_LENGTH 256*64#define ARRAY_SIZE 256long saved_policy_id[10];long saved_udp_allow_IP_ID[10];long save_log_ID[10];/*与日志审计相关的文件路径定义*/#define SYSTEM_LOG "/tmp/log/system.log"#define HTTP_LOG "/tmp/log/http.log"#define SMTP_LOG "/tmp/log/smtp.log"#define POP3_LOG "/tmp/log/pop3.log"#define SYSTEM_INTERMEDIARY_LOG "/tmp/log/system_intermediary.log"#define HTTP_INTERMEDIARY_LOG "/tmp/log/http_intermediary.log"#define SMTP_INTERMEDIARY_LOG "/tmp/log/smtp_intermediary.log"#define POP3_INTERMEDIARY_LOG "/tmp/log/pop3_intermediary.log"typedef struct{ int used; //0 for unused int AppID; /* 00 "系统", 01 "HTTP应用", 02 "SMTP应用", 03 "POP3应用", 04 "FTP应用", 05 "TELNET应用", 06 "NULL ", 07 "用户自定义应用", 08 "TCP空白协议", 09 "UDP应用", 0a "ORACLE数据库应用", 0b "SQL Server 数据库应用", 0c "邮件服务器与邮件服务器应用", */ char SourceIP[20]; short SourcePort; char DestIP[20]; short DestPort; char SourceType; //I for inner;O for outter char IsDestProxyMode; short MaxConn; char IsWorking; // 'Y' for "自动启用,现启用" //'N' for "自动启用,现停用" //'U' for "手动启用,现停用" //'W' for "手动启用,现启用" char IsAuth; // 0 for no auth // 1 for auth char name[20]; UINT16 InnerPort; //for udp UINT16 OuterPort; char IsAllowed; //安全策略黑白指示 // 'Y' for 白 // 'N' for 黑 char FromTime[8][8]; char ToTime[8][8]; char WeekDay[8][8]; //for udp allowed ip unsigned int inner_udp_ip[256]; unsigned int outer_udp_ip[256]; //for tcp allowed ip struct IP { char ip[255]; int black_white; } allowed_ip[256]; struct POLICY { long p_id; short type; char IsWorking; char p_content[255]; char IsAllowed; } policy[64]; }TABLE_CHANNEL;TABLE_CHANNEL table_channels[ARRAY_SIZE];#endif |
将结构体数组中的数据保存到文件中,实现函数如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
void chn_write_file(){ FILE *fp; int i; DO_LOG("chn_write_file():write to the file start...\n"); fp=fopen("/tmp/data/db_file/tcp_file","wb"); if(fp==NULL) { printf("file /tmp/udp_chn open error\n"); return; } //for(i=0;i<256;i++) //fwrite(&table_channels[i],sizeof(TABLE_CHANNEL),1,fp);//把内存中的信息写入到文件中去 fwrite(table_channels, sizeof(TABLE_CHANNEL), 256, fp); fclose(fp); DO_LOG("chn_write_file():write to the file end...\n");} |
从文件中读取数据存储到结构体数组中,实现函数如下:
|
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
|
void chn_read_file(){ MY_DEBUG_LOG("chn_read_file():read from the file start...\n"); DO_LOG("chn_read_file():read from the file start...\n"); FILE *fp; int i, j; fp= fopen("/tmp/data/db_file/tcp_file", "rb"); if(fp == NULL) { DO_LOG("chn_read_file():open file failed, because:%s!\n", strerror(errno)); return ; } /*for(i = 0; i< 256; i++) { fread(&table_channels[i], sizeof(TABLE_CHANNEL), 1, fp); }*/ fread(table_channels, sizeof(TABLE_CHANNEL), 256, fp); /*****打印结构体数组中的数据*******/ MY_DEBUG_LOG("chn_read_file(): The informations of approuteways bellows:\n"); for(i =0; i<256; i++) { if(table_channels[i].used == 0) { continue; } MY_DEBUG_LOG("[ReadFile]:ID:%d, used:%d, AppID:%d, SourceIP:%s, SourcePort:%d,\ DestIP:%s, DestPort:%d, SourceType:%c, IsDestProxyMode:%c, MaxConn:%d,\ IsWorking:%c, IsAuth:%c, InnerPort:%d, OuterPort:%d, IsAllowed:%c, name:%s!\n", \ i, table_channels[i].used, table_channels[i].AppID,table_channels[i].SourceIP,table_channels[i].SourcePort, \ table_channels[i].DestIP, table_channels[i].DestPort, table_channels[i].SourceType, table_channels[i].IsDestProxyMode,\ table_channels[i].MaxConn, table_channels[i].IsWorking,table_channels[i].IsAuth,table_channels[i].InnerPort,\ table_channels[i].OuterPort,table_channels[i].IsAllowed,table_channels[i].name); } MY_DEBUG_LOG("chn_read_file(): The informations of allowd time bellows:\n"); for(i=0; i<256; i++) { if(table_channels[i].used == 0) { continue; } for(j=0; j<8; j++) { if(table_channels[i].FromTime[j][0] == 0) { continue; } if(table_channels[i].ToTime[j][0] == 0) { continue; } if(table_channels[i].WeekDay[j][0] == 0) { continue; } MY_DEBUG_LOG("chn_read_file():ID:%d,FormTime:%s,ToTime:%s,WeekDay:%s\n",\ i,&table_channels[i].FromTime[j][0], &table_channels[i].ToTime[j][0], &table_channels[i].WeekDay[j][0]); } } MY_DEBUG_LOG("chn_read_file(): The informations of allowd IPs bellows:\n"); for(i=0; i<256; i++) { if(table_channels[i].used == 0) { continue; } for(j=0; j<256; j++) { if(table_channels[i].allowed_ip[j].ip[0] ==0) { continue; } if(table_channels[i].allowed_ip[j].black_white == 0) { MY_DEBUG_LOG("chn_read_file():ID:%d, ip %s, black_white:%d\n", i, table_channels[i].allowed_ip[j].ip, table_channels[i].allowed_ip[j].black_white); } } } MY_DEBUG_LOG("chn_read_file(): The informations of allowd users bellows:\n"); for(i=0; i<256; i++) { if(table_channels[i].used == 0) { continue; } for(j=0; j<256; j++) { if(table_channels[i].allowed_ip[j].ip[0] ==0) { continue; } if(table_channels[i].allowed_ip[j].black_white == 1) { MY_DEBUG_LOG("chn_read_file():ID:%d, users %s, black_white:%d\n", i, table_channels[i].allowed_ip[j].ip, table_channels[i].allowed_ip[j].black_white); } } } MY_DEBUG_LOG("chn_read_file(): The informations of policies bellows:\n"); for(i=0; i<256; i++) { if(table_channels[i].used == 0) { continue; } for(j =0 ; j <64; j++) { if(table_channels[i].policy[j].type == 0) { continue; } MY_DEBUG_LOG("[ReadFile]:ID:%d, AppID:%d, used:%d, policy_id:%d , type:%x, IsWorking:%c, p_content:%s, IsAllowed:%c.\n", i,table_channels[i].AppID,table_channels[i].used,table_channels[i].policy[j].p_id,table_channels[i].policy[j].type, table_channels[i].policy[j].IsWorking,table_channels[i].policy[j].p_content, table_channels[i].policy[j].IsAllowed); } } fclose(fp); MY_DEBUG_LOG("chn_read_file():read from the file start end...\n"); } |
现在出现问题,请教网上各位高手:
在一个程序中可以正确执行上面的两个操作,并用日志的形式打印数据,是正确的;可是在其它地方调用void chn_read_file()函数时候,并用日志形式打印数据,却显示的是错误的数据(具体错误:allowed_ip结构体,和policy结构体中的数据是错误的,随机生成的,也就是没从文件中正确读出来)函数我用的一样,为什么会出现这种情况?
C语言 结构体数组保存到二进制文件中的更多相关文章
- C语言之:结构体动态分配内存(利用结构体数组保存不超过10个学生的信息,每个学生的信息包括:学号、姓名和三门课(高数、物理和英语 )的成绩和平均分(整型)。)
题目内容: 利用结构体数组保存不超过10个学生的信息,每个学生的信息包括:学号.姓名和三门课(高数.物理和英语 )的成绩和平均分(整型). 编写程序,从键盘输入学生的人数,然后依次输入每个学生的学号. ...
- C语言结构体数组遇上typedef
昨天韩同学在做数据结构题的时候,问了我一个关于typedef 与结构体数组的问题: typedef struct vexnode { int vertex; arcnode* firstarc; }a ...
- c语言结构体数组定义的三种方式
struct dangdang { ]; ]; ]; int num; int bugnum; ]; ]; double RMB; int dangdang;//成员名可以和类名同名 }ddd[];/ ...
- C语言结构体数组内带字符数组初始化和赋值
1.首先定义结构体数组: typedef struct BleAndTspRmtCmd{ char terminal[3]; char note[3]; char rmtCmd[10]; char c ...
- C语言结构体数组
#include <stdio.h> int main() { /*************************************************** *结构体数组:数组 ...
- c语言结构体数组引用
struct dangdang { ]; ]; ]; int num; int bugnum; ]; ]; double RMB; }dbdd[]={{,,}, {,,} };//初始化 void m ...
- NumPy-快速处理数据--ndarray对象--多维数组的存取、结构体数组存取、内存对齐、Numpy内存结构
本文摘自<用Python做科学计算>,版权归原作者所有. 上一篇讲到:NumPy-快速处理数据--ndarray对象--数组的创建和存取 接下来接着介绍多维数组的存取.结构体数组存取.内存 ...
- 读陈浩的《C语言结构体里的成员数组和指针》总结,零长度数组
原文链接:C语言结构体里的成员数组和指针 复制例如以下: 单看这文章的标题,你可能会认为好像没什么意思.你先别下这个结论,相信这篇文章会对你理解C语言有帮助.这篇文章产生的背景是在微博上,看到@Lar ...
- C语言中的结构体,结构体数组
C语言中的结构体是一个小难点,下面我们详细来讲一下:至于什么是结构体,结构体为什么会产生,我就不说了,原因很简单,但是要注意到是结构体也是连续存储的,但要注意的是结构体里面类型各异,所以必然会产生内存 ...
随机推荐
- Android进程的内存管理分析
尊重原创作者,转载请注明出处: http://blog.csdn.net/gemmem/article/details/8920039 最近在网上看了不少Android内存管理方面的博文,但是文章大多 ...
- PID教程
PID教程 介绍 本教程将向您展示了比例每一个比例项 (P)的特点,积分项(I)和微分项 (D) 控制,以及怎样使用它们来获得所需的响应.在本教程中,我们会考虑下面单位反馈系统: Plant[被控对象 ...
- iOS面试题05-父子控制器、内存管理
内存管理.父子控制器面试题 1.建立父子关系控制器有什么用 回答:1>监听屏幕选中 2>如果想拿到你当前的很小的一个控制器所在的导航控制器必须要跟外面比较大的控制器建立父子关系,才能一层一 ...
- iOS中的地图和定位
文章摘自http://www.cnblogs.com/kenshincui/p/4125570.html#location 如有侵权,请联系删除. 概览 现在很多社交.电商.团购应用都引入了地图和定 ...
- 如何在内存中压缩并加密ZIP
项目中遇到了一个问题,考虑到安全原因,需要将文件以二进制数据的方式打包成压缩文件,并且这个压缩文件是有密码的. 去Google上找了些API,下载来看了下,琢磨出了以下方法 首先放API: <! ...
- Android应用开发基础篇(7)-----BroadcastReceiver
链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/22/2363644.html 一.概述 BroadcastReceiver,意思就是广播信息接收 ...
- xar安装使用方法
xar是一种扩展的归档格式(eXtensible ARchive format),是一种开源的文件格式.xar文件在Mac OS X 10.5里是用于软件安装程序. ---------------- ...
- 转:alphaImageLoader滤镜加载后 链接不能点击
我是一个很少使用IE滤镜,也是一个不赞成使用IE滤镜的前端工程师.不过今天有一个朋友给我发来了一个有关于IE6的BUG,就是在IE6中使用了AlphaPNG透明的IE滤镜之后,a链接不能够点击.具体情 ...
- 手机SIM卡知识大科普
SIM卡 SIM卡是(Subscriber Identity Module 客户识别模块)的缩写,也称为智能卡.用户身份识别卡,GSM数字移动电话机必须装上此卡方能使用.它在一电脑芯片上存储了数字移动 ...
- HDU 2152 Fruit
系数为1的母函数…… #include <cstdio> #include <cstring> using namespace std; int n,m,size[105][2 ...