I have a few functions I'm using to write values to a binary file. The problem is when I read from the file to retrieve values all I get is the last value written.
The structure I am inserting is:
I calll the function add to insert (update) the value:Code:struct tsDataS { unsigned ts : 32; unsigned volID : 8; unsigned offset : 32; };
And then add calls this to get the location of any "empty" (TS_EMPTY == ts) values:Code:bool timestamp::add(tsData &ts) { if(!myDB) return 0; //change this to seek for empty spots first fstream mFile; int location, findRec; objKey1.ts = TS_EMPTY; //do we have an open entry space? findRec = seekLocation(objKey1, TS_TST);//used to determine the record number mFile.open(myDB,ios::binary|ios::out); location = (findRec - 1)*sizeof(ts); mFile.seekp (location);//used to determine location of record mFile.write((char*)&ts,sizeof(ts)); //replace old stamp if(findRec < DBSize) { //increment counter activeTScount++; } //need to make a new entry else { //increment counters DBSize++; activeTScount++; } return 1; }
Also another interesting point is that sizeof(objKey1) == 12 and sizeof(ts) == 4 even thought they are both struct tsDataS which I thought should equal 9??Code:int timestamp::seekLocation(tsData &ts, int tok) //Find a timestamp matching field tok in ts { fstream seekFile; int count =0; bool found = false; seekFile.open(myDB,ios::binary | ios::in); seekFile.seekg(0,ios::beg); while(seekFile.read((char*)&objKey1,sizeof(objKey1))) { ++count; if( tok == TS_VOL ) if(ts.volID == objKey1.volID) { found = true; break; } else if ( tok == TS_OFF ) if(ts.offset == objKey1.offset) { found = true; break; } else if ( tok == TS_TST ) if(ts.ts == objKey1.ts) { found = true; break; } else if ( tok == TS_VOL + TS_OFF ) if(ts.offset == objKey1.offset && ts.volID == objKey1.volID) { found = true; break; } } seekFile.close(); if(found) return count; return count + 1; }
thanks,
Devan




Reply With Quote