C - In einer Datei Personen mit einer bestimmten Postleitzahl herausfiltern/ausgeben

Niemand macht sich hier gegenseitig nieder. Wir versuchen nur eine gute Lösung zu finden. Eine mögliche hatte ich in #11 vorgeschlagen. Bei mir funktioniert sie.

Ich glaube jede Verbesserung ist gerne gesehen (z.B. eine Erklärung des Unterschiedes eines Buffer Overflows und eines SegFaults).
 
// Das ist die Original-Aufgabe.. Gibt gerade mal 12 von ca. 100 Punkten ... 2 Stunden Klausurzeit

4.3 (12 Punkte)

Es wird angenommen, daß eine Textdatei kunden.txt vorliegt, die in einer Textzeile einen Kundensatz speichert. Ein Kundensatz ist wie folgt aufgebaut:

Anrede Vorname Name Strasse Hausnummer Postleitzahl Stadt

Insbesondere die Postleitzahl kann nur aus einer Folge der Ziffer 0-9 bestehen. Jeder Kun- densatz schließt mit einem newline (\n) am Ende der Zeile. Die Felder eines Datensatzes sind durch Leerzeichen getrennt. Eine Beispieldatei ko ̈nnte z. B. so aussehen:

Herr Martin Mustermann Holzweg 42 42119 Wuppertal
Frau Bibi Blocksberg Waldweg 999 14195 Berlin

Schreiben Sie ein C-Programm, daß alle Kundennamen (mit Vornamen und Anrede) ausgibt, die in Wuppertal unter der Postleitzahl 42119 wohnen.
 
@elektro2: Ja gut, dann müsstest du es zwar geringfügig anpassen und meinetwegen die 42119 hardcoden, aber nochmal die Frage, was genau gefällt dir an #11 nicht, dass du nicht ändern kannst und eine andere Lösung suchst?

antred schrieb:
Und was ist ein String in C wenn nicht ein Array? :)
Ja, ich verstehe schon. Deswegen auch die Ironie.
Aber zumindest liest man so die ganze Datei nicht mehr in ein Array ein.
 
powerfx schrieb:
Niemand macht sich hier gegenseitig nieder. Wir versuchen nur eine gute Lösung zu finden. Eine mögliche hatte ich in #11 vorgeschlagen. Bei mir funktioniert sie.

Ich glaube jede Verbesserung ist gerne gesehen (z.B. eine Erklärung des Unterschiedes eines Buffer Overflows und eines SegFaults).
[Sarkasmus an]
Ach so, sorry, dann habe ich das wohl falsch verstanden!
[Sarkasmus aus]

Kein Wunder, dass man uns Programmierern immer wieder nachsagt, dass wir soziale Trottel sind.
Ihr merkt das scheinbar gar nicht mehr, in was für einem Ton ihr euch unterhaltet...

Von mir aus zerlegt mich jetzt Stück für Stück, damit kann ich leben.

@Threadersteller:
Sie haben Post! :)
 
Ob mir deine Lösung gefällt oder nicht, weiß ich nicht. Ich verstehe deine Lösung leider nicht...Dass man mit den Parametern von Main arbeiten kann weiß ich, aber mir fehlt leider das Wissen dazu :/
 
Das war nur zur Übergabe der PLZ. Du führst es nach Schema
Code:
<dateiname> <plz>
aus und das Programm sucht dann die PLZ und gibt sie mit Namen aus, also etwa
Code:
./meinProgramm 42103
oder
Code:
meinProgramm.exe 42103    // nehme ich an...
Wie schon geschrieben, wenn du immer nur eine ganz bestimmte PLZ suchst, kannst du sie einfach fest hineinschreiben und brauchst das nicht. Dann hat man sogar das etwas unschöne atoi weg.

@DecentMan: Ich weiß nicht, wieso du das so siehst. :(
 
Zuletzt bearbeitet:
Wenn ich dein Programm laufen lasse, steht da der Pfad zu meinem Xcode Projekt. Total seltsam :)
 
Dann musst du nachschauen, wie du bei Xcode einen Parameter übergeben kannst oder einfach auf Xcode verzichten.

So ist es ohne Parameter mit fester PLZ:
Code:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	FILE *file = fopen("data.txt", "r");
	int plz, match = 0;
	char name[42];

	if (file != NULL)
	{
		while((fscanf(file,"%s %d\n",name,&plz)) != EOF)
			if (42103 == plz)
			{
				match = 1;
				fprintf(stdout,"%d: %s\n",plz,name);
			}
			fclose(file);

		if (match == 0)
			fprintf(stdout,"Nichts gefunden.\n");
	}
	else
	{
		printf("Datei kann nicht geoeffnet werden.\n");
		return EXIT_FAILURE;
	}

	return EXIT_SUCCESS;
}
 
Zuletzt bearbeitet:
Danke !! Hat geklappt. Ich habe mich schon gewundert, warum die Aufgabe nur 12 von 100 Punkten gibt, wenn man einen ganzen Roman an Zeilen schreiben muss.

Vielen Dank nochmal :)

Also von meiner Seite aus ist das Problem gelöst.

Aber eine Frage habe ich doch noch an dich ! :))

Code:
while((fscanf(file,"%s %d\n",name,&plz)) != EOF)

Diese Zeile verstehe ich nicht. Die Schleife ist mir klar. Aber warum sortiert fscanf() die Datei nach Namen und PLZ? Also ich denke mal, dass fscanf sich immer nur eine zeile angucken soll, weil du ja das \n drin hast. Aber warum geht das so einfach.. sortiert die Funktion nach buchstaben und zahlen?
 
Zuletzt bearbeitet:
Das ist quasi Pattern-Matching. Eine Zeile wird als "%s %d\n" gelesen, also
"[String] [Leerzeichen] [Dezimal-Integer] [\n]"
und dabei der String und Integer in die Variablen "name" bzw. "plz" (zwischen-)gespeichert.
 
Vergiss scanf() bitte sofort wieder. Es ist unmöglich, das auf sichere Art zu verwenden. Benutze es bloß niemals! Die Funktion hat keine Ahnung, wie viel Platz für die Eingaben tatsächlich reserviert ist und schreibt munter immer weiter, lässt im besten Fall nur dein Programm abstürzen und man kann sie für übelste Dinge missbrauchen. Bitte, bitte, bitte tu es nicht!
 
Zurück
Oben