Dummie-Frage? Zeilen aus einer TXT auslesen und einer Variablen zuordnen



  • Hallo zusammen,

    ich weiss, ich komme hier wohl mit einer DAU-Frage, aber ich komme damit nicht klar.

    Ich habe eine Textdatei, die folgendermassen aufgebaut ist:

    1                                      /* Nummer des Buttons */
    Buttontext1                            /* Text auf dem Button, der hier abgelegt wurde */
    \\Storage Card\\programme\\test1.exe   /* abgelegter Link der dann später verwendet werden soll*/
    
    2
    Buttontext2
    \\Storage Card\\programme\\test2.exe
    
    /*
    bis zu Button 8. Alle Buttons sollen beschriftet werden. Steht da als
    Buttontext "frei" wird dieser Button mit frei beschriftet und bekommt 
    keine Exe zugeteilt, nur ein PostQuitMessage(0) und  ein return TRUE
    */
    
    8
    Buttontext8
    \\Storage Card\\programme\\test8.exe
    

    Wie bekomme ich diese Datei zeilenweise ausgelesen und dann für jeden Button, Buttontext und Link eine eigene Variable zugeteilt??? 😕

    Die weitere Verarbeitung soll dann über die WinAPI erfolgen, wenn ich das mal geschafft haben sollte....

    Please help me... 😞





  • Hi,
    die Daten für die Buttons kannst du in eine Struktur packen und für jeden erflogreich eingelesenen Datensatz jeweils eine neue Struktur dynamisch erzeugen. Die erzeugten Strukturen lassen sich in einer Liste oder in einem Zeigerarray speichern. Die Struktur kann so

    typedef struct button Button;
    
    struct button 
    {
    	int nr;
    	char* text;
    	char* link;
    };
    

    oder so

    #define MAXLEN 1024 
    typedef struct button Button;
    
    struct button 
    {
    	int nr;
    	char text[MAXLEN];
    	char link[MAXLEN];
    ;
    };
    

    aussehen. Je nachdem, was du besser findest, bzw. was verlangt wird. Die erste Variante ist etwas umfangreicher in der Programmierung, dafür aber ressourcenschonend. Wenn du nicht gerade riesige Datenmengen hast, ist die zweite Variante ganz ok und lässt sich relativ einfach programmieren, d.h. das Einlesen von jeweils drei Zeilen kann in einem einzigen fscanf Aufruf erfolgen.

    Der weitere Verlauf hängt davon ab, wie du die Buttons speichern willst.
    Gruß,
    B.B.



  • Sodele... File einlesen sollte doch so schon mal funktionieren... Was mir aber noch nicht klar ist, wie ich die jeweilige Zeile dann in die Variable bekomme.

    FILE *fp
    char line[100];
    
    if(fp = fopen( "\\My Flash Disk\\Navigation\\Skin480x272\\Addins\\Addins-Menu.txt", "r" ))!= NULL )
        {
        if( fgets( line, 100, fp ) == NULL)	
            {
            return 0;
            }
        else
            {
            /*        hier fehlt mir noch dann das eigentliche Speichern der einzelnen Zeilen in Variable
                      Was passiert eigentlich mit den Leerzeilen? Wie werden die verarbeitet???
            */
            }
    else
        {
        int iRet = MessageBox(NULL, L"Addins-Steuerdatei fehlt oder ist beschädigt", L"Menü-Fehler!", MB_SETFOREGROUND | MB_YESNO);
        switch (iRet)
            {
            case IDYES:
                SetSystemPowerState (NULL, POWER_STATE_RESET ,0 ); 
                return 0;
            case IDNO:
                return 0;
            }
    
       }
    

    Wie ich mit fscanf() dann umgehen soll, da lese ich noch...



  • Pitter (c) schrieb:

    FILE *fp
    char line[100];
    
    if(fp = fopen( "\\My Flash Disk\\Navigation\\Skin480x272\\Addins\\Addins-Menu.txt", "r" ))!= NULL )
        {
        if( fgets( line, 100, fp ) == NULL)	
            {
            return 0;
            }
        else
            {
            /*        hier fehlt mir noch dann das eigentliche Speichern der einzelnen Zeilen in Variable
                      --> die erste ist schon drin, also wäre eine Schleife angebracht
                      Was passiert eigentlich mit den Leerzeilen? Wie werden die verarbeitet???
                      --> dann hast du in line {'\n', 0}
            */
            }
    

    Wie ich mit fscanf() dann umgehen soll, da lese ich noch...

    Ich auch. Seit Jahrzehnten.
    🙂



  • Pitter (c) schrieb:

    Sodele... File einlesen sollte doch so schon mal funktionieren...

    ja, wenn die datei existiert und 100 zeichen hat, funktioniert das prima. 😃
    ⚠ für mehrere zeilen brauchst du aber ne schleife ⚠



  • Moin zusammen,
    erst mal Danke, dass Ihr mir DAU helft... ist ja leider nicht selbstverständlich. 👍

    Es sind 8 Buttons mit jeweils einer Beschriftungszeile und einer Zeile wo der Link zu dem auszuführenden Programm steht.
    Also durchaus mehr als 100 Zeichen möglich.

    Bin nun nicht im Klaren darüber, wie ich mit den Leerzeilen zwischen den Abschnitten umgehen soll und den ausgelesenen Werten dann die entsprechende Variable zuweisen kann.

    Ich hatte das so gedacht:

    bn1 (dann die ausgelesene Nummer, wobei mir klar ist, dass überall der Zeilenwechsel mit übergeben wird.)
    bt1 (darin dann der Buttontext)
    bl1 (darin dann der gespeicherte Link)

    bn2
    bt2
    bl2
    usw....



  • Pitter (c) schrieb:

    Bin nun nicht im Klaren darüber, wie ich mit den Leerzeilen zwischen den Abschnitten umgehen soll und den ausgelesenen Werten dann die entsprechende Variable zuweisen kann.

    Wenns immer maximal 8 Buttons sind, brauchst du nicht unbedingt eine dynamische Erzeugung der Strukturen.
    Prinzipell tut es auch ein Array:

    struct button buttons[8] = {0};
    

    Die Zeilen kannst du mit fgets einlesen, Leerzeilen ignorieren und eventuell z.B. die Buttonnummer nach int konvertieren, oder aber du lässt fscanf jeweils 3 Zeilen einlesen und die Konvertierung übernehmen.
    Hier mal ne Möglichkeit mit fscanf, es können sich beliebig Leerzeilen zwischen den Zeilen mit den Daten befinden:

    #include <stdio.h>
    #include <string.h>
    #include <errno.h>
    
    #define LINELEN_MAX 1023 // Maximale Anzahl der Zeichen einer Zeile.
    #define N 8 // Anzahl der Button.
    
    typedef struct button Button;
    
    struct button {
    	int nr;
    	char text[LINELEN_MAX+1];
    	char link[LINELEN_MAX+1];
    };
    
    int eret( char* s) {
    	fprintf ( stderr, "%s: %s\n", s,  strerror(errno) );
    	return 1;
    }
    
    void view_button_array ( Button* b, unsigned n ) {
    	unsigned i = 0;
    	while ( i < n )
    		printf ( "%d\n" "%s\n" "%s\n\n", b[i].nr, b[i].text, b[i].link ), i++;
    }
    
    int main() {
    	int n = 3, // Anzahl der zu einem Datensatz zugehörigen Zeilen.
    		i = 0; // Index und Zähler fürs Strukturarray.
    	char* fname = "test.txt",
    			*fmt = "%d %1023[^\n]\n %1023[^\n]\n"; // Angepasst an LINELEN_MAX.
    	FILE* fp = fopen ( fname, "r" );
    	Button buttons[N] = {0}; // Strukturarray für die Daten der Buttons.
    
    	if ( fp == NULL ) return eret ( fname );
    
    	while ( !feof(fp) ) {
    		if ( i == N ) {
    			puts ( "Das Array ist voll!");
    			break;
    		}
    		if ( n != fscanf ( fp, fmt, &buttons[i].nr, buttons[i].text, buttons[i].link )) {
    			puts ( "Unvollstaendiger Datensatz!" );
    			break;
    		}
    		i++;
    	}
    	printf ( "Es wurden %d Datensaetze eingelesen.\n\n", i );
    	view_button_array ( buttons, i );
    	fclose ( fp );
    	return 0;
    }
    

    Gruß,
    B.B.



  • Danke BB,

    hab mir Dein Script mal in ruhe angeschaut und auch hoffentlich verstanden... 😉

    Das werde ich mal heute Abend mal für meine Zwecke umbauen und mir eine Message mit den Vars auf den Screen stellen, was der wie ausgibt....
    Dann muss ich mal sehen, wie ich das dann auf die Buttons legen kann, aber das ist erst mal ne andere Baustelle. Erst mal sehen, dass ich die Sachen überhaupt vernünftig ausgelesen bekomme.

    Ich werde berichten wie weit ich gekommen bin.



  • Hallo BB,

    wie erwartet hab ich es geschafft, dass die TXT ausgelesen wird, allerdings schaffe ich es nicht, das in die Buttons einzubauen... DAU halt... 😞

    Aber da schreibe ich dann was im WinAPI-Bereich was zu, das hat ja mit ANSI C jetzt nix mehr zu tun...


Log in to reply