<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>C File Handling</title>
		<link>http://www.allegro.cc/forums/view/589124</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Tue, 19 Dec 2006 01:17:18 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>File handling and string manipulation has always been a blindspot for me, as far as C is concerned. Basically, I&#39;ve got a textfile that contains information on items within my game. I want to store this information as a plain textfile so that other people can edit it easily. </p><p>Here&#39;s some messy code that does work, but I feel there are a few problems with it. My first question: when using fgets, is it safe to just have a global buffer size (1000), like the one I&#39;m using already? Or should I be specifying dependant on the string I&#39;m grabbing (name, desc, etc). Is fgets even the best solution?</p><p>Also: the strings copy with a strange character at the end (^). I&#39;m assuming this is is because the string isn&#39;t null terminated. But as I stated earlier, I really want to create and edit this file via a text editor (read: Notepad). What can I do?</p><p>An example file layout:</p><div class="source-code snippet"><div class="inner"><pre>The item name.
Some fantastic description<span class="k3">!</span>
<span class="n">1</span>
</pre></div></div><p>

Some code:</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td>&#160;</td></tr><tr><td class="number">2</td><td><span class="k1">typedef</span> <span class="k1">struct</span> <span class="k2">{</span></td></tr><tr><td class="number">3</td><td>        </td></tr><tr><td class="number">4</td><td>        <span class="k1">int</span> stackable<span class="k2">;</span>        </td></tr><tr><td class="number">5</td><td>        <span class="k1">char</span> name<span class="k2">[</span><span class="n">256</span><span class="k2">]</span>, desc<span class="k2">[</span><span class="n">512</span><span class="k2">]</span><span class="k2">;</span>     </td></tr><tr><td class="number">6</td><td>        </td></tr><tr><td class="number">7</td><td><span class="k2">}</span> Item<span class="k2">;</span></td></tr><tr><td class="number">8</td><td>&#160;</td></tr><tr><td class="number">9</td><td>Item items<span class="k2">[</span>max_item_num<span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">10</td><td>&#160;</td></tr><tr><td class="number">11</td><td><span class="k1">int</span> setup_objects<span class="k2">(</span> <span class="k1">char</span> <span class="k3">*</span>filename <span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">12</td><td>     </td></tr><tr><td class="number">13</td><td>    FILE <span class="k3">*</span>f <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_337.html" target="_blank">fopen</a><span class="k2">(</span>filename,<span class="s">"r"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td>    <span class="k1">char</span> i_string<span class="k2">[</span><span class="n">1000</span><span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">15</td><td>    <span class="k1">int</span> item_num <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">16</td><td>&#160;</td></tr><tr><td class="number">17</td><td>    <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>f<span class="k2">)</span> <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td>    </td></tr><tr><td class="number">19</td><td>    <span class="k1">while</span> <span class="k2">(</span> <span class="k3">!</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_313.html" target="_blank">feof</a><span class="k2">(</span>f<span class="k2">)</span> <span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">20</td><td>          </td></tr><tr><td class="number">21</td><td>          <span class="k1">if</span><span class="k2">(</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_320.html" target="_blank">fgets</a><span class="k2">(</span>i_string,<span class="n">1000</span>,f<span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> NULL <span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">22</td><td>              <a href="http://www.delorie.com/djgpp/doc/libc/libc_737.html" target="_blank">sprintf</a><span class="k2">(</span>items<span class="k2">[</span>item_num<span class="k2">]</span>.name, i_string<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td>          <span class="k2">}</span></td></tr><tr><td class="number">24</td><td>          <span class="k1">if</span><span class="k2">(</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_320.html" target="_blank">fgets</a><span class="k2">(</span>i_string,<span class="n">1000</span>,f<span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> NULL <span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">25</td><td>              <a href="http://www.delorie.com/djgpp/doc/libc/libc_737.html" target="_blank">sprintf</a><span class="k2">(</span>items<span class="k2">[</span>item_num<span class="k2">]</span>.desc, i_string<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td>          <span class="k2">}</span></td></tr><tr><td class="number">27</td><td>          <span class="k1">if</span><span class="k2">(</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_320.html" target="_blank">fgets</a><span class="k2">(</span>i_string,<span class="n">1000</span>,f<span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> NULL <span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">28</td><td>              items<span class="k2">[</span>item_num<span class="k2">]</span>.stackable <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_54.html" target="_blank">atoi</a><span class="k2">(</span>i_string<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">29</td><td>          <span class="k2">}</span>          </td></tr><tr><td class="number">30</td><td>                   </td></tr><tr><td class="number">31</td><td>          item_num<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">32</td><td>        </td></tr><tr><td class="number">33</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">34</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_308.html" target="_blank">fclose</a><span class="k2">(</span>f<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">35</td><td>    </td></tr><tr><td class="number">36</td><td>    <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">37</td><td>     </td></tr><tr><td class="number">38</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ngiacomelli)</author>
		<pubDate>Sat, 16 Dec 2006 08:32:25 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
My first question: when using fgets, is it safe to just have a global buffer size (1000), like the one I&#39;m using already?
</p></div></div><p>
The <i>fgets</i> is safe, but the sprintf copying isn&#39;t. If you&#39;re just going to copy a string, use strncpy instead of sprintf (and if you actually do need sprintf&#39;s functionality, use snprintf)!<br />But why not just fgets (with the proper length) directly to the name and desc arrays instead of to a temporary buffer that you copy?</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Also: the strings copy with a strange character at the end (^).
</p></div></div><p>
That&#39;s an LF, as in a <a href="http://en.wikipedia.org/wiki/Newline">CRLF line ending</a>. Open your file in text mode and it should go away. I.e.:<span class="source-code">FILE <span class="k3">*</span>f <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_337.html" target="_blank">fopen</a><span class="k2">(</span>filename, <span class="s">"rt"</span><span class="k2">)</span><span class="k2">;</span></span>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (gnolam)</author>
		<pubDate>Sat, 16 Dec 2006 08:42:22 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Some good points, some updated code. Changing to &quot;rt&quot; hasn&#39;t solved the character problem, though.</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">int</span> setup_objects<span class="k2">(</span> <span class="k1">char</span> <span class="k3">*</span>filename <span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">2</td><td>     </td></tr><tr><td class="number">3</td><td>    FILE <span class="k3">*</span>f <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_337.html" target="_blank">fopen</a><span class="k2">(</span>filename,<span class="s">"rt"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">4</td><td>    <span class="k1">char</span> i_string<span class="k2">[</span><span class="n">100</span><span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">5</td><td>    <span class="k1">int</span> item_num <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td>    <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>f<span class="k2">)</span> <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">8</td><td>    </td></tr><tr><td class="number">9</td><td>    <span class="k1">while</span> <span class="k2">(</span> <span class="k3">!</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_313.html" target="_blank">feof</a><span class="k2">(</span>f<span class="k2">)</span> <span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">10</td><td>          </td></tr><tr><td class="number">11</td><td>          <a href="http://www.delorie.com/djgpp/doc/libc/libc_320.html" target="_blank">fgets</a><span class="k2">(</span>items<span class="k2">[</span>item_num<span class="k2">]</span>.name,<span class="n">256</span>,f<span class="k2">)</span><span class="k2">;</span> </td></tr><tr><td class="number">12</td><td>          <a href="http://www.delorie.com/djgpp/doc/libc/libc_320.html" target="_blank">fgets</a><span class="k2">(</span>items<span class="k2">[</span>item_num<span class="k2">]</span>.desc,<span class="n">512</span>,f<span class="k2">)</span><span class="k2">;</span>   </td></tr><tr><td class="number">13</td><td>                     </td></tr><tr><td class="number">14</td><td>          <span class="k1">if</span><span class="k2">(</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_320.html" target="_blank">fgets</a><span class="k2">(</span>i_string,<span class="n">1</span>,f<span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> NULL <span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">15</td><td>              items<span class="k2">[</span>item_num<span class="k2">]</span>.stackable <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_54.html" target="_blank">atoi</a><span class="k2">(</span>i_string<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">16</td><td>          <span class="k2">}</span></td></tr><tr><td class="number">17</td><td>          </td></tr><tr><td class="number">18</td><td>          item_num<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">19</td><td>        </td></tr><tr><td class="number">20</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">21</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_308.html" target="_blank">fclose</a><span class="k2">(</span>f<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">22</td><td>    </td></tr><tr><td class="number">23</td><td>    <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td>     </td></tr><tr><td class="number">25</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ngiacomelli)</author>
		<pubDate>Sat, 16 Dec 2006 08:56:47 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>mingw fgets() acts just like in Unix. It only recognises \n as EOL, and so when you read text files with \r\n endings, you get a stray \r at the end.</p><p>The following code will strip these.  </p><div class="source-code snippet"><div class="inner"><pre>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_320.html" target="_blank">fgets</a><span class="k2">(</span>buffer,BUFFER_MAX,f<span class="k2">)</span><span class="k2">;</span>
  <span class="k1">int</span> len <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span>buffer<span class="k2">)</span><span class="k2">;</span>
  <span class="k1">if</span> <span class="k2">(</span>buffer<span class="k2">[</span>len-1<span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> <span class="s">'\r'</span><span class="k2">)</span> buffer<span class="k2">[</span>len-1<span class="k2">]</span><span class="k3">=</span> <span class="s">'\0'</span><span class="k2">;</span>
</pre></div></div><p>

This code is safe with ASCII and with UTF-8, afaics
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Matt Smith)</author>
		<pubDate>Sat, 16 Dec 2006 11:47:58 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
mingw fgets() acts just like in Unix. It only recognises \n as EOL, and so when you read text files with \r\n endings, you get a stray \r at the end.
</p></div></div><p>
Actually, they read up to <i>and including</i> the line-ending. If the line-ends in the file are \r\n, then you&#39;ll have \r\n at the end of the string. If it&#39;s just \n, you&#39;ll have \n at the end. Opening the file in non-b mode should automatically change \r\n to just \n, though.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kitty Cat)</author>
		<pubDate>Sat, 16 Dec 2006 13:20:38 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Still not having much luck with it <img src="http://www.allegro.cc/forums/smileys/sad.gif" alt=":(" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ngiacomelli)</author>
		<pubDate>Sat, 16 Dec 2006 18:30:17 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Maybe you could try the Allegro config routines, here is an example how it could look like (should compile as C++, don&#39;t know about C):</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">typedef</span> <span class="k1">struct</span> <span class="k2">{</span></td></tr><tr><td class="number">2</td><td>        <span class="k1">int</span> stackable<span class="k2">;</span>        </td></tr><tr><td class="number">3</td><td>        <span class="k1">char</span> name<span class="k2">[</span><span class="n">256</span><span class="k2">]</span>, desc<span class="k2">[</span><span class="n">512</span><span class="k2">]</span><span class="k2">;</span>     </td></tr><tr><td class="number">4</td><td><span class="k2">}</span> Item<span class="k2">;</span></td></tr><tr><td class="number">5</td><td>&#160;</td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td>Item items<span class="k2">[</span>max_item_num<span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">8</td><td>&#160;</td></tr><tr><td class="number">9</td><td>&#160;</td></tr><tr><td class="number">10</td><td><span class="k1">int</span> setup_objects<span class="k2">(</span><span class="k1">char</span> <span class="k3">*</span>filename<span class="k2">)</span></td></tr><tr><td class="number">11</td><td><span class="k2">{</span></td></tr><tr><td class="number">12</td><td>    <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/exists" target="_blank"><span class="a">exists</span></a><span class="k2">(</span>filename<span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">13</td><td>      <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td> </td></tr><tr><td class="number">15</td><td>    <a href="http://www.allegro.cc/manual/push_config_state" target="_blank"><span class="a">push_config_state</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">16</td><td>    <a href="http://www.allegro.cc/manual/set_config_file" target="_blank"><span class="a">set_config_file</span></a><span class="k2">(</span>filename<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">17</td><td>&#160;</td></tr><tr><td class="number">18</td><td>    <span class="c">/*</span></td></tr><tr><td class="number">19</td><td><span class="c">    **  This guarantees, that non-ASCII section names will be loaded correctly.</span></td></tr><tr><td class="number">20</td><td><span class="c">    **  You probably want to edit this if you're using only ASCII files and characters.</span></td></tr><tr><td class="number">21</td><td><span class="c">    */</span></td></tr><tr><td class="number">22</td><td>    <span class="k1">const</span> size_t section_size <span class="k3">=</span> <a href="http://www.allegro.cc/manual/uwidth_max" target="_blank"><span class="a">uwidth_max</span></a><span class="k2">(</span>U_CURRENT<span class="k2">)</span> <span class="k3">*</span> <span class="n">16</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td>    <span class="k1">char</span> section<span class="k2">[</span>section_size<span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td>&#160;</td></tr><tr><td class="number">25</td><td>    <span class="k1">bool</span> at_least_one_loaded <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td>    <span class="k1">int</span> item_num <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">27</td><td>    <a href="http://www.allegro.cc/manual/uszprintf" target="_blank"><span class="a">uszprintf</span></a><span class="k2">(</span>section, section_size, <span class="s">"ITEM_%i"</span>, item_num<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">28</td><td>&#160;</td></tr><tr><td class="number">29</td><td>    <span class="k1">while</span> <span class="k2">(</span><span class="k2">(</span>item_num <span class="k3">&lt;</span> max_item_num<span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <a href="http://www.allegro.cc/manual/config_is_hooked" target="_blank"><span class="a">config_is_hooked</span></a><span class="k2">(</span>section<span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">30</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">31</td><td>          <a href="http://www.allegro.cc/manual/ustrzncpy" target="_blank"><span class="a">ustrzncpy</span></a><span class="k2">(</span>items<span class="k2">[</span>item_num<span class="k2">]</span>.name, <span class="k1">sizeof</span><span class="k2">(</span>items<span class="k2">[</span>item_num<span class="k2">]</span>.name<span class="k2">)</span>, <a href="http://www.allegro.cc/manual/get_config_string" target="_blank"><span class="a">get_config_string</span></a><span class="k2">(</span>section, <span class="s">"name"</span>, <a href="http://www.allegro.cc/manual/empty_string" target="_blank"><span class="a">empty_string</span></a><span class="k2">)</span>, <span class="n">255</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">32</td><td>          <a href="http://www.allegro.cc/manual/ustrzncpy" target="_blank"><span class="a">ustrzncpy</span></a><span class="k2">(</span>items<span class="k2">[</span>item_num<span class="k2">]</span>.desc, <span class="k1">sizeof</span><span class="k2">(</span>items<span class="k2">[</span>item_num<span class="k2">]</span>.desc<span class="k2">)</span>, <a href="http://www.allegro.cc/manual/get_config_string" target="_blank"><span class="a">get_config_string</span></a><span class="k2">(</span>section, <span class="s">"desc"</span>, <a href="http://www.allegro.cc/manual/empty_string" target="_blank"><span class="a">empty_string</span></a><span class="k2">)</span>, <span class="n">511</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">33</td><td>          items<span class="k2">[</span>item_num<span class="k2">]</span>.stackable <span class="k3">=</span> <a href="http://www.allegro.cc/manual/get_config_int" target="_blank"><span class="a">get_config_int</span></a><span class="k2">(</span>section, <span class="s">"stackable"</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">34</td><td>&#160;</td></tr><tr><td class="number">35</td><td>          at_least_one_loaded <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span></td></tr><tr><td class="number">36</td><td>          item_num<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">37</td><td>          <a href="http://www.allegro.cc/manual/uszprintf" target="_blank"><span class="a">uszprintf</span></a><span class="k2">(</span>section, section_size, <span class="s">"ITEM_%i"</span>, item_num<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">38</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">39</td><td>&#160;</td></tr><tr><td class="number">40</td><td>    <a href="http://www.allegro.cc/manual/pop_config_state" target="_blank"><span class="a">pop_config_state</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">41</td><td>&#160;</td></tr><tr><td class="number">42</td><td>    <span class="c">/*</span></td></tr><tr><td class="number">43</td><td><span class="c">    **  Returns 1 if at least one item has been loaded, else return 0.</span></td></tr><tr><td class="number">44</td><td><span class="c">    **  Maybe a better way would be to return the number of items loaded?</span></td></tr><tr><td class="number">45</td><td><span class="c">    **</span></td></tr><tr><td class="number">46</td><td><span class="c">    **  return at_least_one_loaded ? item_num + 1 : 0;</span></td></tr><tr><td class="number">47</td><td><span class="c">    */</span></td></tr><tr><td class="number">48</td><td>    <span class="k1">return</span> at_least_one_loaded<span class="k2">;</span></td></tr><tr><td class="number">49</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>


Now your text file should be something like that:
</p><pre>
[ITEM_0]
name = The item name.
desc = Some fantastic description!
stackable = 1

[ITEM_1]
name = Some other item.
desc = Some another fantastic description!
stackable = 0
</pre><p>


Sorry, but code I&#39;ve posted isn&#39;t tested, but I hope that it will be useful somehow <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /></p><p>EDITED few times.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Tomasz Grajewski)</author>
		<pubDate>Sat, 16 Dec 2006 19:04:08 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The code doesn&#39;t work for me. I have a question, though:</p><div class="source-code snippet"><div class="inner"><pre><a href="http://www.allegro.cc/manual/config_is_hooked" target="_blank"><span class="a">config_is_hooked</span></a><span class="k2">(</span>section<span class="k2">)</span>
</pre></div></div><p>

Where do we actually hook the section?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ngiacomelli)</author>
		<pubDate>Sat, 16 Dec 2006 19:49:47 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ups, sorry Nial. I&#39;ve used wrong function. I wanted to check if a section exists in a file. It seems that Allegro doesn&#39;t have such a function, but you may try the
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">int</span> <a href="http://www.allegro.cc/manual/list_config_sections" target="_blank"><span class="a">list_config_sections</span></a><span class="k2">(</span><span class="k1">const</span> <span class="k1">char</span> <span class="k3">*</span><span class="k3">*</span><span class="k3">*</span>names<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
function, but you will need of course to change the source code I&#39;ve posted greatly.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Tomasz Grajewski)</author>
		<pubDate>Sat, 16 Dec 2006 20:01:52 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Tomasz, not a problem! I&#39;ve used the Allegro config routines once before (long ago). So I&#39;ll go RTFM. Thanks for taking the time to type all that up!</p><p>Edit: Tomasz, you&#39;re right! How the heck can I check (reliably) if a section is not found? I could compare the item name with empty_string, I suppose.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ngiacomelli)</author>
		<pubDate>Sat, 16 Dec 2006 20:04:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ve wrote a fixed version, this time using the <tt>int list_config_sections(const char ***names);</tt> function (it&#39;s introduced in the version 4.2.1 of Allegro). Also this time it compiles as C++, so you will need to change it in few places to use it as C.</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">typedef</span> <span class="k1">struct</span></td></tr><tr><td class="number">2</td><td><span class="k2">{</span></td></tr><tr><td class="number">3</td><td>  <span class="k1">int</span> stackable<span class="k2">;</span></td></tr><tr><td class="number">4</td><td>  <span class="k1">char</span> name<span class="k2">[</span><span class="n">256</span><span class="k2">]</span>, desc<span class="k2">[</span><span class="n">512</span><span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">5</td><td><span class="k2">}</span> Item<span class="k2">;</span></td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td>&#160;</td></tr><tr><td class="number">8</td><td>Item items<span class="k2">[</span>max_item_num<span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">9</td><td>&#160;</td></tr><tr><td class="number">10</td><td>&#160;</td></tr><tr><td class="number">11</td><td><span class="k1">int</span> setup_objects<span class="k2">(</span><span class="k1">char</span> <span class="k3">*</span>filename<span class="k2">)</span></td></tr><tr><td class="number">12</td><td><span class="k2">{</span></td></tr><tr><td class="number">13</td><td>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/exists" target="_blank"><span class="a">exists</span></a><span class="k2">(</span>filename<span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">14</td><td>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">15</td><td>&#160;</td></tr><tr><td class="number">16</td><td>  <a href="http://www.allegro.cc/manual/push_config_state" target="_blank"><span class="a">push_config_state</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">17</td><td>  <a href="http://www.allegro.cc/manual/set_config_file" target="_blank"><span class="a">set_config_file</span></a><span class="k2">(</span>filename<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td>&#160;</td></tr><tr><td class="number">19</td><td>  <span class="k1">char</span> <span class="k1">const</span> <span class="k3">*</span><span class="k3">*</span>sections <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>  <span class="k1">int</span> sections_num <span class="k3">=</span> <a href="http://www.allegro.cc/manual/list_config_sections" target="_blank"><span class="a">list_config_sections</span></a><span class="k2">(</span><span class="k3">&amp;</span>sections<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">21</td><td>  <span class="k1">int</span> i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">22</td><td>&#160;</td></tr><tr><td class="number">23</td><td>  <span class="k1">const</span> <span class="k1">char</span> <span class="k3">*</span> <span class="k1">const</span> item_section_name <span class="k3">=</span> <span class="s">"ITEM_"</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td>  <span class="k1">const</span> <span class="k1">int</span> item_section_name_length <span class="k3">=</span> <a href="http://www.allegro.cc/manual/ustrlen" target="_blank"><span class="a">ustrlen</span></a><span class="k2">(</span>item_section_name<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">25</td><td>  </td></tr><tr><td class="number">26</td><td>  <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> s <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> <span class="k2">(</span>s <span class="k3">&lt;</span> sections_num<span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k2">(</span>i <span class="k3">&lt;</span> max_item_num<span class="k2">)</span><span class="k2">;</span> s<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">27</td><td>    <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/ustrnicmp" target="_blank"><span class="a">ustrnicmp</span></a><span class="k2">(</span>sections<span class="k2">[</span>s<span class="k2">]</span>, item_section_name, item_section_name_length<span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">28</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">29</td><td>      <a href="http://www.allegro.cc/manual/ustrzncpy" target="_blank"><span class="a">ustrzncpy</span></a><span class="k2">(</span>items<span class="k3">&lt;</span>i&gt;.name, <span class="k1">sizeof</span><span class="k2">(</span>items<span class="k3">&lt;</span>i&gt;.name<span class="k2">)</span>, <a href="http://www.allegro.cc/manual/get_config_string" target="_blank"><span class="a">get_config_string</span></a><span class="k2">(</span>sections<span class="k2">[</span>s<span class="k2">]</span>, <span class="s">"name"</span>, <a href="http://www.allegro.cc/manual/empty_string" target="_blank"><span class="a">empty_string</span></a><span class="k2">)</span>, <span class="n">255</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">30</td><td>      <a href="http://www.allegro.cc/manual/ustrzncpy" target="_blank"><span class="a">ustrzncpy</span></a><span class="k2">(</span>items<span class="k3">&lt;</span>i&gt;.desc, <span class="k1">sizeof</span><span class="k2">(</span>items<span class="k3">&lt;</span>i&gt;.desc<span class="k2">)</span>, <a href="http://www.allegro.cc/manual/get_config_string" target="_blank"><span class="a">get_config_string</span></a><span class="k2">(</span>sections<span class="k2">[</span>s<span class="k2">]</span>, <span class="s">"desc"</span>, <a href="http://www.allegro.cc/manual/empty_string" target="_blank"><span class="a">empty_string</span></a><span class="k2">)</span>, <span class="n">511</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">31</td><td>      items<span class="k3">&lt;</span>i&gt;.stackable <span class="k3">=</span> <a href="http://www.allegro.cc/manual/get_config_int" target="_blank"><span class="a">get_config_int</span></a><span class="k2">(</span>sections<span class="k2">[</span>s<span class="k2">]</span>, <span class="s">"stackable"</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">32</td><td>      i<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">33</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">34</td><td>&#160;</td></tr><tr><td class="number">35</td><td>  <a href="http://www.allegro.cc/manual/free_config_entries" target="_blank"><span class="a">free_config_entries</span></a><span class="k2">(</span><span class="k3">&amp;</span>sections<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">36</td><td>  <a href="http://www.allegro.cc/manual/pop_config_state" target="_blank"><span class="a">pop_config_state</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">37</td><td>  <span class="k1">return</span> i<span class="k2">;</span></td></tr><tr><td class="number">38</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

Now your text file could look like this:
</p><pre>
[ITEM_SWORD]
name = Magic Sword
desc = This is some text about the Magic Sword.
stackable = 1

[ITEM_GUN]
name = Big F*cking Gun
desc = This is some text about BFG.
stackable = 0
</pre><p>

I hope that this time it will work for you. You could try to tweak this function, maybe even change it, so it will allocate the <tt>items[]</tt> array dynamically for you <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Tomasz Grajewski)</author>
		<pubDate>Sun, 17 Dec 2006 06:27:13 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>When I use fgets, I make the buffer size and the bytes requested slightly larger than a MAX_STRING_SIZE #define, which is largest allowed string.  Try a 1000 char line in a C file and try to compile it!</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="p">#include &lt;stdio.h&gt;</span></td></tr><tr><td class="number">2</td><td><span class="p">#include &lt;string.h&gt;</span></td></tr><tr><td class="number">3</td><td>&#160;</td></tr><tr><td class="number">4</td><td><span class="p">#define MAX_STRING_SIZE 255</span></td></tr><tr><td class="number">5</td><td><span class="p">#define MAX_BUFF_SIZE MAX_STRING_SIZE+1</span></td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td><span class="k1">int</span> main<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span></td></tr><tr><td class="number">8</td><td><span class="k2">{</span></td></tr><tr><td class="number">9</td><td> FILE <span class="k3">*</span>fp<span class="k2">;</span></td></tr><tr><td class="number">10</td><td> <span class="k1">int</span> linenum <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">11</td><td> <span class="k1">char</span> text<span class="k2">[</span>MAX_BUFF_SIZE<span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">12</td><td>&#160;</td></tr><tr><td class="number">13</td><td> fp <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_337.html" target="_blank">fopen</a><span class="k2">(</span><span class="s">"mytext.txt"</span>,<span class="s">"rb"</span><span class="k2">)</span><span class="k2">;</span> <span class="c">//never had prob with rb myself</span></td></tr><tr><td class="number">14</td><td> <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>fp<span class="k2">)</span><span class="k2">{</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr,<span class="s">"can't open 'mytext.txt'"</span><span class="k2">)</span><span class="k2">;</span> <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">15</td><td> <span class="k1">while</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_320.html" target="_blank">fgets</a><span class="k2">(</span>text,MAX_BUFF_SIZE,fp<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">16</td><td>   linenum<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">17</td><td>   <span class="k1">if</span><span class="k2">(</span>MAX_STRING_SIZE <span class="k3">&lt;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span>text<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">18</td><td>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr,<span class="s">"Max string length exceeded on line %d"</span>,linenum<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">19</td><td>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>     <span class="k2">}</span></td></tr><tr><td class="number">21</td><td>   do_something_with_line<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">22</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">23</td><td> <a href="http://www.delorie.com/djgpp/doc/libc/libc_308.html" target="_blank">fclose</a><span class="k2">(</span>fp<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td> <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">25</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Arthur Kalliokoski)</author>
		<pubDate>Tue, 19 Dec 2006 01:17:18 +0000</pubDate>
	</item>
</rss>
