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 Caveat proposed. Thank you. 2017-07-15 17:28 GMT-03:00 Caveat <gam...@youngjules.net>: > 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 > seconds. > > Some reasonably well commented code for you... > > Public Sub Main() > > Dim inFile, outFile As File > Dim buff As New Byte[1024] > 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 > Else > ' Only read the bytes we have left into our buffer (the Byte[]) > readSize = remBytes > Endif > ' Read from the input file into our buffer, starting at offset 0 in > the buffer > 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 > Endif > Next > ' Write the whole buffer out to the output file > buff.Write(outFile, 0, readSize) > Wend > > Close #inFile > Close #outFile > > End > > > Kind regards, > Caveat > > On 15-07-17 21:24, Benoît Minisini via Gambas-user wrote: > >> Le 15/07/2017 à 20:49, Tony Morehen a écrit : >> >>> Did you try Benoit's suggestion: >>> >>> Public Sub Main() >>> >>> Dim sIn as String >>> Dim sOut as String >>> >>> sIn = File.Load("/home/fernando/temp/deah001.dhn") >>> sOut = Add11(sIn) >>> File.Save("/home/fernando/temp/deah001.11Added.dhn", sOut) >>> >>> End >>> >>> 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 >>> Next >>> Return bArray.ToString >>> End >>> >>> >>> >> Just a remark: >> >> 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. >> >> Regards, >> >> > > > ------------------------------------------------------------ > ------------------ > 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 > Gambas-user@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/gambas-user > -- Fernando Cabral Blogue: http://fernandocabral.org Twitter: http://twitter.com/fjcabral e-mail: fernandojosecab...@gmail.com Facebook: f...@fcabral.com.br Telegram: +55 (37) 99988-8868 Wickr ID: fernandocabral WhatsApp: +55 (37) 99988-8868 Skype: fernandojosecabral 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. ------------------------------------------------------------------------------ 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 Gambas-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/gambas-user