<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>[a5] al_fopen trouble (using PhysFS)</title>
		<link>http://www.allegro.cc/forums/view/608366</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sun, 18 Sep 2011 19:28:20 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="source-code snippet"><div class="inner"><pre><a href="http://www.allegro.cc/manual/ALLEGRO_FILE"><span class="a">ALLEGRO_FILE</span></a> <span class="k3">*</span>file <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_fopen"><span class="a">al_fopen</span></a><span class="k2">(</span><span class="s">"level.txt"</span>, <span class="s">"wb"</span><span class="k2">)</span><span class="k2">;</span>
    <span class="k1">if</span><span class="k2">(</span>file<span class="k3">=</span><span class="k3">=</span><span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>


        std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"fail"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>

    <span class="k2">}</span>
</pre></div></div><p>

Hello, I don&#39;t get why this outputs fail <img src="http://www.allegro.cc/forums/smileys/sad.gif" alt=":(" /><br />It should create a file for writing, right? Even if one doesn&#39;t exist?<br />So... what could possibly cause it to do that?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (SpectreNectar)</author>
		<pubDate>Sat, 17 Sep 2011 08:24:46 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>If it is a text file, you shouldn&#39;t use &quot;wb&quot;, but &quot;w&quot; for text mode.</p><p>As for why it fails - you might not have write permission to the directory it is trying to create a file in.</p><p>You said you were using PhysFS, so what are you actually trying to write to? A zip file?</p><p>Show more code.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sat, 17 Sep 2011 08:36:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>This should be all the code relevant for physfs (if I remember correctly):</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="k1">bool</span> setup<span class="k2">(</span> Assets<span class="k3">&amp;</span> v <span class="k2">)</span> <span class="k2">{</span>
<span class="number">  2</span>
<span class="number">  3</span>    <a href="http://www.allegro.cc/manual/al_set_physfs_file_interface"><span class="a">al_set_physfs_file_interface</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  4</span>
<span class="number">  5</span>    <span class="c">/* Set up PhysicsFS. */</span>
<span class="number">  6</span>    <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>PHYSFS_init<span class="k2">(</span><span class="n">0</span><span class="k2">)</span><span class="k2">)</span> std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"failed initializing"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number">  7</span>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>PHYSFS_addToSearchPath<span class="k2">(</span><span class="s">"data"</span>, <span class="n">1</span><span class="k2">)</span><span class="k2">)</span> std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"failed adding search path"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number">  8</span>
<span class="number">  9</span>  ...
<span class="number"> 10</span><span class="k2">}</span>
<span class="number"> 11</span>
<span class="number"> 12</span><span class="k1">bool</span> deinit<span class="k2">(</span> Assets<span class="k3">&amp;</span> v <span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 13</span>
<span class="number"> 14</span>    PHYSFS_deinit<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span>
<span class="number"> 16</span>    ...
<span class="number"> 17</span>
<span class="number"> 18</span><span class="k2">}</span>
</div></div><p>

I can&#39;t find other places that messes with file interfaces by searching. There shouldn&#39;t be any either.<br />I&#39;m attempting to write to an ordinary folder. Or... actually I&#39;m not sure. I&#39;m writing to the root directory and considering the nature of physfs that could be several places. I think.<br />I still don&#39;t know what to do though.<br />Here&#39;s what I&#39;m trying to do:</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="k1">void</span> eEditor::save<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  2</span>
<span class="number">  3</span>    <a href="http://www.allegro.cc/manual/ALLEGRO_FILE"><span class="a">ALLEGRO_FILE</span></a> <span class="k3">*</span>file <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_fopen"><span class="a">al_fopen</span></a><span class="k2">(</span><span class="s">"level.txt"</span>, <span class="s">"wb"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  4</span>    <span class="k1">if</span><span class="k2">(</span>file<span class="k3">=</span><span class="k3">=</span><span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  5</span>
<span class="number">  6</span>
<span class="number">  7</span>        std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"fail"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number">  8</span>
<span class="number">  9</span>    <span class="k2">}</span>
<span class="number"> 10</span>
<span class="number"> 11</span>    std::stringstream ss<span class="k2">;</span>
<span class="number"> 12</span>
<span class="number"> 13</span>    ss <span class="k3">&lt;</span><span class="k3">&lt;</span> draw_list_len<span class="k2">;</span>
<span class="number"> 14</span>
<span class="number"> 15</span>    <a href="http://www.allegro.cc/manual/al_fputs"><span class="a">al_fputs</span></a><span class="k2">(</span>file, ss.str<span class="k2">(</span><span class="k2">)</span>.c_str<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span>    <span class="c">//al_fputs(file, " ");</span>
<span class="number"> 17</span>    <span class="c">//al_fwrite(file, " ", strlen(" "));</span>
<span class="number"> 18</span>
<span class="number"> 19</span>    <a href="http://www.allegro.cc/manual/al_fclose"><span class="a">al_fclose</span></a><span class="k2">(</span>file<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 20</span>
<span class="number"> 21</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (SpectreNectar)</author>
		<pubDate>Sat, 17 Sep 2011 08:47:30 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Try calling PHYSFS_init before calling al_set_physfs_file_interface.</p><p>Make sure your current working directory is correct, and make sure that the &#39;data&#39; folder exists.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sat, 17 Sep 2011 09:18:37 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I tried doing as you suggested but it was still the same result.</p><p>I think my current working directory is wrong like you suggest actually. But I&#39;m not sure how to set it or figure out what it is. The data dir exists - I&#39;m already loading resources in and they are in that dir. I actually copy pasted the path originally.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (SpectreNectar)</author>
		<pubDate>Sat, 17 Sep 2011 09:37:29 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Try al_set_standard_file_interface() before doing that.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Sat, 17 Sep 2011 09:43:22 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>If you&#39;re using gcc, you can use <span class="source-code"><a href="http://www.delorie.com/djgpp/doc/libc/libc_386.html" target="_blank">getcwd</a><span class="k2">(</span><span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span> buffer , <span class="k1">int</span> buf_size<span class="k2">)</span><span class="k2">;</span></span> to check the current working directory.</p><p>A5 has functions to change the current working directory and find the full path to your executable.<br />See<br /><span class="source-code"><a href="http://www.allegro.cc/manual/al_get_standard_path"><span class="a">al_get_standard_path</span></a></span><br />and<br /><span class="source-code"><a href="http://www.allegro.cc/manual/al_change_directory"><span class="a">al_change_directory</span></a></span>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sat, 17 Sep 2011 09:44:09 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>If I call al_set_standard_file_interface() just before al_fopen then it DOES work, but the program crashes because I need PhysFS to display the font and graphics of the closing dialog I use (and basically everything with resources everywhere).</p><p>My problem indeed seems to be figuring out how to open a file for writing using the physfs file interface.</p><p>So I&#39;m stuck again with this and don&#39;t know where to go from here:</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="k1">void</span> eEditor::save<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  2</span>
<span class="number">  3</span>    <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_change_directory"><span class="a">al_change_directory</span></a><span class="k2">(</span><span class="s">"/lvl"</span><span class="k2">)</span><span class="k2">)</span> std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"no change of dir"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span> <span class="c">//Outputs</span>
<span class="number">  4</span>
<span class="number">  5</span>    <a href="http://www.allegro.cc/manual/ALLEGRO_FILE"><span class="a">ALLEGRO_FILE</span></a> <span class="k3">*</span>file <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_fopen"><span class="a">al_fopen</span></a><span class="k2">(</span><span class="s">"level.bin"</span>, <span class="s">"wb"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  6</span>    <span class="k1">if</span><span class="k2">(</span>file<span class="k3">=</span><span class="k3">=</span><span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  7</span>
<span class="number">  8</span>        ALLEGRO_PATH <span class="k3">*</span>path <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_standard_path"><span class="a">al_get_standard_path</span></a><span class="k2">(</span>ALLEGRO_RESOURCES_PATH<span class="k2">)</span><span class="k2">;</span> 
<span class="number">  9</span>
<span class="number"> 10</span>        <span class="k1">char</span> <span class="k3">*</span> dir <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_current_directory"><span class="a">al_get_current_directory</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span>
<span class="number"> 12</span>        std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"fail: "</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <a href="http://www.allegro.cc/manual/al_path_cstr"><span class="a">al_path_cstr</span></a><span class="k2">(</span>path, ALLEGRO_NATIVE_PATH_SEP<span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span> <span class="c">//Outputs the directory of the executable</span>
<span class="number"> 13</span>        std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"info: "</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> dir <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span> <span class="c">//Outputs /</span>
<span class="number"> 14</span>
<span class="number"> 15</span>        <a href="http://www.allegro.cc/manual/al_free"><span class="a">al_free</span></a><span class="k2">(</span>dir<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span>
<span class="number"> 17</span>        <a href="http://www.allegro.cc/manual/al_destroy_path"><span class="a">al_destroy_path</span></a><span class="k2">(</span>path<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 18</span>
<span class="number"> 19</span>
<span class="number"> 20</span>    <span class="k2">}</span>
<span class="number"> 21</span>
<span class="number"> 22</span>    <a href="http://www.allegro.cc/manual/al_fclose"><span class="a">al_fclose</span></a><span class="k2">(</span>file<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 23</span>
<span class="number"> 24</span><span class="k2">}</span>
</div></div><p>

Also a small change here...</p><div class="source-code snippet"><div class="inner"><pre><span class="c">/* Set up PhysicsFS. */</span>
    <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>PHYSFS_init<span class="k2">(</span><span class="n">0</span><span class="k2">)</span><span class="k2">)</span> std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"failed initializing"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
    <span class="k1">else</span> <span class="k2">{</span>

        <a href="http://www.allegro.cc/manual/al_set_standard_file_interface"><span class="a">al_set_standard_file_interface</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
        <a href="http://www.allegro.cc/manual/al_set_physfs_file_interface"><span class="a">al_set_physfs_file_interface</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>

        <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>PHYSFS_addToSearchPath<span class="k2">(</span><span class="s">"data"</span>, <span class="n">1</span><span class="k2">)</span><span class="k2">)</span> std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"failed adding search path"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
        <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>PHYSFS_addToSearchPath<span class="k2">(</span><span class="s">"lvl"</span>, <span class="n">1</span><span class="k2">)</span><span class="k2">)</span> std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"failed adding search path2"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
    <span class="k2">}</span>
</pre></div></div><p>


EDIT:<br />DO I need to use this:<br />ALLEGRO_FILE *file = al_create_file_handle(al_get_new_file_interface(), 0);<br />?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (SpectreNectar)</author>
		<pubDate>Sat, 17 Sep 2011 16:41:02 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I think you need to setup the main filesystem as a mount in PhysFS or you can&#39;t access the main filesystem. &quot;Standard Path&#39;s&quot; mean nothing in PhysFS if you don&#39;t have the filesystem &quot;mounted&quot;.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Sun, 18 Sep 2011 06:25:20 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You can switch back to the physfs interface at any time with al_set_physfs_file_interface();</p><p>... that&#39;s probably not ideal, something like Thomas said might work better, but I just switch back and forth as needed.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Sun, 18 Sep 2011 07:08:04 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Alright I&#39;ll switch back and forth from interfaces until I learn how setting up mounts work. It wont be much of a problem in this case really.</p><p>Thanks very much for your comments/advice.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (SpectreNectar)</author>
		<pubDate>Sun, 18 Sep 2011 19:28:20 +0000</pubDate>
	</item>
</rss>
