How do I store an array in a text file and then retrieve it again?
LiveCode enables you to convert an array into a format that can be stored in a file or sent to a URL using arrayEncode. Conversely, you can use arrayDecode to to convert data back into a LiveCode array.
This lesson will show you an example of how to use arrayEncode/arrayDecode with the fillGradient property of a graphic.
You can download the stack for this lesson here: https://tinyurl.com/y9vv2u97
The Example Stack
In LiveCode the fillgradient property of a graphic is an array containing all of the gradient information. The example stack demonstrates how to store the fillgradient array of the graphic in a file as well as load the fillgradient array from a file and assign it to the graphic.
Storing an Array in a File
This code snippet from the example stack demonstrates how to convert the fillGradient property (an array) of a graphic into a binary representation of the array using arrayEncode. This binary representation is stored in the variable theEncodedArray.
if theFile is not empty then
put arrayEncode(the fillgradient of graphic 1) into theEncodedArray
put theEncodedArray into URL ("binfile:" & theFile)
end if
When storing the array in a file it is important that you write the data to the file in binary format otherwise the encoded array data will be corrupted. That is why the binfile: prefix is used.
Loading an Array From a File
To load the binary representation of the array from a file you just reverse the steps. Begin by reading the data from the file in binary format using the binfile: prefix. In this snippet the binary data is stored in the variable theEncodedArray.
You can then pass the binary data to arrayDecode which transforms the binary data back into a LiveCode array variable, theFillGradientA in this case. At this point the array can be assigned to the fillgradient property of a graphic.
if theFile is not empty then
put URL ("binfile:" & theFile) into theEncodedArray
put arrayDecode(theEncodedArray) into theFillGradientA
set the fillgradient of graphic 1 to theFillGradientA
end if
The Stack Script
This is the full stack script from the sample:
local theFile, theEncodedArray, theFillGradientA
command uiSaveGradientToFile
## Store the fillGradient array for the graphic object in a file
ask file "Save fillGradient array to file:"
put it into theFile
if theFile is not empty then
put arrayEncode(the fillgradient of graphic 1) into theEncodedArray
put theEncodedArray into URL ("binfile:" & theFile)
end if
end uiSaveGradientToFile
command uiLoadGradientFromFile
## Load fillGradient array from file
answer file "Select file containing fillGradient array:"
put it into theFile
if theFile is not empty then
put URL ("binfile:" & theFile) into theEncodedArray
put arrayDecode(theEncodedArray) into theFillGradientA
set the fillgradient of graphic 1 to theFillGradientA
end uiLoadGradientFromFile
The Button Scripts
This is the script from the "Save Array to File" button:
on mouseUp pBtnNum
if pBtnNum is 1 then
uiSaveGradientToFile
end if
end mouseUp
This is the script from the "Load Array from File" button:
on mouseUp pBtnNum
if pBtnNum is 1 then
uiLoadGradientFromFile
end if
end mouseUp
anonymous
Nice. But to save as a TEXT file, you must base64Encode the encoded BINARY data. To load it, just base64Decode.
To save as text:
if theFile is not empty then
put arrayEncode(the fillgradient of graphic 1) into theEncodedArray
put base64Encode(theEncodedArray) into URL ("file:" & theFile)
end if
To load the text and convert back to the gradient array:
if theFile is not empty then
put URL ("file:" & theFile) into theBase64Array
put base64Decode(theBase64Array) into theEncodedArray
put arrayDecode(theEncodedArray) into theFillGradientA
set the fillgradient of graphic 1 to theFillGradientA
end if
Björnke von Gierke
Note that the example given uses "binfile". That takes care of binary just fine. Altho your solution works as well as the example, yours will generate much bigger files.