(!******************************************************
Mosel User Guide Example Problems
=================================
file errio.mos
``````````````
Handling I/O errors during "initializations".
(c) 2011 Fair Isaac Corporation
author: Y.Colombani, Aug. 2011, rev. May 2015
*******************************************************!)
model "IO error handling"
uses 'mmsystem'
parameters
toread="errio.dat"
end-parameters
declarations
a,b,c:dynamic array(range) of integer
end-declarations
!******** Display counting information for a label ********
procedure dispcnt(l:string)
if getreadcnt(l)<1 then
writeln("label '", l, "' has not been initialised")
else
writeln(getreadcnt(l), " item(s) read for label '", l, "'")
end-if
end-procedure
!**********************************************************
! Check whether the file we want to access exists
if bittest(getfstat(toread),SYS_TYP)<>SYS_REG then
writeln("File '", toread, "' does not exist or is not a regular file")
exit(1)
end-if
! Read input data with modified I/O controls to obtain info about what is read
setparam("ioctrl", true) ! Enable IO control by the model
setparam("readcnt", true) ! Enable per label counting (see 'getreadcnt')
fopen("null:", F_ERROR) ! Optional: Disable error stream
initialisations from toread
a b c
end-initialisations
! Revert to default settings of controls
setparam("readcnt", false)
setparam("ioctrl", false)
fclose(F_ERROR) ! Stop error redirection (re-enable default)
! Check for errors during reading
! - Since we have enabled "ioctrl" the model does not stop when an error occurs
! during the initialization of data, it is therefore necessary to perform
! our own test of the "iostatus".
! - If the error stream has been redirected to 'null' no error message gets
! displayed by Mosel, without the redirection you should see a message.
iostatus:=getparam("iostatus")
if iostatus<>0 then
writeln("Read failed")
writeln("Total number of items read :", getparam("nbread"))
dispcnt("a")
dispcnt("b")
dispcnt("c")
end-if
end-model
With file 'errio.dat' as follows:
a:[(1) 1]
c:[(2) 2 (10) 5]
Output is:
>exe errio
Mosel: E-33: Initialization from file `errio.dat' failed for: `b'.
read failed
Total number of items read :3
1 item(s) read for label 'a'
label 'b' has not been initialised
2 item(s) read for label 'c'
Returned value: 0
|
(!******************************************************
Mosel User Guide Example Problems
=================================
file readdataerr.mos
````````````````````
Reading data with custom I/O error handling.
(c) 2011 Fair Isaac Corporation
author: S.Heipcke, Mar. 2011, rev. May 2015
*******************************************************!)
model "IO error handling"
uses "mmsystem"
declarations
REGION: set of string ! Set of customer regions
PLANT: set of string ! Set of plants
DEMAND: array(REGION) of real ! Demand at regions
TRANSCAP,DISTANCE: dynamic array(PLANT,REGION) of real ! Route data
FUELCOST: real ! Fuel cost per unit distance
end-declarations
public declarations
errtxt: text ! Text used as file to log errors
end-declarations
DATAFILE:= 'transprt.dat'
! Check whether the file we want to access exists
if bittest(getfstat(DATAFILE),SYS_TYP)<>SYS_REG then
writeln("File '", DATAFILE, "' does not exist or is not a regular file")
exit(1)
end-if
setparam("ioctrl", true) ! Application handles I/O errors
fopen("text:errtxt", F_ERROR) ! Redirect error stream to a file (text)
setparam("readcnt", true) ! Enable per label counting
initializations from DATAFILE
DEMAND
[DISTANCE,TRANSCAP] as 'ROUTE'
FUELCOST
end-initializations
fclose(F_ERROR) ! Stop error redirection
setparam("ioctrl", false) ! Revert to default I/O handling
setparam("readcnt", false)
if getparam("iostatus") <>0 then ! Something has gone wrong in last I/O
writeln("I/O error reading file '", DATAFILE, "': ", errtxt)
! Display the working directory
writeln("Working directory: ", getparam("workdir"))
! Display total entries read
writeln("Total number of entries read: ", getparam("nbread"))
! Check no. of entries read per label
forall(s in ["DEMAND","ROUTE","FUELCOST"])
if getreadcnt(s)=0 then
writeln("No entries read for label '", s, "'.")
else
writeln(getreadcnt(s), " entries read for label '", s, "'.")
end-if
end-if
end-model
|