.txt einlesen + auswerten



  • Eine Zeile für dein obiges Beispiel mit den 3 Werten würde in etwa so aussehen

    /*
    222.333.111.234,HHH-PC,1
    333.123.414.241,GGG-PC,3
    */
    
    // char, char, int
    fscanf(foo, "%[^','],%[^','],%d\n", value1, value2, &value3);
    


  • ah ok..;)
    also sollte dass so aussehen?

    void schreiben ()
    {
    	FILE* fp = NULL;
    	FILE* fp2 = NULL;
    	char name[100];
    	int nummer;
    
    	fp = fopen("bubble.txt","r");
    	if( fp == NULL)
    	{
    		exit(0);
    	}
    
    	fseek(fp, 0, SEEK_SET);
    
    	fscanf(fp, "%s[^','],%d\n", name, nummer);
    	printf("%s", name);
    	fclose(fp);
    }
    

    hier ist aber immer ein Fehler beim ausführen?!?!



  • Ja ...

    // nicht so
    fscanf(fp, "%s[^','],%d\n", name, nummer);
    // sondern so
    fscanf(fp, "%[^','],%d\n", name, &nummer);
    

    - nummer ist eine Zahl, drum dort den Addressoperator & angeben
    - die "RegExp" bezieht sich nur auf Strings, drum kann das s weg



  • ah gut danke..;)
    jetzt geds..;)

    nun die nächste frage:
    222.333.111.234,HHH-PC,1
    333.123.414.241,GGG-PC,3
    123.142.234.231,FFF-PC,4
    133.111.432.123,BBB-PC,2
    222.333.452.124,AAA-PC,5

    wenn ich jetzt alle einlesen möchte.. wie mach ich das?
    ich hab jetzt die erste zeile eingelesen nur wie lese ich die weiteren ein?

    ich hoff das ich nich zu lästig bin, bin leider noch neuling.. 😞



  • Dann ist jetzt wohl mal der Befehl feof dran 😃

    while(!feof(fp))
    {
        // tu was
    }
    

    eof steht für END OF FILE ... mit ! prüfst du auf ungleich end of file.



  • ok gut..;)

    hab auch einen typen def.. so ok?

    typedef struct
    {
    	char name[100];
    	char ip[100];
    	int nummer;
    }bubb;
    
    bubb uebergabe;
    
    while(!feof(fp))
    	{
    	fscanf(fp, "%[^','],%[^','],%d\n", ip, name, &nummer);
    	/*printf("%s", name);*/ 
    	ip = uebergabe.ip;
    	name = uebergabe.name;
    	&nummer = uebergabe.nummer;
    	}
    

    dann würd das so aussehen.. 😉

    is das so möglich?
    werden die values hier nich überschrieben? Dann würde doch nurmehr die letzte zeile stehen?!?! oder?^^



  • Mhhh, da scheint aber noch so einiges im argen zu sein 😮

    der typedef ist so ok, aber bubb << 😃 , meinst nicht, dass ein aussagekräftiger Variablenname der Menschheit mehr bringt?

    ip = uebergabe.ip;
    name = uebergabe.name;
    &nummer = uebergabe.nummer;
    

    🙄 des ist Käsekacke. Also wenn du das kompilierst, dann krachts.
    Vorallem warum willst du die ausgelesenen Werte wieder überschreiben?

    Um deine Struct zu füllen (ich geh mal davon aus, dass du das auch willst)
    Kannst du diese ja direkt im fscanf angeben

    fscanf(fp, "%[^','],%[^','],%d\n", uebergabe.ip, uebergabe.name, &uebergabe.nummer);
    

    Bevor ich dir jetzt zu später Stunde alles vorkaue, versuch mal nun selbst etwas initiative zu zeigen 😉



  • ok gut danke... 😉

    ich meld mich morgen wieder wenn ich mehr hab.. 😃

    mfg.



  • Hallo Community,
    hab da ein ähnliches Problem.
    Das mit dem einlesen leuchtet mir soweit ein. Ich hab nur leider keinen Plan, wie ich gewisse Werte auswerte.

    Bei mir sieht die .dat bzw. die .txt so aus:
    Müller 50
    Müller 12
    Müller 28
    Bäcker 15
    Bäcker 75
    Mayer 80
    Mayer 91
    Mayer 42
    ...

    Nun wollte ich zu dem jeweiligen Namen das höchste Alter speichern und ausgeben lassen. Wie kann ich das am effektivsten lösen? Durch ein mehrdimensionales Array oder durch eine Struktur mit je einen Array für den Namen und das Alter?
    Würde mich über ein paar Hinweise freuen.
    Gruß
    Saul



  • Hallo,

    Saul schrieb:

    Wie kann ich das am effektivsten lösen? Durch ein mehrdimensionales Array oder durch eine Struktur mit je einen Array für den Namen und das Alter?
    Würde mich über ein paar Hinweise freuen.
    Gruß
    Saul

    das hängt von mehreren Faktoren ab. Z.B. von der Datenmenge, von der Laufzeit für die Sortierung, vom Verwendungszweck, ob sich die Anzahl der Einträge in der Datei ändert oder konstant ist, was mit den Daten gemacht werden soll, etc. Es sind also weitere Infos von dir nötig.

    Ansonsten nehme jetzt einfach mal ganz stupide als Verwendungszweck deine Aufgabenstellung an

    Nun wollte ich zu dem jeweiligen Namen das höchste Alter speichern und ausgeben lassen.

    und setzt nach Namen sortierte Einträge voraus.

    int main()
    {
    	char name[256] = {0}, buf[256] = {0}, *fname = "test.txt";
    	int age = -1, agebuf;
    	FILE* fp = fopen ( fname, "r" );
    	if ( fp == NULL ) return 1;
    
    	setlocale ( LC_ALL, "German" );
    
    	while ( !feof(fp) )
    	{
    		fscanf ( fp, "%s %d",  buf, &agebuf );
    		if ( 0 != strcmp ( name, buf ))
    		{
    			if ( name[0] != 0 )
    				printf ("%s %d\n", name, age );
    			strcpy ( name, buf );
    		}
    		if ( agebuf > age )
    		{
    			age = agebuf;
    			strcpy ( name, buf );
    		}
    	}
    	if ( name[0] != 0 )
    		printf ("%s %d\n", name, age );
    	fclose ( fp );
    	return 0;
    }
    

    Gruß,
    B.B.



  • Durch ein mehrdimensionales Array oder durch eine Struktur mit je einen Array für den Namen und das Alter?

    ginge beides, das zweite klingt schöner. den namen einfach als string ginge natürlich auch 😉

    aber in der c++ stl gibt es da den Container map.
    ganz einfach gesagt kannst du damit auch strings als index bei einem array benutzen, also direkt die namen als index benutzen.



  • ops sorry, hatte mehere tabs offen und dachte das wäre c++ hier.



  • Hallo Community...

    Danke Brother 🙂 genau sowas habe ich gesucht ... ich musste nur in der ersten If-Schleife noch den Ausdruck age = agebuf; ergänzen. Sonst hätte er für alle nachkommenden Namen ebenfalls das Alter 91 genommen, es sei denn das Alter wäre noch höher gewesen.

    Big Brother schrieb:

    int main()
    {
    	char name[256] = {0}, buf[256] = {0}, *fname = "test.txt";
    	int age = -1, agebuf;
    	FILE* fp = fopen ( fname, "r" );
    	if ( fp == NULL ) return 1;
    
    	setlocale ( LC_ALL, "German" );
    
    	while ( !feof(fp) )
    	{
    		fscanf ( fp, "%s %d",  buf, &agebuf );
    		if ( 0 != strcmp ( name, buf ))
    		{
    			if ( name[0] != 0 )
    				printf ("%s %d\n", name, age );
    			strcpy ( name, buf );
    			age = agebuf;
    		}
    		if ( agebuf > age )
    		{
    			age = agebuf;
    			strcpy ( name, buf );
    		}
    	}
    	if ( name[0] != 0 )
    		printf ("%s %d\n", name, age );
    	fclose ( fp );
    	return 0;
    }
    

    Gruß,
    B.B.

    Jetzt bin ich aber auf ein weiteres Problem gestoßen. Und zwar habe ich die Datei zur Übung nun noch um die Größe der Personen erweitert. Somit ist das Text-File weiterhin nach Namen sortiert, aber nicht nach Altersangaben bzw. nach der Größe.
    Müller 50 171
    Müller 12 175
    Müller 35 192
    ...
    Müller 28 189
    Bäcker 15 164
    ...
    Bäcker 75 162
    Mayer 80 167
    Mayer 91 159
    ...
    Mayer 42 166
    Schmidt 55 172
    ...
    Schmidt 22 195

    Ich wollte jetzt mal ausprobieren, mir die Daten der ältesten Personen einer gewissen Größe ausgeben zulassen. Dabei soll jeweils ein Intervall von 10cm beachtet werden. Also z.B. von 150-159, 160-169, 170-179, 180-189 und 190-199 Was als Ergebnis dann so aussehen müsste:
    Müller 35 192
    Müller 28 189
    Mayer 80 167
    Mayer 91 159
    Schmidt 55 172

    Das Problem was ich hierbei sehen ist, das ich nicht weiß wie man dieses Intervall in die Schleife von Big Brother mit einbringen könnte.
    Wäre toll wenn mir da nochmal jemand weiterhelfen könnte.
    Greetz,
    Saul



  • Also wenn ich das richtig sehe, dann muss ich für meine 5 aufgezählten Intervalle jeweils einmal durch die Text Datei durchgehen. D.h. für 5 Intervalle, 5 mal durch die Datei 😞
    Geht das sonst auch Ressourcensparender?



  • Nun wird es wohl an der Zeit, die Daten in Strukturen einzulesen. Eine Möglichkeit ist, die Strukturen gleich beim Einlesen sortiert in einer verketteten Liste zu speichern. Das nennt sich Sortieren durch Einfügen, bzw. Insertionsort.



  • Big Brother schrieb:

    Nun wird es wohl an der Zeit, die Daten in Strukturen einzulesen. Eine Möglichkeit ist, die Strukturen gleich beim Einlesen sortiert in einer verketteten Liste zu speichern. Das nennt sich Sortieren durch Einfügen, bzw. Insertionsort.

    Ich mach erstmal einen kleinen Anfang, bevor zuviel falsches auftaucht ^^

    struct liste 
    {
    	char name[50];
    	int alter;
    	int groesse; 
    	struct liste *next;
    };
    
    int main()
    {
        liste liste1;
        char *fname = "test.txt";
        FILE* fp = fopen ( fname, "r" );
        if ( fp == NULL ) return 1;
    
        while ( !feof(fp) )
        {
            fscanf ( fp, "%s %d %d\n", liste1.name, &liste1.alter, &liste1.groesse); 
    
            InsertSort(...);
        }
        fclose ( fp );
        return 0;
    }
    

    Das sollte doch so gehen oder? Nun müsste ich "nur" noch die Funktion für ein Sortierverfahren erstellen. Wenn ich es richtig verstanden habe muss erst nach der Größe sortiert und dann im jeweiligen größen-Bereich bzw. den genannten "10cm Intervall", das höchste Alter gesucht werden?
    Und schließlich Name, Alter und Größe ausgeben.



  • Saul schrieb:

    Nun müsste ich "nur" noch die Funktion für ein Sortierverfahren erstellen.

    Na dann leg mal los. Programmiere eine verkettete Liste, in der die Strukturen sortiert abgelegt, also verkettet werden.


Anmelden zum Antworten