User Tools

Site Tools


storing_20structures_20in_20files

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
storing_20structures_20in_20files [2018/03/31 13:19] – external edit 127.0.0.1storing_20structures_20in_20files [2024/01/12 22:46] (current) – Add generic code (e.g. for BBCTTY) richardrussell
Line 1: Line 1:
 =====Storing structures in files===== =====Storing structures in files=====
  
-//by Richard Russell, July 2006//\\ \\  BBC BASIC for Windows does not provide any built-in means of writing entire data structures to a file and reading them back again. Ideally it would be nice if one could say **"PRINT #file%,struct{}"** and **"READ #file%,struct{}"**, but unfortunately these statements are not syntactically valid.\\ \\  However it is quite straightforward to achieve the same effect using calls to the Windows API. To write an entire structure **struct{}** to the file opened on channel **file%** use the following code:\\ \\  +//by Richard Russell, July 2006//\\ \\  BBC BASIC does not provide any built-in means of writing entire data structures to a file and reading them back again. Ideally it would be nice if one could say **"PRINT #file%,struct{}"** and **"READ #file%,struct{}"**, but unfortunately these statements are not syntactically valid.\\ \\  However it is quite straightforward to achieve the same effect using calls to API functions. To write an entire structure **struct{}** to the file opened on channel **file%** use the following code:\\ \\  
-        SYS "WriteFile", @hfile%(file%), struct{}, DIM(struct{}), ^temp%, 0+BB4W: 
 +<code bb4w> 
 +      SYS "WriteFile", @hfile%(file%), struct{}, DIM(struct{}), ^temp%, 0 
 +</code> 
 +BBCSDL: 
 +<code bb4w> 
 +      SYS "SDL_RWwrite", @hfile%(file%), struct{}, DIM(struct{}),
 +</code> 
 +Generic (e.g. BBCTTY): 
 +<code bb4w> 
 +      DEF PROCwritestruct(F%, s{}) 
 +      LOCAL s$ : PTR(s$)=s{} : !(^s$+4)=DIM(s{}) : BPUT#F%,s$; : !(^s$+4)=0 
 +      ENDPROC 
 +</code>
 Similarly to read an entire structure **struct{}** from the file opened on channel **file%** do the following:\\ \\  Similarly to read an entire structure **struct{}** from the file opened on channel **file%** do the following:\\ \\ 
-        SYS "ReadFile", @hfile%(file%), struct{}, DIM(struct{}), ^temp%, 0+BB4W: 
 +<code bb4w> 
 +      SYS "ReadFile", @hfile%(file%), struct{}, DIM(struct{}), ^temp%, 0 
 +</code> 
 +BBCSDL: 
 +<code bb4w> 
 +      SYS "SDL_RWread", @hfile%(file%), struct{}, DIM(struct{}),
 +</code> 
 +Generic (e.g. BBCTTY): 
 +<code bb4w> 
 +      DEF PROCreadstruct(F%, s{}) 
 +      LOCAL s$ : PTR(s$)=s{} : !(^s$+4)=DIM(s{}) : s$=GET$#F% BY LENs$ : !(^s$+4)=0 
 +      ENDPROC 
 +</code>
 It is best not to mix these statements with conventional BASIC file reads and writes, but if you do you must flush BASIC's file buffers before each of the API calls, as follows:\\ \\  It is best not to mix these statements with conventional BASIC file reads and writes, but if you do you must flush BASIC's file buffers before each of the API calls, as follows:\\ \\ 
 +<code bb4w>
         PTR#file% = PTR#file%         PTR#file% = PTR#file%
         SYS "WriteFile", @hfile%(file%), struct{}, DIM(struct{}), ^temp%, 0         SYS "WriteFile", @hfile%(file%), struct{}, DIM(struct{}), ^temp%, 0
Line 11: Line 38:
         PTR#file% = PTR#file%         PTR#file% = PTR#file%
         SYS "ReadFile", @hfile%(file%), struct{}, DIM(struct{}), ^temp%, 0         SYS "ReadFile", @hfile%(file%), struct{}, DIM(struct{}), ^temp%, 0
 +</code>
 ==== Important note: ==== ==== Important note: ====
  This technique does **not** work for structures containing strings or string arrays. In that case it is probably easier simply to write the individual structure members to file one at a time and read them back again. However see the article [[/Storing%20structures%20containing%20strings|Storing structures containing strings]] for details of an alternative method.  This technique does **not** work for structures containing strings or string arrays. In that case it is probably easier simply to write the individual structure members to file one at a time and read them back again. However see the article [[/Storing%20structures%20containing%20strings|Storing structures containing strings]] for details of an alternative method.
storing_20structures_20in_20files.1522502385.txt.gz · Last modified: 2024/01/05 00:16 (external edit)