Why does the GB32 Hash type use Write to save the data from a hash table (= dictionary)?
The correct answer is: In contrast with Print #, Write # uses a non-locale format. In Basic we often choose Print # over Write #, but both have their own goal. It has even been suggested that Write is a relic from prehistoric BASICs. However, this isn't true. To be able to correctly read data from a file into variables using Input #, use the Write # statement instead of the Print # statement to write the data to the files. Using Write # ensures each separate data field is properly delimited.
Both, the Print # and Write # commands, can be used to write data to a sequential text file, however the commands cause the information to be written to the text file differently.
The Write # statement is used to write raw data to the text file as comma- delimited and has the following syntax:
All data written to the file using Print # is internationally aware; that is, the data is properly formatted/converted using the appropriate decimal separator. The syntax is similar, but the result quite different.
Difference 1 – Quotation marks
The Write# command places quotation marks around all text values (strings), but not numeric data. The Date fields are surrounded with #s (pound signs).
The Input# command is used to retrieve values from a text-only file created with the Write# statement (removes quotation marks from strings).
The Print# command does not enclose the data in quotation marks.
Difference 2 – Delimiter
The Write # command separates two or more values on the same command line with commas.The Print # command separates two or more values on the same command line (separated by a comma) with a tab character.
Print # writes an image of the data to the file, you must delimit the data yourself so it prints correctly. If you use Tab (or a comma) with no arguments to move the print position to the next print zone, Print # also writes the spaces between print fields to the file.
Advantages of Write
When using Write # to write data to a file, several universal assumptions are followed so the data can always be read and correctly interpreted using Input #, regardless of locale:
- Numeric data is always written using the period as the decimal separator.
- For Boolean data, either #True# or #False# is printed. The True and False keywords are not translated, regardless of locale.
- Date data is written to the file using the universal date format. When either the date or the time component is missing or zero, only the part provided gets written to the file.
- Nothing is written to the file if outputlist data is Empty. However, for data, #Null# is written.
- If outputlist data is Null data, #Null# is written to the file.
- For Error data, the output appears as #Error errorcode#. The Error keyword is not translated, regardless of locale.
To get your memory refreshed, look at the following code:
Write App.Name // "NoName"
Write CFloat(3.2) // 3.2
Write CDate(Now) // #2012-07-11 12:42:33
Write CBool(0) // #False#
Write CHandle(0) // #Null#
Write CFloat(3.2), Date // 3.2,#2012-07-11 12:42:33
' Print inserts a space at the front of a number
Print App.Name // NoName
Print CFloat(3.2) // 3.2
Print CDate(Now) // 11-7-2012 12:42:33
Print CBool(0) // False
Print CHandle(0) // 0
Print CFloat(3.2), Date // 3.2 #2012-07-11 12:42:33
Unlike the Print # statement, the Write # statement inserts commas between items and quotation marks around strings as they are written to the file. You don't have to put explicit delimiters in the list. Write # inserts a newline character, that is, a carriage return–linefeed (Chr(13) + Chr(10), after it has written the final character in outputlist to the file.
If, at some future time, you want to read the data from a file using the Input # statement, use the Write # statement instead of the Print # statement to write the data to the file. Using Write # ensures the integrity of each separate data field by properly delimiting it, so it can be read back in using Input #. Using Write # also ensures it can be correctly read in any locale.