Struktur |
05.03.2014, 12:15 | Auf diesen Beitrag antworten » | |||||
lilli. | Struktur Hallo, habe wieder ein Problem mit folgender Aufgabe: Eine Textdatei kunde.txt liegt vor, die in einer Textzeile einen Kundensatz speichert. Anrede Vorname Name Strasse Hausnummer Postleitzahl Stadt. Die Postleitzahl kann nur aus einer Folge der Ziffer 0-9 bestehen. Jeder Kundensatz schließt mit einem newline (\n) am Ende der Zeile. Die Felder eines Datensatzes sind durch Leerzeichen getrennt. Eine Beispieldatei könnte z. B. so aussehen: Herr Martin Mustermann Musterweg 42 40210 Düsseldorf Frau Barbara Becker Burgweg 999 28777 Bremen Schreiben Sie ein C-Programm, dass alle Kundennamen (mit Vornamen und Anrede) ausgibt, die in Düsseldorf unter der Postleitzahl 40210 wohnen. Meine Ideen:
Ich weiß leider nicht was ich hier machen soll. Ich glaube nicht, dass ich einfach etwas mit printf ausgeben darf. Kann mir jemand bitte helfen? |
|||||
|
||||||
05.03.2014, 14:40 | Auf diesen Beitrag antworten » | |||||
Karlito | Hallo lilli, ich denke eine modifizierte printf-Ausgabe sollte hier reichen. Lies die Datei doch Zeichenweise und gib diese immer nur bis zum dritten Leerzeichen pro Zeile aus. Die Leerzeichen zählen und am Ende der Zeile den Leerzeichenzähler zurücksetzen. VG, Karlito |
|||||
05.03.2014, 14:46 | Auf diesen Beitrag antworten » | |||||
lilli. | Ich habe damit leider noch Probleme. Wie gebe ich denn Dateien nur bis zum nächsten Leerzeichen aus? struct kunde k1 = { "Herr","Martin","Mustermann","Musterweg",42,40210,"Duesseldorf"}; printf("%s %s %s %s %d %d %s \n", k1.anrede, k1.vorname, k1.name, k1.strasse, k1.hausnr, k1.plz, k1.stadt); |
|||||
05.03.2014, 14:49 | Auf diesen Beitrag antworten » | |||||
Karlito | Sollt ihr denn unbedingt ein struct verwenden? |
|||||
Anzeige | ||||||
|
||||||
05.03.2014, 14:55 | Auf diesen Beitrag antworten » | |||||
lilli. | nein steht ja nicht in der aufgabe. ich hab nur an struct gedacht |
|||||
05.03.2014, 15:06 | Auf diesen Beitrag antworten » | |||||
Karlito | Ich würde hier kein struct verwenden.
VG, Karlito |
|||||
05.03.2014, 15:16 | Auf diesen Beitrag antworten » | |||||
lilli. | Das sieht schwer aus . Aber fread /fopen hatten wir schon und so sollten wir es auch lösen. Ich weiß leider nicht wie ich den Kundensatz reinbringe. Wenn ich dein Programm abspielen lasse kommt keine Ausgabe. |
|||||
05.03.2014, 15:18 | Auf diesen Beitrag antworten » | |||||
Karlito | Du musst eine Datei "kunde.txt" erstellen. Bei mir sieht sie so aus:
VG, Karlito |
|||||
05.03.2014, 15:48 | Auf diesen Beitrag antworten » | |||||
lilli. | Die Datei lässt sich bei mir nicht öffnen:
|
|||||
05.03.2014, 15:51 | Auf diesen Beitrag antworten » | |||||
Karlito | Du kannst die Datei doch mit dem Editor anlegen. Dazu braucht es kein selbst geschriebenes Programm. Aber wenn die Datei noch nicht exisitert und du willst sie mit fopen zum schreiben öffnen, dann musst du "w+" verwenden. |
|||||
05.03.2014, 15:52 | Auf diesen Beitrag antworten » | |||||
lilli. | wir müssen das schriftlich machen, ist eine aufgabe aus einer probeklausur |
|||||
05.03.2014, 16:02 | Auf diesen Beitrag antworten » | |||||
lilli. | Hab das jetzt mal auch mit dem Editor einfach gemacht. Das Programm gibt mir aber nur Herr Martin Mustermann aus |
|||||
05.03.2014, 16:06 | Auf diesen Beitrag antworten » | |||||
lilli. | also das mit dem Counter hab ich jetzt verstanden, aber wie krieg ich das hin, dass nur die gewünschten Daten ausgegeben werde. Also wie überspringt er die Adresse? |
|||||
05.03.2014, 16:22 | Auf diesen Beitrag antworten » | |||||
as_string | Hallo, vielleicht noch ein paar andere Punkte was die c-lib betrifft. Ich verwende eigentlich ganz gerne fgets() wenn ich eine Datei zeilenweise lesen muss. Bei einem solchen Datensatz wäre eventuell strtok() ein gangbarer Weg, besser noch eine "verbesserte" Version, wie strtok_s() bei MS VC oder so. Aber nur so als Tipp, die Lösung von Karlito ist natürlich vollkommen ok und hat sicherlich auch Vorteile. Z. B. würde der Ansatz mit strtok mehrere aufeinander folgende Leerzeichen zu einem Trenner zusammen fassen, was eventuell auch gar nicht ganz richtig wäre, auch wenn es bei den hier gezeigten Daten kein echtes Problem darstellen würde. Gruß Marco |
|||||
05.03.2014, 17:59 | Auf diesen Beitrag antworten » | |||||
Karlito | @ lilli Hast Du noch irgendetwas an meinem Code modifiziert? Bei mir läuft es so ohne Probleme, bis auf die Tatsache, dass wohl noch Sonderzeichen Ausgegeben werden, welches das Dateiende kodieren. @as_string Danke für die Anmerkung. Aber strtok würde hier wirklich nicht funktionieren, da so keine leeren Felder zulässig wären. Ansonsten ist das sicher die elegantere Methode. Ich habe auch über fscanf nachgedacht, bin aber bei einer naiven Variante geblieben, weil das mit nur wenigen pointern auskommt und somit für Einsteiger mMn am freundlichsten ist. |
|||||
05.03.2014, 18:08 | Auf diesen Beitrag antworten » | |||||
lilli. | Bei mir wird Folgendes ausgegeben: Herr Martin Mustermann Frau Barbara Becker Aber eigentlich sollte ja nur der Datensatz für Düsseldorf angegeben werden mit der PLZ |
|||||
05.03.2014, 18:28 | Auf diesen Beitrag antworten » | |||||
lilli. | und ich habe deinen code nicht verändert |
|||||
05.03.2014, 18:54 | Auf diesen Beitrag antworten » | |||||
Karlito | Entschuldigung, das habe ich überlesen. Ich denke dann könnte es sinnvoll sein, mit einem struct zu arbeiten. Und mit fscanf. Wenn dir dazu nichts einfällt, schreibe ich ein entsprechendes Programm, aber versuche mal bitte selbst eins zu schreiben. VG, Karlito |
|||||
05.03.2014, 19:17 | Auf diesen Beitrag antworten » | |||||
lilli. | Fscanf ist doch dafür da am Ende selbst etwas zu schreiben/einzulesen? Stimmt der Aufbau so jetzt muss ich nur noch fscanf einfügen oder fprintf, ich muss ja nur was ausgeben #include <stdio.h> #include <stdlib.h> struct kunde { char anrede; char vorname; char name; char strasse; int hausnr; int plz; char stadt; }; int main(void) { int c; FILE *datei; datei=fopen("kunde.txt", "r"); if(datei != NULL) { while( (c=fgetc(datei)) != EOF) putchar(c); } } |
|||||
05.03.2014, 19:24 | Auf diesen Beitrag antworten » | |||||
Karlito | Mit dem Programm gibst du einfach nur aus, was du einliest. Außerdem brauchst du für das struct Feldlängen, da hier ja nicht nur ein einzelnes Zeichen gelesen werden soll, sondern ein string (char-Array). fscanf kann verwendet werden, um daten aus einer datei zu lesen (nicht verwechseln mit scanf). fprintf schreibt in dateien. Das brauchst du hier auch nicht. printf bietet sich an, da du dann einfach soetwas machen kannst:
Schau dir mal fscanf an und wie man damit dateien auslesen kann. Ich gehe derweil mal in die Mensa Abendbrot essen VG, Karlito |
|||||
05.03.2014, 19:27 | Auf diesen Beitrag antworten » | |||||
lilli. | ok danke ich versuch es mal. und guten Appetit ;D |
|||||
05.03.2014, 19:41 | Auf diesen Beitrag antworten » | |||||
lilli. | Hab die Werte eingelesen und versucht auszugeben, was aber leider nicht klappt.
|
|||||
05.03.2014, 19:59 | Auf diesen Beitrag antworten » | |||||
Karlito | Der Ansatz ist ganz gut, hat aber ein paar Mängel: - du hast fscanf falsch verwendet - warum hat stadt keine länge? - plz würde ich als string deklarieren, das macht das leben leichter - genauso die hausnummer Dann fehlt noch der Vergleich auf Düsseldorf und 40210. Versuchs noch mal. VG, Karlito |
|||||
05.03.2014, 20:22 | Auf diesen Beitrag antworten » | |||||
lilli. | Kann ich anstelle von scanf auch fread nutzen? Und wie macht man VergleicheP? |
|||||
05.03.2014, 20:24 | Auf diesen Beitrag antworten » | |||||
lilli. | Hab was gefunden mit strcmp. Muss ich if-Anweisungen aufstellen? |
|||||
05.03.2014, 20:30 | Auf diesen Beitrag antworten » | |||||
Karlito | Fread geht auch. Ich finde fscanf hier aber Praktischer. strcmp ist hier genau der richtige Ansatz Ich war mal so frei:
VG, Karlito |
|||||
05.03.2014, 20:36 | Auf diesen Beitrag antworten » | |||||
lilli. | vielen dank aber bei mir wird nix ausgegeben |
|||||
05.03.2014, 21:15 | Auf diesen Beitrag antworten » | |||||
Karlito | Dann schaue bitte mal nach unterschieden zwischen dem Vergleich und der Textdatei. Außerdem könnte es ein Problem mit Sonderzeichen geben. Also versuche mal bitte "ü" durch "ue" bei Düsseldorf auszutauschen. Ich habe es bei mir getestet und es läuft. Ich verwende jedoch Linux. Es kann durchaus sein, solltest Du Windwos verwenden, dass es dort zu Problemen kommt. VG, Karlito |
|||||
05.03.2014, 21:24 | Auf diesen Beitrag antworten » | |||||
lilli. | Ja lag am ü. Stimmt folgende Ausgabe: Herr Martin Mustermann. Sind ja dann alle Kundennamen die in Düsseldorf wohnen |
|||||
05.03.2014, 21:31 | Auf diesen Beitrag antworten » | |||||
Karlito | Schön, freut mich zu hören! Solltest Du irgendetwas an meinem Programm nicht verstehen, dann gerne nachfragen. VG, Karlito |
|||||
05.03.2014, 21:34 | Auf diesen Beitrag antworten » | |||||
lilli. | Vielen lieben Dank , hab alles soweit verstanden |
|||||
05.03.2014, 21:49 | Auf diesen Beitrag antworten » | |||||
lilli. | nur noch eine Sache. Was sagt diese Zeile aus, das was in Klammern steht? int main(int argc, char **argv) |
|||||
05.03.2014, 22:24 | Auf diesen Beitrag antworten » | |||||
Karlito | Das ist die Deklaration der main Funktion. Diese ist bei C-Programmen immer der Einstiegspunkt für die Ausführung des Programmes. Bei einem Lauffähigen Programm wird immer als erstes die main-Funktion aufgrufen und die gesamte Programmausführung endet mit ihr. Die Main Funktion hat meist folgenden Prototyp: int main(int, char**); Das heitß, dass sie einen Integer zurückgibt (der Kann von einem anderen Programm nach der Ausführung geprüft werden, dabei heißt 0 dass alles OK ist und alles andere dass irgendetwas nicht in Ordnung ist). Weiterhin werden beim Aufruf des Programmes der main Funktion immer 2 Parameter übergeben. Die Anzahl der Argumente (oder aus Parameter) auf der Kommandozeile (argc = argument count) und ein array mit den Kommandozeilenparameter selbst (argv = argument vector). Dabei ist argc immer mindestens 1, da der erste Parameter immer der Programmname selbst ist. Argumente eines Programmes sind die Dinge die man oft hinter den Aufruf des Programmes schreibt. So zum beispiel unter windows für den shutdown-befehl "shutdown \s \t 0". Dieses Programm hätte 3 Argumente und damit wäre argc=4. Weiterhin wären argv[0] ="shutdown.exe", argv[1] = "\s", argv[2] = "\t" und argv[3] = "0". Du kannst das gerne mal mit folgendem Programm ausprobieren:
Führe einfach das erzeugte Programm auf der Kommandozeile mit verschiedenen Parametern (beliebig) aus. VG, Karlito |
|||||
05.03.2014, 22:36 | Auf diesen Beitrag antworten » | |||||
lilli. | danke, das war echt verständlich |
|
Verwandte Themen
Die Beliebtesten » |
|
Die Größten » |
|
Die Neuesten » |
|