<?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[dynamisches mehrdimensionales char-Array]]></title><description><![CDATA[<p>Liebe Gemeinde,</p>
<p>ich bin noch ein ziemlicher Anfänger, was C++ betrifft und gerade am verzweifeln, was das parsen einer Datei angeht. Ich hab auch einiges gelesen, was das dynamische anlegen von Arrays angeht, habe aber leider Probleme, dies auf den Datentyp char zu übertragen.</p>
<p>Hintergrund ist eine Textdatei mit folgenden Inhalt:</p>
<p>kat1:inhalt kategorie 1<br />
kat2:der inhalt für die zwei!<br />
...</p>
<p>Die Anzahl der Zeilen ist unbekannt bzw. kann von Datei zu Datei variieren.</p>
<p>Mein Anliegen ist nun, die einzelnen Zeilen in zwei Arrays zu speichern:</p>
<pre><code class="language-cpp">arr_kat = {&quot;kat1&quot;, &quot;kat2&quot;}
arr_inhalt = {&quot;inhalt kategorie 1&quot;, &quot;inhalt für die zwei!&quot;}
</code></pre>
<p>Ich bekomme es aber zum verrecken nicht hin erstmal das array für die Kategorien anzulegen. Es wird zwar kompiliert aber beim ausführen bekomme ich entweder eine mir kryptische Fehlermelduhng, die, nicht lachen wenn ich was falsches schreibe, wohl Speicheradressen auflistet bzw. eine Endlosschleife.</p>
<p>Ich bin unter Linux am werkeln und benutze den g++ der Version 4.4.1</p>
<p>Ich bin für jeden Hinweis dankbar, der mir den Weg in die richtige Richtung weist!</p>
<p>Anbei mein Code:</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &lt;iostream&gt;
#include &lt;stdlib.h&gt;
#include &lt;cstring&gt;
#include &lt;fstream&gt;

using namespace std;

int main() {

    char puffer[400];
    char zeichen;
    int zaehler;
    int k_index = 0;

    char **kat = new char*[5];

    ifstream datei;
    datei.open(&quot;dummy.txt&quot;);

    while(!datei.eof()) {

        datei.get(zeichen);

        if (datei.eof()) break;

        switch (zeichen) {

            case ':':

                puffer[zaehler] = '\0';
                cout &lt;&lt; &quot;p =&gt; &quot; &lt;&lt; puffer &lt;&lt; endl;

                kat[k_index] = puffer;

                k_index++;

                zaehler = 0;

            break;

            case '\n':

// hier var inhalt füllen

cout &lt;&lt; &quot;*&quot; &lt;&lt; endl;
                zaehler = 0;

            break;

            default:

                puffer[zaehler] = zeichen;
                zaehler++;

            break;

        } // ende switch

    } // ende while()

    return 0;

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/265914/dynamisches-mehrdimensionales-char-array</link><generator>RSS for Node</generator><lastBuildDate>Thu, 03 Sep 2026 16:41:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/265914.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 30 Apr 2010 20:44:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to dynamisches mehrdimensionales char-Array on Fri, 30 Apr 2010 20:44:50 GMT]]></title><description><![CDATA[<p>Liebe Gemeinde,</p>
<p>ich bin noch ein ziemlicher Anfänger, was C++ betrifft und gerade am verzweifeln, was das parsen einer Datei angeht. Ich hab auch einiges gelesen, was das dynamische anlegen von Arrays angeht, habe aber leider Probleme, dies auf den Datentyp char zu übertragen.</p>
<p>Hintergrund ist eine Textdatei mit folgenden Inhalt:</p>
<p>kat1:inhalt kategorie 1<br />
kat2:der inhalt für die zwei!<br />
...</p>
<p>Die Anzahl der Zeilen ist unbekannt bzw. kann von Datei zu Datei variieren.</p>
<p>Mein Anliegen ist nun, die einzelnen Zeilen in zwei Arrays zu speichern:</p>
<pre><code class="language-cpp">arr_kat = {&quot;kat1&quot;, &quot;kat2&quot;}
arr_inhalt = {&quot;inhalt kategorie 1&quot;, &quot;inhalt für die zwei!&quot;}
</code></pre>
<p>Ich bekomme es aber zum verrecken nicht hin erstmal das array für die Kategorien anzulegen. Es wird zwar kompiliert aber beim ausführen bekomme ich entweder eine mir kryptische Fehlermelduhng, die, nicht lachen wenn ich was falsches schreibe, wohl Speicheradressen auflistet bzw. eine Endlosschleife.</p>
<p>Ich bin unter Linux am werkeln und benutze den g++ der Version 4.4.1</p>
<p>Ich bin für jeden Hinweis dankbar, der mir den Weg in die richtige Richtung weist!</p>
<p>Anbei mein Code:</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &lt;iostream&gt;
#include &lt;stdlib.h&gt;
#include &lt;cstring&gt;
#include &lt;fstream&gt;

using namespace std;

int main() {

    char puffer[400];
    char zeichen;
    int zaehler;
    int k_index = 0;

    char **kat = new char*[5];

    ifstream datei;
    datei.open(&quot;dummy.txt&quot;);

    while(!datei.eof()) {

        datei.get(zeichen);

        if (datei.eof()) break;

        switch (zeichen) {

            case ':':

                puffer[zaehler] = '\0';
                cout &lt;&lt; &quot;p =&gt; &quot; &lt;&lt; puffer &lt;&lt; endl;

                kat[k_index] = puffer;

                k_index++;

                zaehler = 0;

            break;

            case '\n':

// hier var inhalt füllen

cout &lt;&lt; &quot;*&quot; &lt;&lt; endl;
                zaehler = 0;

            break;

            default:

                puffer[zaehler] = zeichen;
                zaehler++;

            break;

        } // ende switch

    } // ende while()

    return 0;

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1890658</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1890658</guid><dc:creator><![CDATA[cpp_padawan]]></dc:creator><pubDate>Fri, 30 Apr 2010 20:44:50 GMT</pubDate></item><item><title><![CDATA[Reply to dynamisches mehrdimensionales char-Array on Fri, 30 Apr 2010 20:46:37 GMT]]></title><description><![CDATA[<p>Benutze den Datentyp std::vector.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1890661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1890661</guid><dc:creator><![CDATA[Janjan]]></dc:creator><pubDate>Fri, 30 Apr 2010 20:46:37 GMT</pubDate></item><item><title><![CDATA[Reply to dynamisches mehrdimensionales char-Array on Fri, 30 Apr 2010 21:09:32 GMT]]></title><description><![CDATA[<p>Danke Dir, das macht sicher Sinn!!!</p>
<p>Bin mir aber nicht sicher, ob das die Lösung für die Aufgabenstellung ist, da wir diese Klasse noch nicht besprochen haben.</p>
<p>Gibt's nichts für den &quot;steinigen Weg&quot;, quasi from the scratch <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>Ich schätze, dass selbst in der Variablendeklaration ein Fehler ist, den ich gerne verstehen will.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1890681</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1890681</guid><dc:creator><![CDATA[cpp_padawan]]></dc:creator><pubDate>Fri, 30 Apr 2010 21:09:32 GMT</pubDate></item><item><title><![CDATA[Reply to dynamisches mehrdimensionales char-Array on Fri, 30 Apr 2010 21:28:59 GMT]]></title><description><![CDATA[<p>cpp_padawan schrieb:</p>
<blockquote>
<p>Gibt's nichts für den &quot;steinigen Weg&quot;, quasi from the scratch <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>
</blockquote>
<p>Du wirst noch früh genug verstehen, wie <code>vector</code> funktioniert. Es gibt keinen Grund, den als Anfänger nachzuahmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1890688</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1890688</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Fri, 30 Apr 2010 21:28:59 GMT</pubDate></item><item><title><![CDATA[Reply to dynamisches mehrdimensionales char-Array on Fri, 30 Apr 2010 21:30:42 GMT]]></title><description><![CDATA[<p>In deinem Lösungsansatz sind mehrere Fehler:</p>
<ol>
<li>Kuck dir nochmal das erzeugen mehrdimensionaler Arrays mit new an</li>
<li>strcpy() ist das was du suchst buffer[index] = puffer kopiert die Speicheradresse</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/1890690</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1890690</guid><dc:creator><![CDATA[blub* 0]]></dc:creator><pubDate>Fri, 30 Apr 2010 21:30:42 GMT</pubDate></item><item><title><![CDATA[Reply to dynamisches mehrdimensionales char-Array on Sat, 01 May 2010 11:51:02 GMT]]></title><description><![CDATA[<p>Frohen Feiertag zusammen!</p>
<p>Die Verwendung der Methode strcpy() funktioniert leider nicht. Führe ich das Programm aus, bekomme ich ein 'Segmentation fault', was wohl ein Indiz für ein Speicherzugriffsfehler ist.</p>
<p>Somit kommen wir nochmal zum Verwenden von 'new'.</p>
<p>ich initialisiere ein char Array, da ich aber nocht nicht weiss, wieviele Elemente gespeichert werden, lasse ich die Anzahl weg:</p>
<pre><code class="language-cpp">char **kat = new char*;
</code></pre>
<p>Wenn ich jetzt in einer for-Schleife die Elemente füllen will, funktioniert es auch anstandslos:</p>
<pre><code class="language-cpp">for (int i = 0; i &lt; 5; i++) {

    kat[i] = &quot;abc&quot;;
    // strcpy(kat[i], &quot;abc&quot;);

}

for (int i = 0; i &lt; 5; i++) {

    cout &lt;&lt; &quot;i: &quot; &lt;&lt; i &lt;&lt; &quot; k: &quot; &lt;&lt; kat[i] &lt;&lt; endl; 

}
</code></pre>
<p>Sobald ich die Elemente der Datei einlesen will, funktioniert nichts mehr.</p>
<p>Bei der Verwendung von strcpy() bekomme ich bei Ausführung ein Segmentation fault, wie oben erwähnt, wenn ich den puffer einfach in kat[k_index] kopieren will, bekomme ich folgenden Fehler bei Ausführung des Programms:</p>
<pre><code class="language-cpp">*** glibc detected *** ./test: free(): invalid pointer: 0xbfd4af64 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6[0x3d9ff1]
/lib/tls/i686/cmov/libc.so.6[0x3db6f2]
/lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0x3de7cd]
/lib/tls/i686/cmov/libc.so.6(_IO_free_backup_area+0x34)[0x3d84d4]
/lib/tls/i686/cmov/libc.so.6(_IO_unsave_markers+0x32)[0x3d81f2]
/lib/tls/i686/cmov/libc.so.6(_IO_file_close_it+0x42)[0x3d6fe2]
/lib/tls/i686/cmov/libc.so.6(fclose+0x188)[0x3ca548]
/usr/lib/libstdc++.so.6(_ZNSt12__basic_fileIcE5closeEv+0x5d)[0x90964d]
/usr/lib/libstdc++.so.6(_ZNSt13basic_filebufIcSt11char_traitsIcEE5closeEv+0xa4)[0x8b8474]
/usr/lib/libstdc++.so.6(_ZNSt14basic_ifstreamIcSt11char_traitsIcEE5closeEv+0x25)[0x8ba3c5]
./test[0x8048bcf]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0x385b56]
./test[0x8048991]
======= Memory map: ========
001d3000-001d4000 r-xp 00000000 00:00 0          [vdso]
0036f000-004ad000 r-xp 00000000 08:11 176013     /lib/tls/i686/cmov/libc-2.10.1.so
004ad000-004ae000 ---p 0013e000 08:11 176013     /lib/tls/i686/cmov/libc-2.10.1.so
004ae000-004b0000 r--p 0013e000 08:11 176013     /lib/tls/i686/cmov/libc-2.10.1.so
004b0000-004b1000 rw-p 00140000 08:11 176013     /lib/tls/i686/cmov/libc-2.10.1.so
004b1000-004b4000 rw-p 00000000 00:00 0 
00852000-00938000 r-xp 00000000 08:11 1709       /usr/lib/libstdc++.so.6.0.13
00938000-0093c000 r--p 000e6000 08:11 1709       /usr/lib/libstdc++.so.6.0.13
0093c000-0093d000 rw-p 000ea000 08:11 1709       /usr/lib/libstdc++.so.6.0.13
0093d000-00944000 rw-p 00000000 00:00 0 
009ef000-00a0a000 r-xp 00000000 08:11 64         /lib/ld-2.10.1.so
00a0a000-00a0b000 r--p 0001a000 08:11 64         /lib/ld-2.10.1.so
00a0b000-00a0c000 rw-p 0001b000 08:11 64         /lib/ld-2.10.1.so
00c74000-00c98000 r-xp 00000000 08:11 176017     /lib/tls/i686/cmov/libm-2.10.1.so
00c98000-00c99000 r--p 00023000 08:11 176017     /lib/tls/i686/cmov/libm-2.10.1.so
00c99000-00c9a000 rw-p 00024000 08:11 176017     /lib/tls/i686/cmov/libm-2.10.1.so
00f6c000-00f88000 r-xp 00000000 08:11 2752       /lib/libgcc_s.so.1
00f88000-00f89000 r--p 0001b000 08:11 2752       /lib/libgcc_s.so.1
00f89000-00f8a000 rw-p 0001c000 08:11 2752       /lib/libgcc_s.so.1
08048000-08049000 r-xp 00000000 08:11 2630472    /home/atze/Desktop/cpp_test/test
08049000-0804a000 r--p 00000000 08:11 2630472    /home/atze/Desktop/cpp_test/test
0804a000-0804b000 rw-p 00001000 08:11 2630472    /home/atze/Desktop/cpp_test/test
09e5d000-09e7e000 rw-p 00000000 00:00 0          [heap]
b7700000-b7721000 rw-p 00000000 00:00 0 
b7721000-b7800000 ---p 00000000 00:00 0 
b78d6000-b78d9000 rw-p 00000000 00:00 0 
b78ed000-b78ef000 rw-p 00000000 00:00 0 
bfd38000-bfd4d000 rw-p 00000000 00:00 0          [stack]
Aborted
atze@Tron:~/Desktop/cpp_test$
</code></pre>
<p>Hier mal mein jetziger Stand:</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &lt;iostream&gt;
#include &lt;stdlib.h&gt;
#include &lt;cstring&gt;
#include &lt;fstream&gt;

using namespace std;

int main() {

    char puffer[400];
    char zeichen;
    int zaehler = 0;
    int k_index = 0;

    char **kat = new char*;

    ifstream datei;
    datei.open(&quot;dummy.txt&quot;);

    while(!datei.eof()) {

        datei.get(zeichen);

        if (datei.eof()) break;

        switch (zeichen) {

            case ':':

                puffer[zaehler] = '\0';
                cout &lt;&lt; &quot;p =&gt; &quot; &lt;&lt; puffer &lt;&lt; endl;

                kat[k_index] = puffer; // oder strcpy();
                // strcpy(kat[k_index], puffer);

                k_index++;

                zaehler = 0;

            break;

            case '\n':

                // inhalt wird hier gefuellt
                cout &lt;&lt; &quot;*&quot; &lt;&lt; endl;
                zaehler = 0;

            break;

            default:

                puffer[zaehler] = zeichen;
                zaehler++;

            break;

        } // ende switch

    } // ende while()

    // cout &lt;&lt; &quot;&lt;&lt;&lt;&lt; &quot; &lt;&lt; dateiname &lt;&lt; &quot; SCHLIESSEN &gt;&gt;&gt;&gt;&quot; &lt;&lt; endl;
    cout &lt;&lt; &quot;&lt;&lt;&lt;&lt; dummy.txt SCHLIESSEN &gt;&gt;&gt;&gt;&quot; &lt;&lt; endl;
    datei.close();

    /*
    for (int i = 0; i &lt; 5; i++) {

        kat[i] = &quot;abc&quot;;
        // strcpy(kat[i], &quot;abc&quot;);

    }

    for (int i = 0; i &lt; 5; i++) {

        cout &lt;&lt; &quot;i: &quot; &lt;&lt; i &lt;&lt; &quot; k: &quot; &lt;&lt; kat[i] &lt;&lt; endl; 
        // strcpy(kat[i], &quot;abc&quot;);

    }
    */

    return 0;

}
</code></pre>
<p>Danke schonmal für die Mühe!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1890856</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1890856</guid><dc:creator><![CDATA[cpp_padawan]]></dc:creator><pubDate>Sat, 01 May 2010 11:51:02 GMT</pubDate></item><item><title><![CDATA[Reply to dynamisches mehrdimensionales char-Array on Sat, 01 May 2010 12:01:30 GMT]]></title><description><![CDATA[<p>cpp_padawan schrieb:</p>
<blockquote>
<p>ich initialisiere ein char Array, da ich aber nocht nicht weiss, wieviele Elemente gespeichert werden, lasse ich die Anzahl weg:</p>
<pre><code class="language-cpp">char **kat = new char*;
</code></pre>
</blockquote>
<p>Das geht so nicht. <code>new</code> kann nicht zaubern und die benötigte Anzahl Elemente vorhersehen. Mit <code>new char*</code> forderst du einen einzelnen <code>char*</code> an, das ist natürlich zu wenig.</p>
<p>Wenn du Magie willst, nimm <code>std::vector&lt;std::string&gt;</code> . <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="😉"
    /><br />
Dort kannst du ohne Weiteres erst im Nachhinein Elemente hinzufügen und musst dich kein bisschen um die Speicherverwaltung kümmern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1890857</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1890857</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 01 May 2010 12:01:30 GMT</pubDate></item></channel></rss>