Erlang Central

Difference between revisions of "Save Data to a File"

From ErlangCentral Wiki

m (Linked functions)
(replace unnecessary reimplementation of file:write_file/2 with that function, and then add a tiny bit about saving consultable Erlang data structures, to make up for the blank page)
Line 5: Line 5:
 
== Solution ==
 
== Solution ==
  
<code>
+
Where 'some data' is simply a list, you have this simple solution:
save_to_file(PathToFile, Data) ->
+
case file:open(PathToFile, [read, write]) of
+
{ok, IoDevice} ->
+
case io:fwrite(IoDevice, "~s", [Data]) of
+
ok ->
+
file:close(IoDevice),
+
io:fwrite("File successfully written to ~s~n", [PathToFile]),
+
ok;
+
_ ->
+
file:close(IoDevice),
+
io:fwrite("File NOT written to ~s~n", [PathToFile]),
+
{error, "File not written"}
+
end;
+
{error, Reason} ->
+
{error, Reason}
+
end.
+
</code>
+
 
+
This function accepts two arguments - path to the file we want the data to be written to (the file need not exist beforehand) and the data we wish to save.
+
 
+
== Discussion ==
+
 
+
Step by step the function does the following:
+
  
 
<code>
 
<code>
case file:open(PathToFile, [read, write]) of
+
file:write_file(Path, Data).
 
</code>
 
</code>
  
We attempt to open the file. The [http://www.erlang.se/doc/doc-5.5/lib/kernel-2.11/doc/html/file.html#open/2 file:open/2] function returns either {ok, IODevice} on success or {error, Reason} on failure. So, we check for both conditions.
+
But if you want to save an Erlang data structure, to perhaps file:consult/1 later, you have this slightly more complex solution:
 
+
In case of success we write data to the file (in this case we assume that data is actually a string, hence the "~s" switch):
+
<code>
+
case io:fwrite(IoDevice, "~s", [Data]) of
+
</code>
+
  
We further check for return codes from the [http://www.erlang.se/doc/doc-5.5/lib/stdlib-1.14/doc/html/io.html#fwrite/3 io:fwrite/3] function and never forget to close the file:
 
 
<code>
 
<code>
file:close(IoDevice)
+
file:write_file(Path,io_lib:fwrite("~p.\n",[Data])).
 
</code>
 
</code>
  
 
[[Category:CookBook]][[Category:FileRecipes]]
 
[[Category:CookBook]][[Category:FileRecipes]]

Revision as of 14:22, 24 September 2006

Problem

You want to save some data to a file.

Solution

Where 'some data' is simply a list, you have this simple solution:

file:write_file(Path, Data).

But if you want to save an Erlang data structure, to perhaps file:consult/1 later, you have this slightly more complex solution:

file:write_file(Path,io_lib:fwrite("~p.\n",[Data])).