Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Theoretische Informatik » Struktur » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Seiten (3): [1] 2 3 nächste » Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Struktur
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
lilli.
unregistriert
Struktur Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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 Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
lilli.
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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 Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Sollt ihr denn unbedingt ein struct verwenden?
05.03.2014 14:49 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
lilli.
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

nein steht ja nicht in der aufgabe. ich hab nur an struct gedacht
05.03.2014 14:55
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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
05.03.2014 15:06 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
lilli.
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.
05.03.2014 15:16
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
lilli.
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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 Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
lilli.
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

wir müssen das schriftlich machen, ist eine aufgabe aus einer probeklausur
05.03.2014 15:52
lilli.
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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 as_string ist männlich
Haudegen


Dabei seit: 06.11.2013
Beiträge: 638
Herkunft: Heidelberg

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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 as_string ist offline E-Mail an as_string senden Beiträge von as_string suchen Nehmen Sie as_string in Ihre Freundesliste auf
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

@ 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 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
Seiten (3): [1] 2 3 nächste » Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Theoretische Informatik » Struktur