BBC BASIC for Windows
« Using PTR#A »

Welcome Guest. Please Login or Register.
Apr 5th, 2018, 10:15pm



ATTENTION MEMBERS: Conforums will be closing it doors and discontinuing its service on April 15, 2018.
Ad-Free has been deactivated. Outstanding Ad-Free credits will be reimbursed to respective payment methods.

If you require a dump of the post on your message board, please come to the support board and request it.


Thank you Conforums members.

BBC BASIC for Windows Resources
Online BBC BASIC for Windows documentation
BBC BASIC for Windows Beginners' Tutorial
BBC BASIC Home Page
BBC BASIC on Rosetta Code
BBC BASIC discussion group
BBC BASIC for Windows Programmers' Reference

« Previous Topic | Next Topic »
Pages: 1  Notify Send Topic Print
 thread  Author  Topic: Using PTR#A  (Read 848 times)
GordonSweet
Developer

member is offline

Avatar




PM


Posts: 23
xx Using PTR#A
« Thread started on: Nov 21st, 2008, 10:23am »

I can read all the bytes in say a TXT file like below or any other file. But how do I calculate the PTR#A to use BPUT#A to change a byte, or must I open the file for random access etc with fnum=OPENUP(filename$)

Thanks Gordon

Code:
      MODE 20 : COLOUR 0,255,255,255 : CLS
      COLOUR 7,0,0,0 : COLOUR 7
      DIM dat(1000)
      f$ = "1test.txt"
      A=OPENIN f$
      REPEAT
        COLOUR 7 :  c% = c% + 1 :
        k% = BGET#A : dat(c%) = k%
        IF k% > 31 AND k% <> 127 THEN PRINT CHR$(k%);
      UNTIL EOF#A
      CLOSE #A
      END 
 
User IP Logged

admin
Administrator
ImageImageImageImageImage


member is offline

Avatar




PM


Posts: 1145
xx Re: Using PTR#A
« Reply #1 on: Nov 21st, 2008, 1:27pm »

Quote:
But how do I calculate the PTR#fnum to use BPUT#A to change a byte, or must I open the file for random access etc with fnum=OPENUP(filename$)

You don't need to open a file with OPENUP to move its pointer; you can use PTR#fnum= to move the pointer whether the file was opened with OPENIN, OPENOUT or OPENUP. Obviously, when opened using OPENOUT you are restricted to moving the pointer to within the range you have already written.

As for calculating where to position the pointer, you should be able to work it out by knowing the number of bytes used for each item in the file. BPUT#fnum,n uses 1 byte, PRINT#fnum,n uses 5 bytes (in *FLOAT40 mode, 8 in *FLOAT64 mode) and PRINT#fnum,s$ uses LEN(s$)+1 bytes. Simply add together the sizes of the preceding items to find the current file pointer.

Richard.
User IP Logged

GordonSweet
Developer

member is offline

Avatar




PM


Posts: 23
xx Re: Using PTR#A
« Reply #2 on: Nov 21st, 2008, 1:35pm »

Thanks again Richard I will study it.

Gordon
User IP Logged

GordonSweet
Developer

member is offline

Avatar




PM


Posts: 23
xx Re: Using PTR#A
« Reply #3 on: Nov 22nd, 2008, 10:18am »

No luck Richard below shows Access Denied at line 210.
I expect I have got the length wrong Gordon

Code:
   10 MODE 20 : COLOUR 0,255,255,255 : CLS
   20 COLOUR 7,0,0,0 : COLOUR 7
   30 DIM dat(10000) : f$ = "test.txt"
   40 
   50 T=OPENOUT f$
   60 PRINT#T, "Now is the time for all good men to come to the aid of the party."
   70 CLOSE #T
   80 
   90 dat = 5 : byte = 34 : length = 5
  100 A=OPENIN f$
  110 base=PTR#A
  120 REPEAT
  130   COLOUR 7 :  c% = c% + 1
  140   k% = BGET#A : dat(c%) = k%
  150   IF k% > 31 AND k% <> 127 THEN PRINT "  ";CHR$(k%);
  160 UNTIL EOF#A OR c% > 30
  170 @% = 3 : PRINT
  180 FOR r = 1 TO 31 : PRINT r; : NEXT r : PRINT'
  190 PTR# A=FN_ptr(dat)
  200 BPUT#A,byte
  210 CLOSE#A : RUN : REM To test
  220 END
  230 
  240 DEF FN_ptr(record)=base+record*length
 
User IP Logged

GordonSweet
Developer

member is offline

Avatar




PM


Posts: 23
xx Re: Using PTR#A
« Reply #4 on: Nov 23rd, 2008, 07:31am »

Sorry to pester you Richard, I fathomed it out. The bytes here only increment by 1
Gordon

Code:
      MODE 20 : COLOUR 0,255,255,255 : CLS
      COLOUR 7,0,0,0 : COLOUR 7
      f$ = "test.txt"
      
      T=OPENOUT f$
      PRINT#T, "Now is the time for all good men to come to the aid of the party."
      CLOSE#T
      PROCshow
      
      REM insert
      B=OPENUP f$
      PTR#B=4 : BPUT#B,35
      CLOSE#B
      PROCshow
      END
      
      DEF PROCshow
      A=OPENIN f$
      INPUT#A,dat$ : PRINT dat$
      CLOSE #A : ENDPROC
 
User IP Logged

Pages: 1  Notify Send Topic Print
« Previous Topic | Next Topic »

| |

This forum powered for FREE by Conforums ©
Terms of Service | Privacy Policy | Conforums Support | Parental Controls