fscanf
-
Also, ich habe eine beliebige Datei Text.txt, mit folgenden zufälligen Inhalt.
23 34 1 232
12 232 5
1
2132Das heißt, es sind beliebige Zahlen, Ziffern in dieser Datei, beliebig angeordnet.
Ich möchte mit meinem Programm, die Datei öffnen Lesen und die Messwerte in ein Array beliebiger größe Speichern. Gleichzeitig möchte ich die Anzahl der Zahlen auch noch dazu ermitteln, in diesem Beispiel wären das 9 Zahlen.
Ich denke mal das hat deswegen nicht funktioniert, da ich float Werte in das float array speichere. Und deswegen kann ich keinen String auslesen.
-
zoro schrieb:
Ich denke mal das hat deswegen nicht funktioniert, da ich float Werte in das float array speichere.
Da gehören die aber hin.
zoro schrieb:
Und deswegen kann ich keinen String auslesen.
Das hast du ja auch nicht gemacht.
Dein Beispiel im Eröffnungspost hätte mit dem printf("%s",Messdaten); genauso funktioniert. Nur könntest du dann mit den Zahlen nicht vernünftig rechnen.
zoro schrieb:
Ich möchte mit meinem Programm, die Datei öffnen Lesen und die Messwerte in ein Array beliebiger größe Speichern. Gleichzeitig möchte ich die Anzahl der Zahlen auch noch dazu ermitteln, in diesem Beispiel wären das 9 Zahlen.
Das funktioniert ja jetzt fast (du musst bei fscanf das richtige Element vom Array angeben).
Bis auf die beliebige Größe. Da musst du dich mit dynamischer Speicherverwaltung auseinander setzen. malloc und co.
-
Ok, ich glaube ich habe das verstanden mit der 1. Glaube ich.
Wäre es dann so korrekt?
if((datei_ptr = fopen(dateiname,"r")) != NULL) { while ((fscanf(datei_ptr,"%f",&Messdaten[cnt])) == 1) { cnt++; } } printf("%i\n",cnt); for (i=0;i<=cnt;i++) printf("%f",Messdaten[i]);
-
Dann nimm int!
@DirkB
Die Aufgabe ist es eine Datei auszulesen in der beliebige Zahlen (beliebig angeordnet) stehen. Wenn da nun ein Komma drin ist, ist dies nicht das Problem von zoro.
-
Oder warscheinlich so besser:
if((datei_ptr = fopen(dateiname,"r")) != NULL) { while ((fscanf(datei_ptr,"%f",&Floatvariable)) == 1) { Messdaten[cnt] = Floatvariable; cnt++; } } printf("%i\n",cnt); for (i=0;i<=cnt;i++) printf("%f",Messdaten[i]);
-
Ja habe ich vergessen zu sagen, sollen float werte sein,habe schlechte Zahlen gewählt^^
Aber vielen Dank trotzdem schon mal für die ganze Hilfe!
-
@zoro
Bie der Ausgabe kommt nur ein < cnt hin.Bitmapper schrieb:
@DirkB
Die Aufgabe ist es eine Datei auszulesen in der beliebige Zahlen (beliebig angeordnet) stehen. Wenn da nun ein Komma drin ist, ist dies nicht das Problem von zoro.Wenn da ein falsches Zeichen in der Datei ist, dann wird das vom fscanf nicht überlesen. Es bleibt im Eingabestrom stehen. fsanf gibt in diesem Fall ein 0 zurück.
Wenn er das == 1 hat, bricht das Einlesen ab.
Wenn er das != EOF hat, wird immer wieder versucht eine neue Zahl einzulesen. -> Endlosschleife.
-
Also denke habe das Problem gelöst, dank eurer Hilfe^^!
Mein Code:int main(void) { char dateiname[60]; float Messdaten[100]; int i=0,cnt=0; puts("Wie heisst die zu oeffnende Datei?"); scanf("%s",dateiname); FILE *datei_ptr; if((datei_ptr = fopen(dateiname,"r")) != NULL) { while ((fscanf(datei_ptr,"%f",&Messdaten[cnt])) == 1) { cnt++; } } printf("Anzahl Messwerte: %i\n",cnt); for (i=0;i<cnt;i++) printf("\t%f\n",Messdaten[i]); system("PAUSE"); return EXIT_SUCCESS; }
Und die Text.txt datei sieht folgendermaßen aus:
12 23 34 12 234 23 11 10 9 8 2.123
und das ist das Ergebnis:
Wie heisst die zu oeffnende Datei? text.txt Anzahl Messwerte: 11 12.000000 23.000000 34.000000 12.000000 234.000000 23.000000 11.000000 10.000000 9.000000 8.000000 2.123000 Drücken Sie eine beliebige Taste . . .
-
@DirkB
Das ist mir bewusst, ich habe gemeint, dass es nicht die Aufgabe von zoro ist auf falsche Zeichen zu reagieren. Laut Aufgabenstellung ist davon auszugehen, dass in der Datei nur Zahlen vorkommen.
-
Er soll ja auch nicht darauf reagieren (dh. überlesen oder Meldung an den Nutzer)
Aber einen Programmabsturz sollte man schon vermeiden. Vor allem wenn es so einfach ist.Beim eingeben vom Dateinamen vertippt und das wars dann.