Daten von Textdatei in verschiedene Strings lesen



  • Hallo,

    ich will Daten einer Textdatei in verschiedene Strings lesen. Die Textdatei enthält folgende Angaben:

    Name;Norname;Tel;Wohnort

    Ebenfalls sollen Kommentare mit # erlaubt sein. Wie stelle ich das am geschicktesten an?

    FILE *datei;
    char buffer;
    if ((datei = fopen(meine.txt, "r")) == NULL) {
            exit(0);
    }
    while (fgets (buffer, 500, datei) != NULL) {
            int n = 0;
            while (buffer[n] != '\n') {
                    scrcpy (name[n], buffer[n]);
                    n++;
            }
    return 0
    }
    

    Bin für jede Hilfe dankbar.



  • du meinst jede zeile sieht ungefähr so aus:

    AAAAAAAA;BBBBBBBB;CCCCCCC #komentar \n

    mit fgets wird nur eine zeite, d.h. bis '\n' gelesen, beim nächstne fgest kommt die nächte zeile dran, solange fgehts nich mehr zurückgibt.

    mit

    int iPos= strchr(acBuf,';');
    

    kanns du nach den einlenen zeichen suchen,

    mit

    acBuf+iPos
    

    springst du dann quasie an die Selle des ersten ';' und kannts von da aus weiter suchen bspw

    iPos= strchr(acBuf+iPos,';');
    

    mit strncpy /strcpy kannst du dann einzelne teilstring kopieren.

    ist das schon mal ein gute ansatz?



  • FILE *datei;
    char buffer[500];
    char name[500];
    
    if ((datei = fopen("main.c", "r")) == NULL) 
    {
        exit(0);
    }
    while (fgets (buffer, 500, datei) != NULL) 
    {
        strcpy(name, buffer);
    }
    


  • Tachyon schrieb:

    FILE *datei;
    char buffer[500];
    char name[500];
    
    if ((datei = fopen("main.c", "r")) == NULL) 
    {
        exit(0);
    }
    while (fgets (buffer, 500, datei) != NULL) 
    {
        strcpy(name, buffer);
    }
    

    Das geht doch nicht.
    Das ist doch durch ; getrennt.



  • Die Textdatei sieht so aus:

    # Mein Kommentar

    Aaa;Bbbb;Cccc;Ddddd;012345

    Ich will nun irgendetwas in der Art haben, dass ich es einzeln ausgeben kann:

    printf("Name von Zeile 1: %s\n Name von Zeile 2: %s"\n", Name[1], Name[2]);
    

    Schonmal danke für die Antworten



  • Dann so:

    FILE *datei;
    char buffer[500];
    char name[500];
    const char delim[] = ";\n";
    char* token;
    
    if ((datei = fopen("main.c", "r")) == NULL) 
    {
        exit(0);
    }
    while (fgets (buffer, 500, datei) != NULL) 
    {
        token = strtok(buffer, delim);
        while(token != NULL)
        {
            strcpy(name, token);
            token = strtok(NULL, delim);
        }
    }
    return 0;
    

    strtok zerlegt die Deine Strings in Teilstücke. Als Trennzeichen dienen die unter delim angegebenen Zeichen.



  • Dann hat er doch noch immer den kompletten mehrere Zeilen umfassenden String?

    In Zeile 17 Deines Code's habe ich ein

    printf("%s", name);
    

    eingefügt. Dies gibt mir noch immer die ganzen Zeilen aus. Wie müsste ich den Code modifizieren, dass in eine Zeile geschrieben wird?

    Also: mögliche Ausgabe:

    (printf"%s, %s, %s", name[1], name[2], name[3]);
    

    Dann müsste er ja die verschiedenen Zeilen in verschiedene name[] Arrays kopieren?



  • while (fgets (buffer, 500, datei) != NULL)
    {
    strcpy(name, buffer);
    }

    schön jetzt kopierst den ganzen string;) dachte er will den string gesplitter haben

    so ungefähr.. nicht gesttestet

    strncpy(name,buffer,strchr(buffer,';'));
    


  • BorisDieKlinge schrieb:

    while (fgets (buffer, 500, datei) != NULL)
    {
    strcpy(name, buffer);
    }

    schön jetzt kopierst den ganzen string;) dachte er will den string gesplitter haben

    so ungefähr.. nicht gesttestet

    strncpy(name,buffer,strchr(buffer,';'));
    

    Hast Du den Thread auch weiter gelesen?



  • Ich will den string schon gesplittet haben. Am besten habe ich neue string Variablen name, vorname usw. und lasse dann den kompletten string da rein schreiben, gestückelt.



  • gnome.gemini schrieb:

    Ich will den string schon gesplittet haben. Am besten habe ich neue string Variablen name, vorname usw. und lasse dann den kompletten string da rein schreiben, gestückelt.

    Haben deine Zeilen eine feste Maximallänge und sind sie mit einem '\n' abgeschlossen ?



  • Ich weiß nicht, ob diese abgeschlossen sind. Es ist eine einfache Textdatei. Ich vermute mal, da dies auf verschiedenen Zeilen steht.

    Angenommen, dies ist die Textdatei:
    Hans;Kuchen;30
    Otto;Brot;23
    Mejer;Käse;50

    So will ich jeden einzelnen Datenabschnitt einem String zuweisen. Hierfür habe ich bereits eine Struktur.

    struct daten {
            char name[10];
            char vorname[10];
            int alter[2];
            };
    

    Und nun brauche ich den Abschnitt, der es mir ermöglicht mit

    struct daten x;
    printf("%d, %s\n", x.name[0], x.alter[0]);
    

    Daten vereinzelt ausgeben zu lassen. Dafür muss ich den String auseinander friemeln um dann jedes kleine Teilstück einer Variable meiner Struktur zuweisen zu können. Ich bin am verzweifeln, aber froh, dass mir jemand hilft.



  • So in etwa, ohne Garantie auf Korrektheit. Es werden noch keine Längen o.ä. geprüft, also kann es knallen, wenn die gelesenen Strings zu groß werden. Außerdem ist die Anzahl der gelesenen Einträge noch fix. Also noch eine Menge zum Üben, für Dich.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct record
    {
        char name[50];
        char vorname[50];
        char tel[30];
        char wohnort[80];
    }record_t;
    
    int main()
    {
        const char delim[] = ";\n";
    
        FILE *datei;
        char readbuf[500];
        char* token;
        unsigned int entry_count;
        unsigned int record_count;
        unsigned int lines_read;
        char* entry[4];
        record_t* records;
    
        // im moment nur 50 eintraege. besser zeilen zaehlen und dyn. anlegen
        if( (records = malloc(sizeof(record_t) * 50)) == NULL )
        {
            exit(0);
        }
        memset(records, 0, sizeof(record_t) * 50);
    
        if ((datei = fopen("test.txt", "r")) == NULL) 
        {
            exit(0);
        }
    
        lines_read = 0;
        record_count = 0;
        while ( (fgets (readbuf, 500, datei) != NULL) && (record_count < 50 ) )
        {
            entry[0] = records[record_count].name;
            entry[1] = records[record_count].tel;
            entry[2] = records[record_count].vorname;
            entry[3] = records[record_count].wohnort;
            ++record_count;
    
            entry_count = 0;
            token = strtok(readbuf, delim);
            while( (token != NULL) && (entry_count < 4) )
            {
                strcpy(entry[entry_count], token);
                ++entry_count;
                token = strtok(NULL, delim);
            }
        }
        lines_read = record_count;
    
        for(record_count = 0; record_count < lines_read; ++record_count)
        {
            printf("Satz: %u\n", record_count);
            printf("Name: %s\n", records[record_count].name);
            printf("Vorname: %s\n", records[record_count].vorname);
            printf("Tel: %s\n", records[record_count].tel);
            printf("Ort: %s\n\n", records[record_count].wohnort);
        }
    
        free(records);
        return 0;
    }
    


  • Wenn die Textdatei so aussieht, dann sind die Zeilen mit einem '\n' abgeschlossen.
    Schreibst du die Textdatei selbst oder wo kommt die her.
    Es ist wichtig zu wissen, ob Maximallängen für
    - eine Zeile
    - für die Namen
    gegeben sind.

    Dann kann das Einlesen vereinfacht werden.



  • wieso verzweifelt, ist das ne hausaufgabe ?



  • Leider ja... 😞

    Danke für die Lösung. Probier ich sofort aus.



  • darfst du malloc benutzen ?
    oder haben die zeilen eine maximale länge ?



  • Funktioniert. vielen Dank. Auch für die Mühe! 👍



  • Wie könnte ich jetzt, um das kleine i-Tüpfelchen noch zu bekommen, eine eventuelle Kommentierung "auslöschen"? Einfaches hinzufügen von # zu delim? Also alle Zeilen, welche mit # beginnen.



  • gnome.gemini schrieb:

    Wie könnte ich jetzt, um das kleine i-Tüpfelchen noch zu bekommen, eine eventuelle Kommentierung "auslöschen"? Einfaches hinzufügen von # zu delim? Also alle Zeilen, welche mit # beginnen.

    Ein bischen musst Du schon selbst machen. Sonst ist der Lerneffekt quasi 0.


Anmelden zum Antworten