Thank you, Caveat [emptor?].
The code you proposed worked very, very well.
In fact, I timed it against two versions of the C program and the result
was quite good.
In C, reading from the standard input and writing to the standard output
took a trifle beyond half a second (0.6?? real time).
Meanwhile, your version in Gambas ran in 2.5?? (real time). The question
mark means little variation from trial to trial.
Out of curiosity, I wrote a Gambas version similar to the C version. Here
are the two codes:
*Dim b As Byte*
* While Not Eof() b = Read As Byte Write (b + 11) As Byte Wend*
- - - - - - -
* int c; while((c = getchar()) != EOF) putchar(c + 11);*
The C version ran in 0.59 against the Gambas version that ran in 7.6
seconds (real time). Not too bad in my opinion!
Then I tried to stretch it a little bit and wrote:
* Write (( Read As Byte) + 11) As Byte*
Alas! this is something Gambas does not understand.
These are just for the sake of experience. I am happy with the solution
Post by Caveat
Something is horribly wrong, or you're running on a 286 :-)
I just tested here, and the program runs on a 51 MB test file in about 5
Some reasonably well commented code for you...
Public Sub Main()
Dim inFile, outFile As File
Dim buff As New Byte
Dim idx, remBytes, readSize As Integer
' CHANGE THIS to your input file
inFile = Open "/home/caveat/Downloads/mytestfile" For Read
' CHANGE THIS to your output file
outFile = Open "/home/caveat/Downloads/mytestfile.out2" For Create
' Remaining bytes starts as the total length of the file
remBytes = Lof(inFile)
' Until we reach the end of the input file...guess you could instead
check on remBytes...
While Not Eof(inFile)
If remBytes > buff.length Then
' Limit reading to the size of our buffer (the Byte)
readSize = buff.length
' Only read the bytes we have left into our buffer (the Byte)
readSize = remBytes
' Read from the input file into our buffer, starting at offset 0 in
buff.Read(inFile, 0, readSize)
' Update the number of bytes remaining...
remBytes = remBytes - readSize
' Run round each byte in our buffer
For idx = 0 To buff.length - 1
' Dunno if you need any conditions, I check for > 30 as I can put
newlines in the file to make it more readable for testing
If buff[idx] > 30 Then
' This is the 'trick' you need to apply... subtract 11 from every
byte in the file
' Not sure how you deal with edge cases... if you have a byte of
5, is your result then 250?
buff[idx] = buff[idx] - 11
' Write the whole buffer out to the output file
buff.Write(outFile, 0, readSize)
Post by Tony Morehen
Public Sub Main()
Dim sIn as String
Dim sOut as String
sIn = File.Load("/home/fernando/temp/deah001.dhn")
sOut = Add11(sIn)
Public Sub Add11(InputString as String) as String
Dim bArray As Byte
Dim String11 As String
Dim i As Integer
bArray = Byte.FromString(InputString)
For i = 0 To bArray.Max
bArray[i] += 11
You don't have to use Byte.FromString.
You can use the Bute.Read() method instead, to load the file directly
into the array. You save an intermediate string that way.
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
Gambas-user mailing list
Telegram: +55 (37) 99988-8868
Wickr ID: fernandocabral
WhatsApp: +55 (37) 99988-8868
Telefone fixo: +55 (37) 3521-2183
Telefone celular: +55 (37) 99988-8868
Enquanto houver no mundo uma só pessoa sem casa ou sem alimentos,
nenhum político ou cientista poderá se gabar de nada.