Anfängerfrage: Zeile aus Textdatei in String speichern



  • Hallo zusammen,

    ich habe mich mit meinem Programm lange auseinandergesetzt, aber ich kann mir nicht helfen.
    Im Moment schreibe ich maximal fünf Zeilen (mit maximaler Länge von 80 Zeichen), und speichere diese in eine Textdatei namens text.txt, auf die ein Zeiger namens ptext verweist.
    Nun öffne ich die Datei wieder, um jede Zeile mit der Funktion fgets in fünf verschiedene Strings zu speichern. Auf diese fünf verschiedenen Srings zeigen fünf verschiedene Pointer, welche alle in einem Zeiger-Array namens paZeile abgelegt werden. Wenn ich zur Kontrolle die fünf Strings ausgeben möchte, wird nur <null> ausgegeben. Ich verstehe nicht warum. Hier die Funktion die in main aufgerufen wird:
    //----------------------------------------------------------------------------
    #include "txt.header.h"

    char String1 [81];
    char *pString1;

    char String2 [81];
    char *pString2;

    char String3 [81];
    char *pString3;

    char String4 [81];
    char *pString4;

    char String5 [81];
    char *pString5;

    char *paZeile[5];
    int zähler = 0;

    void TextDateiLesen (){

    FILE *ptext = NULL;
    ptext = fopen ("text.txt", "rt");

    if (ptext == NULL){
    printf ("Öffnen der Datei fehlgeschlagen\n");
    }

    fgets(String1, 80, ptext);
    pString1 = String1;
    paZeile[0] = pString1;

    fgets(String2, 80, ptext);
    pString2 = String2;
    paZeile[1] = pString2;

    fgets(String3, 80, ptext);
    pString3 = String3;
    paZeile[2] = pString3;

    fgets(String4, 80, ptext);
    pString4 = String4;
    paZeile[3] = pString4;

    fgets(String5, 80, ptext);
    pString5 = String5;
    paZeile[4] = pString5;

    while (zähler < 5) {
    printf ("%s\n", *paZeile[zähler]);
    zähler++;
    }

    }

    //-----------------------------------------------------------------------

    ich würde mich sehr über Tipps freuen. 🙂

    viele Grüße,
    Tobi



  • ich sehe gerade dass das Einrücken nicht geklappt hat. Ich habe es auch noch mit Leerzeichen versucht, aber das hat ebenfalls nicht geklappt. Ich bitte dies zu entschuldigen. Hoffe man kann das Programm auch so einigermaßen nachvollziehen.

    viele Grüße,
    Tobi



  • Nutze Code-Tags.

    int i = 0;
    


  • Also, ich habe in folgender Zeile ein Warnung bekommen:

    printf ("%s\n", *paZeile[zähler]);
    

    Versuche es doch mal mit

    printf ("%s\n", paZeile[zähler]);
    

    also ohne * . du willst ja im parameter ein char-array einlesen. *paZeile[zähler] hat jedoch den typ char.

    sonstiger TIP: verwände kein ä im codä!



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum C (C89, C99 und C11) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Gehört das nicht ins C-Forum?

    Edit: Ah, grad passiert 😃



  • Erst mal Danke für die schnellen Antworten. 🙂

    cooky451 schrieb:

    Nutze Code-Tags.

    int i = 0;
    

    Du meinst zwecks Übersichtlichkeit im Programm, oder?

    viele Grüße,
    Tobi



  • kein_experte schrieb:

    Also, ich habe in folgender Zeile ein Warnung bekommen:

    printf ("%s\n", *paZeile[zähler]);
    

    Versuche es doch mal mit

    printf ("%s\n", paZeile[zähler]);
    

    also ohne * . du willst ja im parameter ein char-array einlesen. *paZeile[zähler] hat jedoch den typ char.

    sonstiger TIP: verwände kein ä im codä!

    ich habe den Stern mal weg gelassen. Statt <null> werden nun leer Zeilen ausgegeben.
    Ich frage mich was da nicht stimmen könnte. Ich bin zwar ziemlicher Anfänger, aber trotzdem glaube ich dass es doch eigentlich so funktionieren müsste. 😕

    viele Grüße,
    Tobi



  • Tobi R. schrieb:

    Erst mal Danke für die schnellen Antworten. 🙂

    cooky451 schrieb:

    Nutze Code-Tags.

    int i = 0;
    

    Du meinst zwecks Übersichtlichkeit im Programm, oder?

    viele Grüße,
    Tobi

    Zwecks Darstellung hier im Forum.

    Es wurde dir schon der Tipp gegeben, keine Umlaute im Code zu verwenden, das solltest du befolgen.

    Tobi R. schrieb:

    Statt <null> werden nun leer Zeilen ausgegeben.

    Es ist mir ein Rätsel, warum bei deiner ersten Version <null> ausgegeben wurde.
    Jetzt ist es jedenfalls richtig, dann haste wohl Leerzeilen in der Textdatei.
    Dann haste wohl Leerzeilen in deiner Datei.



  • Den Umlaut habe ich in meinem Programm schon geändert. Der aktuellste Stand sieht nun so aus:

    //------------------------------------------------------------
    #include "txt.header.h"

    char String1 [81];
    char *pString1;

    char String2 [81];
    char *pString2;

    char String3 [81];
    char *pString3;

    char String4 [81];
    char *pString4;

    char String5 [81];
    char *pString5;

    char *paZeile[5];
    int i = 0;

    void TextDateiLesen (){

    FILE *ptext = NULL;
    ptext = fopen ("text.txt", "rt");

    if (ptext == NULL){
    printf ("Öffnen der Datei fehlgeschlagen\n");
    }

    fgets(String1, 80, ptext);
    pString1 = String1;
    paZeile[0] = pString1;

    fgets(String2, 80, ptext);
    pString2 = String2;
    paZeile[1] = pString2;

    fgets(String3, 80, ptext);
    pString3 = String3;
    paZeile[2] = pString3;

    fgets(String4, 80, ptext);
    pString4 = String4;
    paZeile[3] = pString4;

    fgets(String5, 80, ptext);
    pString5 = String5;
    paZeile[4] = pString5;

    while (i < 5) {
    printf ("%s\n", paZeile[i]);
    i++;

    }

    }

    //----------------------------------------------------------------

    Leerzeilen dürften eigentlich nicht vorhanden sein. Wie gesagt, in einer anderen Funktion schreibe ich fünf Zeilen die alle in einer Textdatei gespeichert werden. Diese Datei wird dann auf meinem Rechner abgespeichert, sodass ich sie ganz normal im Text-Editor anschauen kann. Dieser Teil funktioniert, ohne das Leerzeilen vorhanden sind. Aber beim Einlesen Mittels oberen Programms gibts Probleme. OHne dem Stern werden nur leere Zeilen ausgedruckt, mit Stern erscheint <null>.

    viele Grüße,
    Tobi



  • Schließt du die Datei mit fclose nach dem Schreiben?

    Die Hinweise, Code-Tags zu benutzen, scheinen noch nicht ganz bis zu dir durchgedrungen zu sein.

    Ohne Code-Tags:
    int i = 0;

    Mit Code-Tags:

    int i = 0;
    

    Kannst du einen Unterschied erkennen? 🤡



  • mach mal statt

    printf ("%s\n", paZeile[i]);
    

    das hier

    printf ("%s\n", paZeile);
    


  • @Tobi

    ich hab deinen code grad mal gecopypasted und mir ne textdatei "text.txt" erstellt mit 5 zeilen, und es hat mir alle zeilen ausgegeben. jeweils mit lehrzeile dazwischen - wegen "\n".
    willst du die weghaben, dann mach aus

    printf ("%s\n", paZeile[i]);
    
    printf ("%s", paZeile[i]);
    

    ansonsten versuch doch mal herauszufinden, an welcher stelle das von dir ungewünschte verhalten auftritt.

    @derdepp
    Wieso? ich bin zwar kein experte, aber %s erfordert doch den typ char* (was bei

    printf ("%s\n", paZeile[i]);
    

    der fall ist, denn paZeile ist ein erray vom typ char* . dein vorschlag hingegen hat galube den typ char** .
    viel wichtiger: es funktioniert auch nicht (bei mir)



  • ok, das nächste mal werde ich das mit dem Code-Tags einhalten. 🙂
    Der Tipp die Datei mit fclose zu schließen hat den Erfolg gebracht. Ist zwar wirklich ein dummer Fehler, aber ich hab mir nach einigen Stunden einfach nicht mehr zu helfen gewusst.

    Ich danke euch ganz herzlich für die Hilfe 👍 🙂

    viele Grüße,
    Tobi



  • derdepp schrieb:

    mach mal statt

    printf ("%s\n", paZeile[i]);
    

    das hier

    printf ("%s\n", paZeile);
    

    er will doch über das array iterieren, wie soll das ohne index-variable gehen?


Anmelden zum Antworten