Visit Our UNIX and Linux User Community


Storing C++-struct in file - problem when adding new item in struct


 
Thread Tools Search this Thread
Top Forums Programming Storing C++-struct in file - problem when adding new item in struct
# 1  
Old 10-29-2011
Storing C++-struct in file - problem when adding new item in struct

Hi,
I have received an application that stores some properties in a file. The existing struct looks like this:

Code:
struct TData 
{
 UINT uSizeIncludingStrings;
 // copy of Telnet data struct
 UINT uSize;
 // basic properties:
 TCHAR szHost[MAXHOSTLEN];  //defined in Sshconfig
 UINT iPortNr;
 TCHAR szTermType[MAXTERMTYPE];
 // login properties:
 BOOL bTelnetLogin;
 TCHAR szUserName[MAXUSERNAME];
 BOOL bDetectUserName;
 BOOL bDetectPassWord;
 TCHAR szDetectUserName[MAXDTCTLEN];
 TCHAR szDetectPassWord[MAXDTCTLEN];
 // advanced options:
 BOOL bReplNull;
 TCHAR cNullChar;
 BOOL bFilterCR;
 BOOL bAddLF;
 BOOL bTransRel;
 BOOL bFilterXonXoff;
 BOOL bDetectDomain;
 TCHAR szDetectDomain[MAXDTCTLEN];
 TCHAR szDomain[MAXDOMAIN];
 char  *ciphers;
 char  *macs;
 int  authentication; };


The two char pointers ciphers and macs seem to be something that would not work because storing a pointer will not store anything else but the pointer itself and not the value but this is not the case here. When I open the property file I can read the values that were clicked in the checkboxes in the application. Some values seem to be human readable and some not in the rest of the file. The values ciphers and macs seem to be "enclosed" in some kind of block starting with STR_HEAD_VER_5 and ending with END_STR. This block also seem to be dynamically sized since there can be different numbers of ciphers and macs inside this block.

The problem is now that there is a need for adding another item in the struct and store it in the file. I was going to add a char* at the end as for ciphers and do the coding like the one handling ciphers and macs. It looks like this afterwards:

Code:
struct TData 
{
 UINT uSizeIncludingStrings;
 // copy of Telnet data struct
 UINT uSize;
 // basic properties:
 TCHAR szHost[MAXHOSTLEN];  //defined in Sshconfig
 UINT iPortNr;
 TCHAR szTermType[MAXTERMTYPE];
 // login properties:
 BOOL bTelnetLogin;
 TCHAR szUserName[MAXUSERNAME];
 BOOL bDetectUserName;
 BOOL bDetectPassWord;
 TCHAR szDetectUserName[MAXDTCTLEN];
 TCHAR szDetectPassWord[MAXDTCTLEN];
 // advanced options:
 BOOL bReplNull;
 TCHAR cNullChar;
 BOOL bFilterCR;
 BOOL bAddLF;
 BOOL bTransRel;
 BOOL bFilterXonXoff;
 BOOL bDetectDomain;
 TCHAR szDetectDomain[MAXDTCTLEN];
 TCHAR szDomain[MAXDOMAIN];
 char  *ciphers;
 char  *macs;
 int  authentication;
         char             *key;
 };

So far so good but the problem showed up when upgrading from the old application using the old struct in the property files. When starting the upgraded application with the new struct declared in the program some properties from the file were not read and you needed to enter them again and save and then it looks fine.

When debugging the new code reading an old property file I could see that there was a check done using sizeof(TData) to set the pointer in the file. Due to the increased size when adding the key item in the struct it steps to far. The check compares that the pointer points to the string STR_HEAD_VER_5(which is hardcoded in the code) in the file before reading the data within this block and then END_STR when finished. If the pointer in file does not point to the STR_HEAD_VER_5-string the reading is interrupted and an error message saying that the file is corrupt is received. When debugging I could see that the pointer pointed to HEAD_VER_5 instead which is not STR_HEAD_VER_5 and thus the reading is interrupted and some properties are not read.

My questions are now:
- Is there some common used technique, method, way to handle a problem like this so the operator does not need to enter the values again and can use the old property files and when saving the properties in the upgraded version and then get the new property file?

Regards,
Kalle
# 2  
Old 11-01-2011
You are mistaken. You cannot store "char *" in a file this way. You are storing pointers which, when you get them back, happen to point to some valid location in memory, but no mystical translation is happening -- a pointer is stored as 4 or 8 bytes, the data you wanted to store was never stored.

You must use fixed-size arrays like everything else.
# 3  
Old 11-01-2011
Agreed with Corona, and I was going to make the same statement, but not seeing the rest of the code, and under the assumption it works, I figured maybe it was memory mapping the file to some fixed address location. That'd allow the pointer values to be stored and actually work so long as they only pointed to an address within the memory mapped region.

That said, I have no idea if the code is actually doing this. And, I must admit, for a properties file it's fetched.

As for the OP, I think you're generally misguided regarding what the code is doing. That struct is unlikely to be stored directly in the file. I'd dig a little deeper in the code and figure out what is reading and writing the file's data.

Better, why don't you just post what the file looks like; with that information we could probably immediately tell you whether or not that exact structure is stored verbatim in the file.

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Programming

Python Results Converted To C Struct Header File

I created python code that produce output in the form of: moses-red-sea=1.00.03 genesis-snake=2.03 deliverance=5.0.010 I need to take this output and create a "C" header file and have it look like this: struct { char *name; char *fixed_version; } filename_versions... (7 Replies)
Discussion started by: metallica1973
7 Replies

2. Programming

search file and put into struct

hi everybody, I need some help with some programming. I need to write a file that can search in a text file and read the whole line into a struct. the struct = struct Transistor { char chType; char chFabrikant; float fPrijs; enum Transistor_Behuizing { empty,TO18, TO39,... (8 Replies)
Discussion started by: metal005
8 Replies

3. Programming

Problem defining a struct

I have the following code and getting the compilation errors baseLib/DynBaseObj.h:80: error: expected constructor, destructor, or type conversion before (' token baseLib/DynBaseObj.h:89: error: expected constructor, destructor, or type conversion before (' token baseLib/DynBaseObj.h:101:... (0 Replies)
Discussion started by: kristinu
0 Replies

4. Programming

Can't assign struct variable in header file

Hi guys. I have a header file including a structure like this: typedef struct { int index = -1; stack_node *head; } stack; But when compiling with cc it shows error at the assignment line (int index = -1): error: expected :', ,', ;', }' or __attribute__' before =' token... (1 Reply)
Discussion started by: majid.merkava
1 Replies

5. Programming

Compiling virtual network adapter driver problem (net_device struct)

Hi, I found on linuxgazette.net/93/bhaskaran.html page very useful sample of virtual driver (not connected to real hardware). I try to compile it with no effect. So: I got fresh Ubuntu 9.10 (kernel 2.6.31-14) My source is saved in networkAdapter.c file in /usr/src/myModules directory. I... (21 Replies)
Discussion started by: Chrisdot
21 Replies

6. UNIX for Dummies Questions & Answers

How to access a struct within a struct?

Can someone tell me how to do this? Just a thought that entered my mind when learning about structs. First thought was: struct one { struct two; } struct two { three; } one->two->three would this be how you would access "three"? (1 Reply)
Discussion started by: unbelievable21
1 Replies

7. UNIX for Advanced & Expert Users

problem with netfilter hook function struct skbuff *sock is null..

iam trying to built a firewall.so i have used netfilter for it. in function main_hook sock_buff is returning null and in my log file continuously "sock buff null" is printed plse help to solve this problem.. (using print_string iam printing strings on current terminal (terminal we ping)) ... (1 Reply)
Discussion started by: pavan6754
1 Replies

8. Programming

writing binary/struct data to file

I am trying to write binary data to a file. My program below: #include <stdlib.h> #include <stdio.h> struct tinner { int j; int k; }; struct touter { int i; struct tinner *inner; }; int main() { struct touter data; data.i = 10; struct tinner... (4 Replies)
Discussion started by: radiatejava
4 Replies

9. Programming

Problem accessing struct member

I have a struct as follows... struct A { int a; ucontext_t X; //ucontext_t is another structure } How do I define a pointer to the above structure variable X of the type ucontext_t from within another function? eg. void foo() { struct A a; /////WHAT COMES IN... (1 Reply)
Discussion started by: jacques83
1 Replies

10. Programming

struct tm problem

I receive an integer as argument for a function. within function definition i want it to be of type struct tm. eg.. main() { int a; ...... } function(...,..,a,..) int a; { struct tm tm; if(!a) ^ time(&a); ^ ... (4 Replies)
Discussion started by: bankpro
4 Replies

Featured Tech Videos