Struktur |
lilli. unregistriert
|
|
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:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
|
struct kunde {
char anrede;
char vorname;
char name;
char strasse;
int hausnr;
int plz;
char stadt;
};
|
|
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 12:15 |
|
|
Karlito
Kaiser
Dabei seit: 11.04.2011
Beiträge: 1.461
|
|
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:40 |
|
|
lilli. unregistriert
|
|
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:46 |
|
|
Karlito
Kaiser
Dabei seit: 11.04.2011
Beiträge: 1.461
|
|
Sollt ihr denn unbedingt ein struct verwenden?
|
|
05.03.2014 14:49 |
|
|
lilli. unregistriert
|
|
nein steht ja nicht in der aufgabe. ich hab nur an struct gedacht
|
|
05.03.2014 14:55 |
|
|
Karlito
Kaiser
Dabei seit: 11.04.2011
Beiträge: 1.461
|
|
Ich würde hier kein struct verwenden.
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
|
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char **argv){
FILE *fptr;
char current_char;
int space_counter = 0;
fptr = fopen("kunde.txt", "r");
while(!feof(fptr)){
fread(¤t_char, sizeof(char), 1, fptr);
if(current_char == ' '){
space_counter++;
}
if(space_counter<3){
printf("%c", current_char);
}
if(current_char == '\n' && space_counter != 0){
space_counter = 0;
printf("\n");
}
}
return 0;
}
|
|
VG,
Karlito
|
|
05.03.2014 15:06 |
|
|
lilli. unregistriert
|
|
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:16 |
|
|
Karlito
Kaiser
Dabei seit: 11.04.2011
Beiträge: 1.461
|
|
Du musst eine Datei "kunde.txt" erstellen. Bei mir sieht sie so aus:
code: |
1:
2:
|
Herr Martin Mustermann Musterweg 42 40210 Düsseldorf
Frau Barbara Becker Burgweg 999 28777 Bremen |
|
VG,
Karlito
|
|
05.03.2014 15:18 |
|
|
lilli. unregistriert
|
|
Die Datei lässt sich bei mir nicht öffnen:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
|
int main()
{
FILE *a;
a = fopen("kunde.txt", "w");
fprintf(a,"Herr Martin Mustermann Musterweg 42 40210 Duesseldorf");
fclose(a);
}
|
|
|
|
05.03.2014 15:48 |
|
|
Karlito
Kaiser
Dabei seit: 11.04.2011
Beiträge: 1.461
|
|
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:51 |
|
|
lilli. unregistriert
|
|
wir müssen das schriftlich machen, ist eine aufgabe aus einer probeklausur
|
|
05.03.2014 15:52 |
|
|
lilli. unregistriert
|
|
Hab das jetzt mal auch mit dem Editor einfach gemacht.
Das Programm gibt mir aber nur Herr Martin Mustermann aus
|
|
05.03.2014 16:02 |
|
|
lilli. unregistriert
|
|
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:06 |
|
|
as_string
Haudegen
Dabei seit: 06.11.2013
Beiträge: 638
Herkunft: Heidelberg
|
|
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 16:22 |
|
|
Karlito
Kaiser
Dabei seit: 11.04.2011
Beiträge: 1.461
|
|
@ 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 17:59 |
|
|
|