.txt einlesen + auswerten



  • hey @ll..;)

    ich hab da ne frage an euch..;)
    und zwar, wenn ich jz in C ein .txt file einlese mit z.B.:

    222.333.111.234
    HHH-PC
    1

    333.123.414.241
    GGG-PC
    3

    diesen Einträgen.
    ich lese das file ganz normal mit fopen("...","w+t"); ein und anschließend will ich sagen dass die "333.123.414.241" ein char, "GGG-PC" ein char und 3 eine int ist.
    nur wie kann ich dass in c schreiben?? wie mach ich das?
    hoffe ihr versteht meine frage^^

    will anschließend mit bubblesort eine kleine liste sortieren und man soll im prog. auswählen können nach was man sortiert : IP, NAME, NUMMER.. 😉

    mfg. goofie



  • Dieser Thread wurde von Moderator/in Dravere aus dem Forum C# und .NET in das Forum ANSI C verschoben.

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

    Dieses Posting wurde automatisch erzeugt.



  • - Datei zum Schreiben öffnen
    - Daten mittels fprintf(...) in die Datei schreiben
    - Datei schließen

    - Datei zum Lesen öffnen (Modus r für read)
    - Daten mittels fscanf(...) in die jeweiligen Variablen zurückschreiben
    - Datei schließen

    http://www.cplusplus.com/reference/clibrary/cstdio/fprintf/
    http://www.cplusplus.com/reference/clibrary/cstdio/fscanf/



  • Danke für die Hilfe, jedoch war mir das klar..;)
    ich wollt eigentlich wissen wie das geht das ich die auseinanderkenne?
    IP eill ich als char (array) abspeichern nur wie wähle ich diese?

    z.B.:

    222.333.111.234
    HHH-PC
    1

    fopen("","r");
    fscanf("%s",??);

    mfg.



  • ich hatte instinktiv die Hoffnung, dass du dir zumindest mal die Beispiele in
    den von mir müheseelig zusammenkopierten Links mal anschaust.

    // fscanf benoetigt als 1. Parameter ein Filehandle
    FILE *foo;
    char value1[100];
    int value2;
    
    foo = fopen("deineDatei.txt", "r");
    
    // einen string auslesen
    fscanf(foo, "%s", value1);
    // einen int auslesen
    fscanf(foo, "%d", &value2);
    
    // du kannst auch kompinieren und mehreres zugleich auslesen (getrennt durch einen Zeilenumbruch
    fscanf(foo, "%s\n%d", value1, &value2);
    

    vergiss nicht, bei fscanf benoetigst du fuer die Variablen die Adresse 🙂



  • ah sry..^^

    danke.. 😉

    mfg.



  • hallo

    hab noch eine Frage:

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

    wie funktioniert das, das ich einen ',' als splitter verwende?

    mfg.



  • 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


Log in to reply