<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Ausgabe Dateien, (und sub-)directorys, mit dirent]]></title><description><![CDATA[<p>guten morgen,</p>
<p>ich habe im zuge meiner Lehre die aufgabe bekommen, ein programm zu schreiben, das (unter Unix) den kompletten Dateibaum eines eingegebenen Verzeichnisses ausgibt</p>
<p>(Dateien, Verzeichnisse, dessen unterverzeichnisse usw.)</p>
<p>Hier die Rekursive Funktion, die diese Aufgabe übernehmen soll:</p>
<pre><code class="language-cpp">void ausgabe(char *dirName)
{

	if (!(myDir=opendir(dirName))) 
	{
		cout &lt;&lt; &quot;Verzeichnis kann nicht geoeffnet werden: &quot; &lt;&lt; dirName &lt;&lt; endl;
  	} 
	else
	{
		while (entry=readdir(myDir))
		{
			cout &lt;&lt; &quot;Eintrag: &quot; &lt;&lt; entry-&gt;d_name &lt;&lt; endl;
			dirName=(*dirName+entry-&gt;d_name);
			ausgabe((dirName));
		}

		closedir(myDir);
	}
</code></pre>
<p>Deklerationen/Definition der Variablen</p>
<pre><code class="language-cpp">void ausgabe(char *dirName);

	DIR *myDir;
	char *dirName=&quot;/home/dir&quot;;
	struct dirent *entry;
</code></pre>
<p>Fehler: Ich bekomme einen speicherzugriffsfehler, wenn ich</p>
<pre><code class="language-cpp">dirName=(*dirName+entry-&gt;d_name);
            ausgabe((dirName));
</code></pre>
<p>auskommentiere zeigt er mir das Verzeichnis korrekt an.</p>
<p>ich habe schon gegoogled, und auch die altanative &quot;getcurrentdirectory&quot; und &quot;setcurrentdirectory&quot; probiert, leider ohne erfolg, was villeicht auch daran lag das ich keine vernümpftige referenz dazu gefunden habe.</p>
<p>jemand ne idee?</p>
<p>PS: hat jemand einen link zu einer liste (referenz) der möglichen typenumwandlungsfunktionen? ich finde keine vernümpftige übersicht dazu</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/238810/ausgabe-dateien-und-sub-directorys-mit-dirent</link><generator>RSS for Node</generator><lastBuildDate>Tue, 22 Sep 2026 17:07:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/238810.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 16 Apr 2009 07:09:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Ausgabe Dateien, (und sub-)directorys, mit dirent on Thu, 16 Apr 2009 07:09:41 GMT]]></title><description><![CDATA[<p>guten morgen,</p>
<p>ich habe im zuge meiner Lehre die aufgabe bekommen, ein programm zu schreiben, das (unter Unix) den kompletten Dateibaum eines eingegebenen Verzeichnisses ausgibt</p>
<p>(Dateien, Verzeichnisse, dessen unterverzeichnisse usw.)</p>
<p>Hier die Rekursive Funktion, die diese Aufgabe übernehmen soll:</p>
<pre><code class="language-cpp">void ausgabe(char *dirName)
{

	if (!(myDir=opendir(dirName))) 
	{
		cout &lt;&lt; &quot;Verzeichnis kann nicht geoeffnet werden: &quot; &lt;&lt; dirName &lt;&lt; endl;
  	} 
	else
	{
		while (entry=readdir(myDir))
		{
			cout &lt;&lt; &quot;Eintrag: &quot; &lt;&lt; entry-&gt;d_name &lt;&lt; endl;
			dirName=(*dirName+entry-&gt;d_name);
			ausgabe((dirName));
		}

		closedir(myDir);
	}
</code></pre>
<p>Deklerationen/Definition der Variablen</p>
<pre><code class="language-cpp">void ausgabe(char *dirName);

	DIR *myDir;
	char *dirName=&quot;/home/dir&quot;;
	struct dirent *entry;
</code></pre>
<p>Fehler: Ich bekomme einen speicherzugriffsfehler, wenn ich</p>
<pre><code class="language-cpp">dirName=(*dirName+entry-&gt;d_name);
            ausgabe((dirName));
</code></pre>
<p>auskommentiere zeigt er mir das Verzeichnis korrekt an.</p>
<p>ich habe schon gegoogled, und auch die altanative &quot;getcurrentdirectory&quot; und &quot;setcurrentdirectory&quot; probiert, leider ohne erfolg, was villeicht auch daran lag das ich keine vernümpftige referenz dazu gefunden habe.</p>
<p>jemand ne idee?</p>
<p>PS: hat jemand einen link zu einer liste (referenz) der möglichen typenumwandlungsfunktionen? ich finde keine vernümpftige übersicht dazu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1696501</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1696501</guid><dc:creator><![CDATA[Lodoss]]></dc:creator><pubDate>Thu, 16 Apr 2009 07:09:41 GMT</pubDate></item><item><title><![CDATA[Reply to Ausgabe Dateien, (und sub-)directorys, mit dirent on Thu, 16 Apr 2009 07:16:53 GMT]]></title><description><![CDATA[<p>Versuchst du hier, 2 char-Zeiger (char*) zu addieren? Das geht nicht. Strings zusammenfügen kannst du z.B. mit strcat (da musst du aber dafür sorgen, dass der char-Puffer groß genug ist). Eine sinnvolle Alternative wäre std::string, das vergrößert sich automatisch und da kannst du einfach per operator+ einen String dranhängen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1696509</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1696509</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Thu, 16 Apr 2009 07:16:53 GMT</pubDate></item><item><title><![CDATA[Reply to Ausgabe Dateien, (und sub-)directorys, mit dirent on Thu, 16 Apr 2009 07:31:42 GMT]]></title><description><![CDATA[<p>_matze schrieb:</p>
<blockquote>
<p>[...]Eine sinnvolle Alternative wäre std::string, das vergrößert sich automatisch und da kannst du einfach per operator+ einen String dranhängen.</p>
</blockquote>
<p>das habe ich auch schon so überlegt, allerdings erwartet<br />
(myDir=opendir(dirName)) einen char zum öffnen, man kann das sicher umwandeln, nur weiß ich nicht wie</p>
<p>(daher mein PS^^)</p>
<p>mit ner guten referenz zu den typenumwandlungsfunktionen (am besten auf deutsch) wäre mir auchs chon gut geholfen^^</p>
<p>edit::</p>
<p>wenn ich std::string nutze, dann zeigt er mir folgenden fehelr an:</p>
<p>Zeile 29 Fehler: »std::string*« kann nicht nach »const char*« für Argument »1« nach »DIR* opendir(const char*)« umgewandelt werden</p>
<pre><code class="language-cpp">if (!(myDir=opendir(dirName)))
</code></pre>
<p>ist besagte zeile.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1696514</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1696514</guid><dc:creator><![CDATA[Lodoss]]></dc:creator><pubDate>Thu, 16 Apr 2009 07:31:42 GMT</pubDate></item><item><title><![CDATA[Reply to Ausgabe Dateien, (und sub-)directorys, mit dirent on Thu, 16 Apr 2009 07:28:42 GMT]]></title><description><![CDATA[<p><a href="http://www.cplusplus.com/reference/string/string/c_str/" rel="nofollow">http://www.cplusplus.com/reference/string/string/c_str/</a></p>
<p>Übrigens, vielleicht wäre noch diese Bibliothek eine interessante C++ Alternative:<br />
<a href="http://www.boost.org/doc/libs/1_38_0/libs/filesystem/doc/index.htm" rel="nofollow">http://www.boost.org/doc/libs/1_38_0/libs/filesystem/doc/index.htm</a></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1696517</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1696517</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 16 Apr 2009 07:28:42 GMT</pubDate></item><item><title><![CDATA[Reply to Ausgabe Dateien, (und sub-)directorys, mit dirent on Thu, 16 Apr 2009 07:28:58 GMT]]></title><description><![CDATA[<p>std::string hat die Methode c_str, die gibt dir einen char-Zeiger zurück.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1696518</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1696518</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Thu, 16 Apr 2009 07:28:58 GMT</pubDate></item><item><title><![CDATA[Reply to Ausgabe Dateien, (und sub-)directorys, mit dirent on Thu, 16 Apr 2009 08:43:41 GMT]]></title><description><![CDATA[<p>soweit so gut, leider immernoch nicht funktionstüchtig, habe leider jetzt grade leider nicht die zeit mich wirklich in die funktionsweise von c_str einzulesen...</p>
<p>er wirft mir folgenden fehelr aus:</p>
<p>20: Fehler: ungültige Umwandlung von »const char*« in »char*«</p>
<pre><code class="language-cpp">cin &gt;&gt; temp;		//zeile 19
	dirName=temp.c_str();	//zeile 20
</code></pre>
<p>deklaration von &quot;temp&quot;: string temp;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1696553</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1696553</guid><dc:creator><![CDATA[Lodoss]]></dc:creator><pubDate>Thu, 16 Apr 2009 08:43:41 GMT</pubDate></item><item><title><![CDATA[Reply to Ausgabe Dateien, (und sub-)directorys, mit dirent on Thu, 16 Apr 2009 08:49:13 GMT]]></title><description><![CDATA[<p>Benenne temp in dirName um und übergib dirName.c_str() direkt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1696557</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1696557</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Thu, 16 Apr 2009 08:49:13 GMT</pubDate></item><item><title><![CDATA[Reply to Ausgabe Dateien, (und sub-)directorys, mit dirent on Thu, 16 Apr 2009 11:37:20 GMT]]></title><description><![CDATA[<p>das problem war ein anderes, das ich inzwischen gelöst habe (frag mich nicht wie, ich weiß es garnicht mehr^^)</p>
<p>derzeit ist das problem ein neues, er schmeißt mir als ersten wert für entry-&gt;d_name ein &quot;..&quot; aus.</p>
<p>das problem sit nun, das er nun quasi folgendes probiert:</p>
<p>statt:</p>
<p>/home/(ordner/datei)</p>
<p>macht er</p>
<p>/home/../ordner/datei)</p>
<p>2 fragen die mich quälen...</p>
<p>1. wie kann ich ermitteln, ob das makierte unterobject des aktuellen verzeichnisses eine datei oder ein verzeichnis ist?</p>
<p>(habe da was gefunden das nent sich S_ISDIR(), aber da blicke ich nicht so ganz durch)</p>
<p>2. lässt sich der aktuelle fehelr irgendwie abfangen? habe es (so naiv wie ich bin) mit ner if abfrage probiert nach dem schema:</p>
<pre><code class="language-cpp">if (entry-&gt;d_name!=&quot;..&quot;)
				{
					temp=temp+entry-&gt;d_name+&quot;/&quot;;
				}
</code></pre>
<p>probiert, kein erfolg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1696641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1696641</guid><dc:creator><![CDATA[Lodoss]]></dc:creator><pubDate>Thu, 16 Apr 2009 11:37:20 GMT</pubDate></item><item><title><![CDATA[Reply to Ausgabe Dateien, (und sub-)directorys, mit dirent on Thu, 16 Apr 2009 11:37:38 GMT]]></title><description><![CDATA[<p>Was ist denn <code>d_name</code> ? Wenn das ein <code>char*</code> ist, hast du wieder das gleiche Problem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1696643</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1696643</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 16 Apr 2009 11:37:38 GMT</pubDate></item><item><title><![CDATA[Reply to Ausgabe Dateien, (und sub-)directorys, mit dirent on Thu, 16 Apr 2009 11:50:41 GMT]]></title><description><![CDATA[<p>d_name ist die &quot;datei/ordner&quot;, die grade &quot;selektiert&quot; ist, kommt aus dem structurelement *entry vom typ dirent</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1696652</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1696652</guid><dc:creator><![CDATA[Lodoss]]></dc:creator><pubDate>Thu, 16 Apr 2009 11:50:41 GMT</pubDate></item><item><title><![CDATA[Reply to Ausgabe Dateien, (und sub-)directorys, mit dirent on Thu, 16 Apr 2009 16:21:31 GMT]]></title><description><![CDATA[<p>Ja, und was für ein Datentyp? Du vergleichst ihn schliesslich mit einem <code>const char*</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1696773</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1696773</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 16 Apr 2009 16:21:31 GMT</pubDate></item><item><title><![CDATA[Reply to Ausgabe Dateien, (und sub-)directorys, mit dirent on Fri, 17 Apr 2009 05:43:01 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Ja, und was für ein Datentyp? Du vergleichst ihn schliesslich mit einem <code>const char*</code> .</p>
</blockquote>
<p>das ist eine gute frage, ich bin davon ausgegangen das es sichd abei um einen const char* handelt, allerdings bin ich mir nicht sicher, ich schau mal in der entsprechenden libary nach...</p>
<p>ich meld mich dann,</p>
<p>edit::<br />
ich hab mal nachgeschaut, bei entry-&gt;d_name[] handelt es sich um den typ char</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1696994</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1696994</guid><dc:creator><![CDATA[Lodoss]]></dc:creator><pubDate>Fri, 17 Apr 2009 05:43:01 GMT</pubDate></item><item><title><![CDATA[Reply to Ausgabe Dateien, (und sub-)directorys, mit dirent on Fri, 17 Apr 2009 13:18:32 GMT]]></title><description><![CDATA[<p>Lodoss schrieb:</p>
<blockquote>
<p>1. wie kann ich ermitteln, ob das makierte unterobject des aktuellen verzeichnisses eine datei oder ein verzeichnis ist?</p>
</blockquote>
<p>Womöglich fragst du das besser im Linux/Unix Forum hier. Das ist eine Frage an die entsprechende Unix C Bibliothek.<br />
Oder du nimmst die C++ Bibliothek Boost.Filesystem, dann musst du dich auch nicht immer mit C rumschlagen, da alles schön in C++ gemacht ist.</p>
<p>Lodoss schrieb:</p>
<blockquote>
<p>2. lässt sich der aktuelle fehelr irgendwie abfangen? habe es (so naiv wie ich bin) mit ner if abfrage probiert nach dem schema:</p>
<pre><code class="language-cpp">if (entry-&gt;d_name!=&quot;..&quot;)
// ...
</code></pre>
<p>probiert, kein erfolg</p>
</blockquote>
<p>Wenn, wie du gesagt hast, <code>d_name</code> ein <code>char[]</code> ist, dann vergleichst du hier nicht zwei Inhalte sondern zwei Zeiger. Und die werden ziemlich sicher immer ungleich sein. Also diese Anweisung ergibt immer <code>true</code> .<br />
Ein Stringliteral (z.B. <code>&quot;..&quot;</code> ) ist nichts anderes als ein <code>char const*</code> . Wenn <code>d_name</code> ein <code>char</code> Array ist (also <code>char[]</code> ), dann wird dieses vor dem Vergleich implizit in einen Zeiger auf das erste Element umgewandelt. Also wird gerprüft, ob es zwei gleiche Speicheradressen sind <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Die einfachste Möglichkeit, welche du hier hast, wird wohl die C Funktion <code>strcmp</code> sein:<br />
<a href="http://www.cplusplus.com/reference/clibrary/cstring/strcmp/" rel="nofollow">http://www.cplusplus.com/reference/clibrary/cstring/strcmp/</a></p>
<p>Sofern natürlich <code>d_name</code> ein 0 terminiertes <code>char</code> Array ist. Was aber ziemlich wahrscheinlich ist. Sicherheitshalber solltest du das aber noch nachprüfen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1697260</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1697260</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 17 Apr 2009 13:18:32 GMT</pubDate></item></channel></rss>