Erlang Language
Файловый ввод-вывод
Поиск…
Чтение из файла
Предположим, у вас есть файл lyrics.txt, который содержит следующие данные:
summer has come and passed
the innocent can never last
wake me up when september ends
Прочитайте весь файл за раз
Используя file:read_file(File)
, вы можете прочитать весь файл. Это атомная операция:
1> file:read_file("lyrics.txt").
{ok,<<"summer has come and passed\r\nthe innocent can never last\r\nWake me up w
hen september ends\r\n">>}
Прочитайте по одной строке за раз
io:get_line
считывает текст до строки новой строки или конца файла.
1> {ok, S} = file:open("lyrics.txt", read).
{ok,<0.57.0>}
2> io:get_line(S, '').
"summer has come and passed\n"
3> io:get_line(S, '').
"the innocent can never last\n"
4> io:get_line(S, '').
"wake me up when september ends\n"
5> io:get_line(S, '').
eof
6> file:close(S).
ok
Чтение со случайным доступом
file:pread(IoDevice, Start, Len)
читает от Start
столько же, сколько Len
из IoDevice
.
1> {ok, S} = file:open("lyrics.txt", read).
{ok,<0.57.0>}
2> file:pread(S, 0, 6).
{ok,"summer"}
3> file:pread(S, 7, 3).
{ok,"has"}
Запись в файл
Напишите по одной строке за раз
Откройте файл с режимом write
и используйте io:format/2
:
1> {ok, S} = file:open("fruit_count.txt", [write]).
{ok,<0.57.0>}
2> io:format(S, "~s~n", ["Mango 5"]).
ok
3> io:format(S, "~s~n", ["Olive 12"]).
ok
4> io:format(S, "~s~n", ["Watermelon 3"]).
ok
5>
Результатом будет файл с именем fruit_count.txt со следующим содержимым:
Mango 5
Olive 12
Watermelon 3
Обратите внимание, что открытие файла в режиме записи создаст его, если он еще не существует в файловой системе.
Также обратите внимание, что использование опции write
с file:open/2
приведет к усечению файла (даже если вы ничего не напишите в нем). Чтобы предотвратить это, откройте файл в режиме [read,write]
или [append]
.
Напишите весь файл сразу
file:write_file(Filename, IO)
- самая простая функция для записи файла сразу. Если файл уже существует, он будет перезаписан, иначе он будет создан.
1> file:write_file("fruit_count.txt", ["Mango 5\nOlive 12\nWatermelon 3\n"
]).
ok
2> file:read_file("fruit_count.txt").
{ok,<<"Mango 5\nOlive 12\nWatermelon 3\n">>}
3>
Запись со случайным доступом
Для записи произвольного доступа используется file:pwrite(IoDevice, Location, Bytes)
. Если вы хотите заменить некоторую строку в файле, этот метод полезен.
Предположим, вы хотите изменить «Olive 12» на «Apple 15» в файле, созданном выше.
1> {ok, S} = file:open("fruit_count.txt", [read, write]).
{ok,{file_descriptor,prim_file,{#Port<0.412>,676}}}
2> file:pwrite(S, 8, ["Apple 15\n"]).
ok
3> file:read_file("fruit_count.txt").
{ok,<<"Mango 5\nApple 15\nWatermelon 3">>}
4> file:close(S).
ok
5>