equivalent of seek'ing in a file?

Raimo Niskanen raimo@REDACTED
Fri Aug 30 09:50:59 CEST 2002


So, what is the result of running your escript?

Anyway, try file:open(File, [read, append]), it might work as you
expected.

I should expect that the [read, write] flags will start writing from the
beginning of the file, see the erlang man page for the module 'file'
function 'open', then will io:get_line/2 read from the position where
the write stopped until newline, and then would a subsequent write
continue where io:get_line/2 stopped, ...

It might be so that the write and read positions are not the same, but I
think they are. Check the man pages for the Unix system calls 'read' and
'write'. The 'file' module tries to be Posix (Unix).

It might also be so that io:get_line/2 reads ahead and keeps data in a
buffer so that file:write/2 writes from the position where io:get_line/2
last read data with file:read/2. In general try to not mix read/write
calls from different abstraction levels, in this case 'file' vs 'io'.
Try using io:read/2 instead that should know of buffered data in the io
server process and compensate for it. This should give a more consistent
behaviour (unless there is a bug).

/ Raimo Niskanen, Erlang/OTP, Ericsson AB



Bengt Kleberg wrote:
> 
> greetings,
> 
> can i position the 'cursor' when read/writing to a file?
> 
> it seems (test included below) that after file:open( File, [read, write] ),
> io:fwrite() will put characters in the beginning of the file. until i
> have made the first io:get_line(). then characters will start writing
> at the end of the file.
> 
> is there some rule/documentation describing this?
> 
> bengt
> 
>   ------------------------------------------------------------------------
> #! /usr/bin/env escript
> 
> -export([main/1]).
> 
> main( Args ) ->
>         true = code:add_patha( '/home/eleberg/private/erlang/src' ),
>         File = file( Args ),
>         fill_file( File ),
>         display( File ),
>         readwrite( File ),
>         display( File ),
>         fill_file( File ),
>         writeread( File ),
>         display( File ),
>         halt().
> 
> fill_file( File ) ->
>         {ok, Io} = file:open( File, [write] ),
>         io:fwrite( Io, "line o1~n", [] ),
>         io:fwrite( Io, "line o2~n", [] ),
>         io:fwrite( Io, "line o3~n", [] ),
>         file:close( Io ).
> 
> readwrite( File ) ->
>         {ok, Io} = file:open( File, [read, write] ),
>         io:fwrite( "~s", [io:get_line( Io, '' )] ),
>         io:fwrite( Io, "line w1~n", [] ),
>         io:fwrite( "~s", [io:get_line( Io, '' )] ),
>         file:close( Io ).
> 
> writeread( File ) ->
>         {ok, Io} = file:open( File, [read, write] ),
>         io:fwrite( Io, "line w1~n", [] ),
>         io:fwrite( "~s", [io:get_line( Io, '' )] ),
>         io:fwrite( Io, "line w2~n", [] ),
>         file:close( Io ).
> 
> 
> display( File ) ->
>         io:fwrite( "~nFile ~p~n", [File] ),
>         {ok, Bin} = file:read_file( File ),
>         io:format( "~s~n", [binary_to_list( Bin )] ).
> 
> file( [] ) ->
>         "/tmp/afile";
> file( [File] ) ->
>         File.



More information about the erlang-questions mailing list