C Struct Loses it’s Settings

Written by James McDonald

July 15, 2016

A while ago I blogged about a Control system that commits a C Struct to a file on a disk and then reads the file and enters the C Struct data back into the control system.

The operators started noticing inconsistent behaviours.

And so I have had to investigate. After much trial and error I found a quirk that is unique to Windows C Implementations that was causing an issue. It relates to how fwrite and fread write and read data to and from disk.

Basically the file was being written and any special characters it saw that it thought were \n characters e.g. 0A it was adding the (correct for windows) matching carriage return \r 0x0D character. Which effected the offset at which the data was written and made things wrong, really wrong, when it was then opened for reading.

The solution was a change to the fopen calls.

f = fopen(filename, "r"); // before
f = fopen(filename, "rb"); // for reading
f = fopen(filename, "w"); // before
f = fopen(filename, "wb"); // for writing

So once you change the fopen to rb or wb then the fwrite or fread will avoid doing any translation and just write/read the values as they are.

Here is an example of file written with f = fopen(filename, “w”);  Note the extra byte at the end of the file.

Screen Shot 2016-07-15 at 6.09.12 PM

Here is an example of file written with f = fopen(filename, “wb”);

Notice how although an 0A character appears in the data on line 640 in the first block of bytes fwrite doesn’t try and make it windows line ends by adding a 0D and thus the values maintain their correct offsets and can be read correctly back into the control system.

Screen Shot 2016-07-15 at 6.28.34 PM

http://stackoverflow.com/a/1586426

CR = 0x0D = \015 = \r

LF = 0x0A = \012 = \n

 

0 Comments

Submit a Comment

Your email address will not be published. Required fields are marked *

You May Also Like…

Toggen builds a new website

So I have built and hosted a new website for Roger Clark Pest Management they are a family owned and operated Pest...

WizTree

Just downloaded WizTree (not a sponsor) from https://wiztreefree.com/ It seems to do what it says on the tin which is...

Scam call from “Telstra”

Just had a call from a man with a sub-continental accent from caller ID 0734946596 Told me there was problem with my...