-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrecord.c
147 lines (115 loc) · 3.46 KB
/
record.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
// slightly modified version of original file from assignment 1
#include "record.h"
//print a message
void print_record_message(message_record_t *message)
{
//message cannot be NULL
if (message == NULL) {
fprintf(stderr, "The message is NULL\n");
exit(0);
}
//print message time
printf("Time: %02d/%02d/%04d %02d:%02d\n", message->month, message->day,
message->year, message->hour, message->minute);
//print message text
printf("Text: %s\n", message->text);
}
//print a record
void print_record(record_t *record)
{
int i;
//record cannot be NULL
if (record == NULL) {
fprintf(stderr, "The record is NULL\n");
exit(0);
}
//print user id
printf("ID: %06d\n", record->id);
//print user name
printf("Name: %s\n", record->name);
//print user location
printf("Location: %s\n", record->location);
//print message if the message number is greater than 0
for (i = 0; i < record->message_num; i++) {
print_record_message(&(record->messages[i]));
}
}
//read a message from a file
void read_record_message(message_record_t *message, FILE *fp)
{
//Assume file has been opened
if (fp == NULL) {
fprintf(stderr, "The file stream is NULL\n");
exit(0);
}
//message cannot be NULL
if (message == NULL) {
fprintf(stderr, "The message is NULL\n");
exit(0);
}
//read message text
fread(&(message->text[0]), sizeof(char), TEXT_LONG, fp);
//read message time
fread(&(message->year), sizeof(int), 1, fp);
fread(&(message->month), sizeof(int), 1, fp);
fread(&(message->day), sizeof(int), 1, fp);
fread(&(message->hour), sizeof(int), 1, fp);
fread(&(message->minute), sizeof(int), 1, fp);
}
//read a record from a file
record_t *read_record(FILE *fp)
{
int i;
//Assume file has been opened
if (fp == NULL) {
fprintf(stderr, "The file stream is NULL\n");
exit(0);
}
//allocate memory for the record
record_t *record = (record_t *)malloc(sizeof(record_t));
//memory error
if (record == NULL) {
fprintf(stderr, "Cannot allocate memory for record.\n");
exit(0);
}
//read user id
fread(&(record->id), sizeof(int), 1, fp);
//read user name
fread(&(record->name[0]), sizeof(char), TEXT_SHORT, fp);
//read user location
fread(&(record->location[0]), sizeof(char), TEXT_SHORT, fp);
//read message number
fread(&(record->message_num), sizeof(int), 1, fp);
//initalize messsages
record->messages = NULL;
//allocate memory for messages if the message number is greater than 0
if (record->message_num > 0) {
//allocate memory
record->messages = (message_record_t *)malloc(sizeof(message_record_t) *
record->message_num);
//memory error
if (record->messages == NULL) {
fprintf(stderr, "Cannot allocate memory for messages.\n");
exit(0);
}
//read each message from file
for(i = 0; i < record->message_num; i++) {
read_record_message(&(record->messages[i]), fp);
}
}
//return the record
return record;
}
//free memory of a record
void free_record(record_t *record)
{
if (record == NULL) {
return;
}
//free message memory
if (record->messages != NULL) {
free(record->messages);
}
//free record memory
free(record);
}