• Welcome to PlanetSquires Forums.
 

Text File IO

Started by James Fuller, December 20, 2020, 04:37:32 PM

Previous topic - Next topic

James Fuller

The WinFBX framework is all unicode.
Are there any examples using File IO ?
I find the FreeBasic Help File Open statement a bit confusing with no unicode example.

Thanks

James


José Roca


SeaVipe

Hi James, this type of code serves my purposes:


' Put and Get return 0 on success.
Dim As Long ff = FreeFile
Dim as Long o = Open( "C:\MyFile.dat" For Binary Access Read as #ff )
If o = 0 Then '' Good Open
'' variable to hold file data
Dim buffer as String
If LOF(ff) > 0 Then
'' our string has as many characters as the file has in bytes
buffer = String(LOF(ff), 0)
'' size of buffer is known. Entire string filled with file data
Get #ff, , buffer
End If   
'' Or
'' Put #ff, 1, buffer
'' I typically don't check the return value of Put or Get
Dim As Long c = Close(#ff) '' or Close(ff)
If c <> 0 Then
? "C:\MyFile.dat. Close Error: "; c
End If
Else '' Bad Open
? "C:\MyFile.dat. open error: "; o
End If


However, Jose's class will do a much better job!
Clive Richey

José Roca

CTextStream works with ansi or unicode sequential files.
https://github.com/JoseRoca/WinFBX/blob/master/docs/File%20Management/CTextStream%20Class.md

CFileStream works with binary files.
https://github.com/JoseRoca/WinFBX/blob/master/docs/File%20Management/CFileStream%20Class.md

And, contrarily to FreeBasic Open function, they also accept unicode for the file names.

James Fuller

José,
  This is the example from your help with an added else and it fails for me.
James


#define UNICODE
#INCLUDE ONCE "windows.bi"
#include "Afx/CTextStream.inc"
using Afx

' // Create an instance of the CTextStream class
DIM pTxtStm AS CTextStream
' // Open file for output as a text stream
IF pTxtStm.OpenForOutputW(ExePath & "\TestW.txt") = S_OK THEN
   ' // Write a string and an end of line to the stream
   pTxtStm.WriteLine "This is a test."
   '// Close the file
   pTxtStm.Close
Else
    ? "No GO"   
END IF

PRINT "Press any key to end..."
SLEEP

Paul Squires

For all my programs, I changed the file handling to use Jose's CFileStream and CTextStream. Works perfectly with ansi and unicode and the syntax is simple as well.
Paul Squires
PlanetSquires Software
WinFBE Editor and Visual Designer

James Fuller

Quote from: Paul Squires on December 21, 2020, 08:07:18 AM
For all my programs, I changed the file handling to use Jose's CFileStream and CTextStream. Works perfectly with ansi and unicode and the syntax is simple as well.
Paul,
  Would you provide a small example of writing and reading a unicode text file?
Thank you,
James

José Roca

#7
Quote from: James Fuller on December 21, 2020, 06:20:31 AM
José,
  This is the example from your help with an added else and it fails for me.
James

The method has an optional parameter to create the file if it does not exist. Therefore, use:


IF pTxtStm.OpenForOutputW(ExePath & "\TestW.txt", TRUE) = S_OK THEN


José Roca

> Would you provide a small example of writing and reading a unicode text file?

In the documentation there are examples to write to a file under the Create, Open (and its variations),  Write, WriteLine,WriteBlankLines topics, and for reading under the ReadLine and ReadAll topics.

Jim Dunn

Quote from: José Roca on December 20, 2020, 10:27:25 PMCTextStream works with ansi or unicode sequential files.
https://github.com/JoseRoca/WinFBX/blob/master/docs/File%20Management/CTextStream%20Class.md
CFileStream works with binary files.
https://github.com/JoseRoca/WinFBX/blob/master/docs/File%20Management/CFileStream%20Class.md

José, is there an "easy" way of determining if I file is "ansi/unicode" vs "binary" without reading the whole file?  I'm working on a "grep clone" and want to skip non-text files.  Thx!
3.14159265358979323846264338327950
"Ok, yes... I like pie... um, I meant, pi."

José Roca

Sorry, I don't know of any easy way.