| 
 
| 
|  Author | Topic: Problem reading last record in a sequential file  (Read 1431 times) |  |  
| 
| 
| PaddyColeman New Member
 
 
 member is offline
 
  
 
 
 
 
  
 Gender:
  Posts: 7
 
 | 
|  | 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
 
 |  
| 
|  |  Logged |  
 |  |  |  
| 
| 
| PaddyColeman New Member
 
 
 member is offline
 
  
 
 
 
 
  
 Gender:
  Posts: 7
 
 | 
|  | 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
 
 |  
| 
|  |  Logged |  
 |  |  |  
| 
| 
| rtr Guest
 
 | 
|  | 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.
 |  
| 
|  |  Logged |  
 |  |  |  
| 
| 
| PaddyColeman New Member
 
 
 member is offline
 
  
 
 
 
 
  
 Gender:
  Posts: 7
 
 | 
|  | 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:
 
 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
 
 |  
| 
|  |  Logged |  
 |  |  |  
| 
| 
| PaddyColeman New Member
 
 
 member is offline
 
  
 
 
 
 
  
 Gender:
  Posts: 7
 
 | 
|  | 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
 
 |  
| 
 |  |  |  
| 
| 
| PaddyColeman New Member
 
 
 member is offline
 
  
 
 
 
 
  
 Gender:
  Posts: 7
 
 | 
|  | 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
 
 |  
| 
|  |  Logged |  
 |  |  |  
| 
| 
| PaddyColeman New Member
 
 
 member is offline
 
  
 
 
 
 
  
 Gender:
  Posts: 7
 
 | 
|  | 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
 
 |  
| 
 |  |  |  
| 
| 
| rtr Guest
 
 | 
|  | 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.
  
 You can always change the colours, to suit your personal preference: 'Options... Set Colours...' menu selection.
 
 Richard.
 |  
| 
|  |  Logged |  
 |  |  |  
| 
| 
| PaddyColeman New Member
 
 
 member is offline
 
  
 
 
 
 
  
 Gender:
  Posts: 7
 
 | 
|  | Re: Problem reading last record in a sequential fi « Reply #8 on: Aug 6th, 2014, 2:54pm »
 |  |  Thanks Richard - lots to learn.
  
 Thank you for your excellent support though.
 
 Kind regards
 
 Paddy
 
 |  
| 
|  |  Logged |  
 |  |  |  
 |