RosettaCodeData/Task/Remove-lines-from-a-file/ALGOL-68/remove-lines-from-a-file.alg
2017-09-25 22:28:19 +02:00

121 lines
4.6 KiB
Text

# removes the specified number of lines from a file, starting at start line (numbered from 1) #
# returns TRUE if successful, FALSE otherwise #
PROC remove lines = ( STRING file name, INT start line, INT number of lines )BOOL:
IF number of lines < 0 OR start line < 1
THEN
# invalid parameters #
print( ( "number of lines must be >= 0 and start line must be >= 1", newline ) );
FALSE
ELIF FILE temp file;
create( temp file, stand back channel ) /= 0
THEN
# unable to create a temporary output file #
print( ( "Unable to create temporary file", newline ) );
FALSE
ELIF NOT reset possible( temp file )
THEN
# rewinding the temporary file is not possible #
# we would have to get its name ( with "idf( temp file )", close it and re-open it #
print( ( "Temp file is not rewindable", newline ) );
FALSE
ELIF FILE input file;
open( input file, file name, stand in channel ) /= 0
THEN
# failed to open the file #
print( ( "Unable to open """ + file name + """", newline ) );
FALSE
ELSE
# files opened OK #
BOOL at eof := FALSE;
# set the EOF handler for the original file #
on logical file end( input file
, ( REF FILE f )BOOL:
BEGIN
# note that we reached EOF on the latest read #
at eof := TRUE;
# return TRUE so processing can continue #
TRUE
END
);
# copy the input file to the temp file #
WHILE STRING line;
get( input file, ( line, newline ) );
NOT at eof
DO
put( temp file, ( line, newline ) )
OD;
# copy the temp file back to the input, removing the specified lines #
close( input file );
IF open( input file, file name, stand out channel ) /= 0
THEN
# failed to open the original file for output #
print( ( "Unable to open ", file name, " for output", newline ) );
FALSE
ELSE
# opened OK - copy the temporary file #
reset( temp file ); # rewinds the input file #
at eof := FALSE;
on logical file end( temp file
, ( REF FILE f )BOOL:
BEGIN
# note that we reached EOF on the latest read #
at eof := TRUE;
# return TRUE so processing can continue #
TRUE
END
);
INT end line = ( start line - 1 ) + number of lines;
INT line number := 0;
WHILE STRING line;
get( temp file, ( line, newline ) );
NOT at eof
DO
# have another line #
line number +:= 1;
IF line number < start line OR line number > end line
THEN
put( input file, ( line, newline ) )
FI
OD;
# close the files #
close( input file );
scratch( temp file );
IF line number < start line
THEN
# didn't find the start line #
print( ( "Specified start line (", whole( start line, 0 ), ") not in ", file name, newline ) );
FALSE
ELIF line number < end line
THEN
# the ending line was not in the file #
print( ( "Final omitted line not in the file ", file name, newline ) );
FALSE
ELSE
# successful operation #
TRUE
FI
FI
FI # remove lines # ;
# test the line removal #
BEGIN
FILE t;
open( t, "test.txt", stand out channel );
print( ( "Before...", newline ) );
FOR i TO 10 DO
STRING line = whole( i, - ( ( i MOD 5 ) + 3 ) );
put( t, ( line, newline ) );
print( ( line, newline ) )
OD;
close( t );
remove lines( "test.txt", 2, 3 );
print( ( "After...", newline ) );
open( t, "test.txt", stand in channel );
FOR i TO 7 DO
STRING line;
get( t, ( line, newline ) );
print( ( line, newline ) )
OD;
close( t );
print( ( "----", newline ) )
END