BBC BASIC for Windows
« Problem reading last record in a sequential file »

Welcome Guest. Please Login or Register.
Apr 5th, 2018, 9:54pm



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: Problem reading last record in a sequential file  (Read 1431 times)
PaddyColeman
New Member
Image


member is offline

Avatar




PM

Gender: Male
Posts: 7
xx Problem reading last record in a sequential file
« Thread started on: Aug 6th, 2014, 09:55am »

Hi Folks,

I am sure that this is me being thick and missing something obvious in BBC BASIC. I have written a small program that reads through a ZX BASIC source file and removes any REM lines from it. Here is the program:

Code:
      rem +--------------------------------------------------------------------+
      rem |                                                                    |
      rem | ZX BASIC REM REMOVAL PROGRAM                                       |
      rem | İ 2014 PeaSea Software                                             |
      rem |                                                                    |
      rem | Date          Ver    Description                                   |
      rem |                                                                    |
      rem | 05-Aug-2014   1.00   Initial version                               |
      rem |                                                                    |
      rem | 06-Aug-2014   1.01   Updated program version etc.                  |
      rem |                      Changed line to non bright red                |
      rem |                      Changed logo to non bright colours            |
      rem |                      Added check for missing input file            |
      rem |                      Displayed the record counters at the end of   |
      rem |                      the program so zero is shown when the input   |
      rem |                      file is empty                                 |
      rem |                      Changed "Program Completed" to "... Finished" |
      rem |                                                                    |
      rem +--------------------------------------------------------------------+

      rem +------------------+
      rem | Setup the screen |
      rem +------------------+

      mode 17 : off : cls
      colour 15 : print tab(0,0);"ZX BASIC REM REMOVER"
      colour 11 : print tab(33,0);"06-AUG";tab(0,23);"İ 2014";tab(10,23)"PeaSea Software";tab(34,23);"v1.01"
      colour 1 : print tab(0,1);"ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ"
      colour 130 : print tab(7,23);" "
      colour 134 : print tab(8,23);" "
      colour 14 : colour 128
      print tab(0,3);"Input File";tab(2,5);"TIMETABLE-V16.bas";tab(2, 6);"Records read    ="
      print tab(0,8);"Output File";tab(2,10);"STRIPPED.bas";tab(2,11);"Records written ="
      print tab(0,13);"REM File";tab(2,15);"REM.bas";tab(2,16);"Records written ="
      colour 10

      rem +----------------+
      rem | Open the files |
      rem +----------------+

      trace step on

      inFile% = openin("TIMETABLE-V16.bas")

      if inFile% = false then
        colour 1 : print tab(0,18);"ERROR: Input file not found"
        colour 15 : print tab(0,19);"Program Finished"
        end
      endif

      outFile% = openout("STRIPPED.bas")
      rmFile% = openout("REM.bas")

      rem +------------------------------+
      rem | Initialise the file counters |
      rem +------------------------------+

      inLine% = 0
      outLine% = 0
      rmLine% = 0

      rem +-----------------------------------+
      rem | Read the input file until the end |
      rem +-----------------------------------+

      source$ = ""
      read#(inFile%),source$

      while eof#(inFile%) = false
  
        inLine% = inLine% + 1
        print tab(20,6);inLine%
  
        rem +--------------------------------------------------+
        rem | If not a REM - write the line to the output file |
        rem | If a REM - write the line to the REM file        |
        rem +--------------------------------------------------+
  
        if instr(source$," REM ") = false then
          print#(outFile%),source$
          outLine% = outLine% + 1
          print tab(20,11);outLine%
        else
          print#(rmFile%),source$
          rmLine% = rmLine% + 1
          print tab(20,16);rmLine%
        endif
  
        source$ = ""
        read#(inFile%),source$
  
      endwhile

      rem +-----------------+
      rem | Close the files |
      rem +-----------------+

      close#(inFile%)
      close#(outFile%)
      close#(rmFile%)

      print tab(20,6);inLine%;tab(20,11);outLine%;tab(20,16);rmLine%
      colour 15 : print tab(0,19);"Program Finished"

      on : end
 


I have aminated through the code and found that the last line of source in the input file is not read, instead source$ remains empty.

Here is a test input file:

Code:
100 REM \:'\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\':
110 REM \: MODEL RAILWAY TIMETABLE\ :
120 REM \: \* 2012 PeaSea Software \ :
130 REM \: 1.0 : 12-NOV-2010      \ :
140 REM \: 1.1 : 26-MAY-2011      \ :
150 REM \: 1.2 : 25-JUL-2011      \ :
160 REM \: 1.3 : 28-DEC-2011      \ :
240 GO TO 3820
250 REM 
260 REM Class|UIC/Whytes|No|Name|Power (D,MT,P,F)|Livery
270 REM 
280 LET a$="": IF i$(34)<"X" THEN LET a$=STR$  CODE i$(34)+"/"
290 IF i$(35)<"X" THEN LET a$=a$+STR$  CODE i$(35)+"MT"
300 IF i$(36)<"X" THEN LET a$=a$+STR$  CODE i$(36)+"P"
310 IF i$(37)<"X" THEN LET a$=a$+STR$  CODE i$(37)+"F"
320 LPRINT AT 9,l;v$( CODE i$(1),2 TO 5);AT 32,l;v$( CODE i$(3)+v(2),2 TO 8);AT 67,l;i$(4 TO 8);AT 97,l;i$(10 TO 32);AT 197,l;a$;AT 227,l;v$(v(3)+INT ( CODE i$(33)/16),2 TO 3): RETURN 
330 LET a=1 


So in this case line 330 is not read by the BBC BASIC program.

Any ideas?

Many thanks

Paddy
User IP Logged

PaddyColeman
New Member
Image


member is offline

Avatar




PM

Gender: Male
Posts: 7
xx Re: Problem reading last record in a sequential fi
« Reply #1 on: Aug 6th, 2014, 10:00am »

Ah, I think the solution may be to use GET$# rather than READ# as the input file is probably line terminated with CR/LF - I will check and test.

Many thanks

Paddy
User IP Logged

rtr
Guest
xx Re: Problem reading last record in a sequential fi
« Reply #2 on: Aug 6th, 2014, 12:47pm »

on Aug 6th, 2014, 10:00am, PaddyColeman wrote:
Ah, I think the solution may be to use GET$# rather than READ# as the input file is probably line terminated with CR/LF - I will check and test.

Yes, GET$# will return the remaining characters in the file, even if no terminator is present, whereas INPUT# (and READ#) will return an empty string if the CR terminator is not found.

Check out the FNreadline() function here:

http://bb4w.wikispaces.com/Reading+and+writing+plain+text+files

Richard.
User IP Logged

PaddyColeman
New Member
Image


member is offline

Avatar




PM

Gender: Male
Posts: 7
xx Re: Problem reading last record in a sequential fi
« Reply #3 on: Aug 6th, 2014, 1:05pm »

on Aug 6th, 2014, 12:47pm, Richard Russell wrote:
Yes, GET$# will return the remaining characters in the file, even if no terminator is present, whereas INPUT# (and READ#) will return an empty string if the CR terminator is not found.

Check out the FNreadline() function here:

http://bb4w.wikispaces.com/Reading+and+writing+plain+text+files

Richard.


Thanks Richard. Just tried GET$# and this does not work either as my input file is terminated with CR/LF (&0D0A).

I will check out the function you highlighted to see if that helps.

Many thanks

Paddy
User IP Logged

PaddyColeman
New Member
Image


member is offline

Avatar




PM

Gender: Male
Posts: 7
xx Re: Problem reading last record in a sequential fi
« Reply #4 on: Aug 6th, 2014, 1:20pm »

Hi Richard,

Thank you for the link and this seems to be what I need for my particular input file format. However, the IDE will not allow me to enter:

Code:
      def fn_readline(f%)
      local a$
      repeat
        a$=get$#(f%)
      until a$<>"" or eof#(f%)
      =a$ 


The "def" part seems not to be accepted. I have tried defining the function at the beginning and end of the source program.

Any ideas?

Many thanks

Paddy
« Last Edit: Aug 6th, 2014, 1:22pm by PaddyColeman » User IP Logged

PaddyColeman
New Member
Image


member is offline

Avatar




PM

Gender: Male
Posts: 7
xx Re: Problem reading last record in a sequential fi
« Reply #5 on: Aug 6th, 2014, 1:29pm »

Tried putting the function at the end and it seems to be working now. The DEF bit is still highlighted as a string but may be that is just an IDE funny.

Many thanks

Paddy
User IP Logged

PaddyColeman
New Member
Image


member is offline

Avatar




PM

Gender: Male
Posts: 7
xx Re: Problem reading last record in a sequential fi
« Reply #6 on: Aug 6th, 2014, 1:54pm »

Works fine - thanks Richard. To close the thread here is my completed wee program.

Code:
      rem +-------------------------------------------------------------------+
      rem |                                                                   |
      rem | Program : ZX BASIC REM REMOVAL                                    |
      rem | Author  : İ 2014 PeaSea Software                                  |
      rem |                                                                   |
      rem | Date          Ver    Description                                  |
      rem |                                                                   |
      rem | 05-Aug-2014   1.00   Initial version                              |
      rem |                                                                   |
      rem | 06-Aug-2014   1.01   Updated program version etc.                 |
      rem |                      Changed line to non bright red               |
      rem |                      Changed logo to non bright colours           |
      rem |                      Added check for missing input file           |
      rem |                      Displayed record counters at program end     |
      rem |                      Changed "Program Completed" to "...Finished" |
      rem |                      Read/write code now supports CR & LF         |
      rem |                                                                   |
      rem +-------------------------------------------------------------------+

      rem +-------------------------------------------------------------------+
      rem | Setup the screen                                                  |
      rem +-------------------------------------------------------------------+

      mode 17 : off : cls
      colour 15 : print tab(0,0);"ZX BASIC REM REMOVER"
      colour 11 : print tab(33,0);"06-AUG";tab(0,23);"İ 2014";tab(10,23)"PeaSea Software";tab(34,23);"v1.01"
      colour 1 : print tab(0,1);"ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ"
      colour 130 : print tab(7,23);" "
      colour 134 : print tab(8,23);" "
      colour 14 : colour 128
      print tab(0,3);"Input File";tab(2,5);"TIMETABLE-V16.bas";tab(2, 6);"Records read    ="
      print tab(0,8);"Output File";tab(2,10);"STRIPPED.bas";tab(2,11);"Records written ="
      print tab(0,13);"REM File";tab(2,15);"REM.bas";tab(2,16);"Records written ="
      colour 10

      rem +-------------------------------------------------------------------+
      rem | Open the files                                                    |
      rem +-------------------------------------------------------------------+

      rem trace step on

      inFile% = openin("TIMETABLE-V16.bas")

      if inFile% = false then
        colour 1 : print tab(0,18);"ERROR: Input file not found"
        colour 15 : print tab(0,19);"Program Finished"
        end
      endif

      outFile% = openout("STRIPPED.bas")
      rmFile% = openout("REM.bas")

      rem +-------------------------------------------------------------------+
      rem | Initialise the record counters                                    |
      rem +-------------------------------------------------------------------+

      inLine% = 0
      outLine% = 0
      rmLine% = 0

      rem +-------------------------------------------------------------------+
      rem | Read the input file until the end                                 |
      rem | FN_ReadLineCRLF reads a non blank line from the text file         |
      rem | Write the line appending a LF (&0A) to the end                    |
      rem +-------------------------------------------------------------------+

      source$ = fn_ReadLineCRLF(inFile%)

      while eof#(inFile%) = false
  
        inLine% = inLine% + 1
        print tab(20,6);inLine%
  
        rem +-----------------------------------------------------------------+
        rem | If not a REM - write the line to the output file                |
        rem | If a REM - write the line to the REM file                       |
        rem +-----------------------------------------------------------------+
  
        if instr(source$," REM ") = false then
          print#(outFile%),source$
          bput#(outFile%),&0A
          outLine% = outLine% + 1
          print tab(20,11);outLine%
        else
          print#(rmFile%),source$
          bput#(rmFile%),&0A
          rmLine% = rmLine% + 1
          print tab(20,16);rmLine%
        endif
  
        source$ = fn_ReadLineCRLF(inFile%)
  
      endwhile

      rem +-------------------------------------------------------------------+
      rem | Close the files                                                   |
      rem +-------------------------------------------------------------------+

      close#(inFile%)
      close#(outFile%)
      close#(rmFile%)

      rem +-------------------------------------------------------------------+
      rem | Display record counters and finish                                |
      rem +-------------------------------------------------------------------+

      print tab(20,6);inLine%;tab(20,11);outLine%;tab(20,16);rmLine%
      colour 15 : print tab(0,19);"Program Finished"

      on : end

      rem +-------------------------------------------------------------------+
      rem | Function : _ReadLineCRLF                                          |
      rem | Purpose  : Reads a line from a text file that is terminated by CR |
      rem |            and LF.  Any blank lines are ignored.                  |
      rem +-------------------------------------------------------------------+

      def fn_ReadLineCRLF(f%)
      local a$
      repeat
        a$=get$#(f%)
      until a$<>"" or eof#(f%)
      =a$ 


Many thanks

Paddy
« Last Edit: Aug 6th, 2014, 1:55pm by PaddyColeman » User IP Logged

rtr
Guest
xx Re: Problem reading last record in a sequential fi
« Reply #7 on: Aug 6th, 2014, 2:22pm »

on Aug 6th, 2014, 1:29pm, PaddyColeman wrote:
The DEF bit is still highlighted as a string but may be that is just an IDE funny.

DEF is highlighted (by default) in red and strings in magenta. If they look the same to you perhaps you suffer from a degree of colour-blindness. tongue

You can always change the colours, to suit your personal preference: 'Options... Set Colours...' menu selection.

Richard.
User IP Logged

PaddyColeman
New Member
Image


member is offline

Avatar




PM

Gender: Male
Posts: 7
xx Re: Problem reading last record in a sequential fi
« Reply #8 on: Aug 6th, 2014, 2:54pm »

Thanks Richard - lots to learn. grin

Thank you for your excellent support though.

Kind regards

Paddy
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