Formatiert einlesen

mileu

Grünschnabel
Hi Leute,

ich wollte eine datei formatiert einlesen... hab aber probleme mit nem String.
wäre cool wenn mir jmd helfen könnte.

Die Datei ist als .txt gespeichert:
Code:
Meyer,2,03.04.1985
Schmitt,4,04.06.1984
Bauer,5,21.06.1986

Code:
#include <stdio.h>

FILE *datei;

typedef struct {
	int tag, monat, jahr;
}datum;

typedef struct {

	char	name[20];
	int		semester;
	datum	geburtstag;

}student;

int studianz = 10;
student studi[10];

int main(){
	int i = 0;
	
	datei = fopen("Studenten.txt","r");

	while ((fscanf(datei, "%s,%d,%d.%d.%d\n", studi[i].name, studi[i].semester, studi[i].geburtstag.tag,
		studi[i].geburtstag.monat, studi[i].geburtstag.jahr))!= EOF){
		i++;
	}
	
	for(i=0;i < studianz; i++){
		printf("Name: %s,\tSemester: %i\tGeburtstag: %i.%i.%i\n", studi[i].name, studi[i].semester,
			studi[i].geburtstag.tag, studi[i].geburtstag.monat, studi[i].geburtstag.jahr);
	}
}

Mein Problem ist, dass die ganze Zeile als String anerkannt wird und dann die ganze Zeile in studi[i].name reingeschrieben wird, anstatt nur das bis zum Komma in studi[i].name reinzuschreiben.

Ich hab bestimmt irgendwo en kleinen (Denk)Fehler den ich die ganze Zeit übersehe...

Mit Gruß

Mileu
 
Hi,

hab das so ausprobiert wie du´s da hast, hat aber leider net geklappt...

was hat das eigentlich auf sich mit diesem %[]?

%[] a set of characters

das bringt mir net gerade viel =)

gruß

*edit*

hab grad nachgelesen was &[^,] genau macht. allerdings bricht es nach danach das ganze fscanf ab.

gruß
 
Zuletzt bearbeitet:
Hi.

Du hast außerdem den Adressoperator vergessen. (bekommst du denn keine Warnungsmeldungen vom Compiler?!)

Und prüfe lieber ob auch 5 Werte eingelesen wurden und nicht nur ob kein EOF kam:
C:
while (fscanf(datei, "%[^,],%d,%d.%d.%d\n", studi[i].name, &studi[i].semester, &studi[i].geburtstag.tag,
		&studi[i].geburtstag.monat, &studi[i].geburtstag.jahr) == 5) {
  ...
}
Gruß
 
Zuletzt bearbeitet:
Hey,

zum thema adressoperator. den braucht man bei arrays nicht, weil z.B.
Code:
studi[i].name
schon auf eine adresse zeigt.
warnung hat der compiler diesbezüglich bei mir auch noch nie welche ausgespuckt.

das mit dem regulären ausdruck klappt auch nicht. was mich auch stark wundert... nachdem was ich gelesen habe, müsste es ja gehen. hoffe ich hab da net was falsch verstanden.

und ne frage zu der 5:
wann soll denn der wert den fscanf ausspuckt 5 werden? kommt mir bissl komisch vor diese abfrage...

gruß

mileu
 
zum thema adressoperator. den braucht man bei arrays nicht, weil z.B. studi[ i ].name schon auf eine adresse zeigt.
warnung hat der compiler diesbezüglich bei mir auch noch nie welche ausgespuckt.
Ich hab auch nicht vom Array gesprochen. Schau dir meinen Code nochmal genau an.
das mit dem regulären ausdruck klappt auch nicht. was mich auch stark wundert... nachdem was ich gelesen habe, müsste es ja gehen. hoffe ich hab da net was falsch verstanden.
Bei mir funktioniert es wie gewünscht.
und ne frage zu der 5:
wann soll denn der wert den fscanf ausspuckt 5 werden? kommt mir bissl komisch vor diese abfrage...
Weil fscanf die Anzahl der erfolgreich konvertierten Werte zurückgibt. Da du 5 Formatdirektiven und 5 Adressen als Parameter übergeben hast, gibt fscanf bei Erfolg auch 5 zurück. Siehe z.B. http://linux.die.net/man/3/scanf

Gruß
 
Hey,

welchen Compiler oder Umgebung benutzt du?

Ich benutze Visual C++ 2008... Ist da irgendwas bekannt? Ob es irgendwelche Probleme bereitet mit fscanf oder ähnliches?

gruß

Mileu
 
Zuletzt bearbeitet:
Ich kenne keinen Compiler, der Formatstrings auf Richtigkeit überprüft.

Die int-Variablen brauchen einen &-Operator.
Der &-Operator hat eine hohe Priorität, vielleicht macht er Probleme. Versuche mal

C:
fscanf(datei, "%s,%d,%d.%d.%d\n", studi[i].name, &(studi[i].semester), &(studi[i].geburtstag.tag),
		&(studi[i].geburtstag.monat), &(studi[i].geburtstag.jahr))
Es kann aber auch sein, dass du die Klammern weglassen kannst.

Wenn alles nicht hilft, dann lies die ganze Zeile als einen String ein und zerteile ihn mit strtok().
 
Hi.
Ich kenne keinen Compiler, der Formatstrings auf Richtigkeit überprüft.
Wieviel Compiler kennst du denn? Der GCC tut es und CLang auch.
Die int-Variablen brauchen einen &-Operator.
Der &-Operator hat eine hohe Priorität, vielleicht macht er Probleme. Versuche mal

C:
fscanf(datei, "%s,%d,%d.%d.%d\n", studi[i].name, &(studi[i].semester), &(studi[i].geburtstag.tag),
		&(studi[i].geburtstag.monat), &(studi[i].geburtstag.jahr))
Es kann aber auch sein, dass du die Klammern weglassen kannst.
Du rätst aber nur rum, oder? Der Code unterscheidet sich von dem den ich gepostet habe überhaupt nicht (außer das das ursprüngliche Problem mit %s wieder drin ist). Der & Operator hat eine niedrigere Priorität als [] und . Operator.
Wenn alles nicht hilft, dann lies die ganze Zeile als einen String ein und zerteile ihn mit strtok().
Das ist unnötig. Es funktioniert - auch mit MSVC 8.0.

Gruß
 

Neue Beiträge

Zurück