Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
-- Theoretische Informatik (http://www.informatikerboard.de/board/board.php?boardid=5)
--- Struktur (http://www.informatikerboard.de/board/thread.php?threadid=1825)


Geschrieben von lilli. am 05.03.2014 um 12:15:

  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:

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?



Geschrieben von Karlito am 05.03.2014 um 14:40:

 

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



Geschrieben von lilli. am 05.03.2014 um 14:46:

 

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);



Geschrieben von Karlito am 05.03.2014 um 14:49:

 

Sollt ihr denn unbedingt ein struct verwenden?



Geschrieben von lilli. am 05.03.2014 um 14:55:

 

nein steht ja nicht in der aufgabe. ich hab nur an struct gedacht



Geschrieben von Karlito am 05.03.2014 um 15:06:

 

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(&current_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



Geschrieben von lilli. am 05.03.2014 um 15:16:

 

Das sieht schwer aus geschockt . 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.



Geschrieben von Karlito am 05.03.2014 um 15:18:

 

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



Geschrieben von lilli. am 05.03.2014 um 15:48:

 

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);
}



Geschrieben von Karlito am 05.03.2014 um 15:51:

 

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.



Geschrieben von lilli. am 05.03.2014 um 15:52:

 

wir müssen das schriftlich machen, ist eine aufgabe aus einer probeklausur



Geschrieben von lilli. am 05.03.2014 um 16:02:

 

Hab das jetzt mal auch mit dem Editor einfach gemacht.
Das Programm gibt mir aber nur Herr Martin Mustermann aus



Geschrieben von lilli. am 05.03.2014 um 16:06:

 

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?



Geschrieben von as_string am 05.03.2014 um 16:22:

 

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



Geschrieben von Karlito am 05.03.2014 um 17:59:

 

@ 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.


Forensoftware: Burning Board, entwickelt von WoltLab GmbH