problem mit fscanf
-
Dann steht noch irgend etwas anderes in der Datei und fscanf gibt auch nicht 6 zurück.
Schau dir die Datei mal mit einem Hexviewer an.Oder probier mal
fscanf(fp, " %lf %lf %lf %d %lf %d", &x, &y, &z, &draper, &mag, &hrn);
-
Dann beschreib mal was dir unter "richtig" vorschwebt.
Warum hast du die Zeilen 7 bis 12 in deinem Quelltext?
-
Also wenn ich %f durch %lf ersetze bekomme ich folgendes raus:
False 0.000000, 0.000000, 0.000000, 6, 0.000000, 5
Und laut Hex-Editor steht auch das richtige in der Datei...
Die Zeilen 7-12 existieren, weil das ganze eig. mit dem struct funktionieren sollte. Aber ich habe es mal auf das einfachste reduziert, damit ich möglichst alle anderen Fehlerquellen ausschließen kann.
Und unter richtig verstehe ich das, was in der txt drinsteht...
-
Hast du auch die richtige "./l.txt"?
Rufst du das Programm von der Konsole oder aus der IDE auf?Du kannst die Zeile auch mit
fgets
einlesen und dann mitsscanf
auswerten.
Dann kannst du sie vorher auch noch ausgeben.Bei
scanf
ist %f für float, %lf für double.
Beiprintf
ist %f für float und double.
-
Die txt ist die richtige Datei, ich habe es auch schon mit der Datei versucht, die später im Programm benutzt werden soll. Mit der funktioniert es auch nicht.
Ich schreibe mit Code::Blocks und rufe auch daraus auf.
Mit %lf in fscanf und %f in printf bekomme ich immerhin wieder die initialisierten Zahlen... =), aber...
-
Auf die Punkte hinter dem aber kommt es an.
Wie soll das Ergebnis bei dir aussehen?
So wie du schreibst nicht so:
True -0.994772, 0.023164, -0.099456, 28, 4.610000, 3
oder?
Was soll da anders aussehen?Nur geraten, bist du unter Linux oder Mac unterwegs?
-
Ich habe das gerade mal bei mir mit Code::Blocks probiert.
Mit den richtigen Formatspecifiern funktioniert das tadellos.Wo steht denn die Datei? Bei der .exe oder bei der .c?
-
Also ich hätte gerne die Zahlen aus der txt mit "," getrennt ausgegeben.
Ich arbeite normalerweise unter Windows, ich habe aber auch ein Ubuntu auf dem Laptop und noch eine LXDE-Virtual-Machine, aber ich bin doch eher Windows-affin...
Die 1.txt befindet sich in dem gleichen Ordner wie die main.c und die main.exe
Ich hatte auch mal einen Code, der über getchar Zeichen für Zeichen ausgelesen und wieder ausgegeben hat, der mir das Richtige ausgespuckt hat...mfg
-
Bei mir steht die .exe in Projektverzeichnis/bin/debug.
Die .c steht im Projektverzeichnis, genau wie die 1.txt.
-
Also das hier wäre mein BuildLog:
Compiling: C:\Users\Valentin\Desktop\Uni\Prog 2\Übungsblätter\stars_progs\main4.c
Linking console executable: C:\Users\Valentin\Desktop\Uni\Prog 2\Übungsblätter\stars_progs\main4.exe
Process terminated with status 0 (0 minutes, 0 seconds)
0 errors, 0 warnings
-
Hat keiner mehr Ideen?
-
Ich hatte doch oben ein Ergebnis hin kopiert. Ist das wie du es dir wünscht?
Das solltest du erhalten, wenn du das was wir hier geschrieben haben umsetzt.Wenn du dir das anders vorstellst, zeige uns dein Wunschergebnis.
-
Naja, also das, was du geschrieben hattest hätte ich gerne, aber ich bekomme es einfach nicht. Ich habe ja alles versucht, was ihr mir geraten hattet, aber ich habe nie das richtige rausbekommen.
Ich habe es jetzt mal noch mit lcc versucht, aber das gibt mir gar nichts aus, außer, dass der return -1 war...Wenn ich noch was übersehen habe, korrigiert mich, aber ich wüsste es nicht...
-
meischda schrieb:
Ich habe es jetzt mal noch mit lcc versucht, aber das gibt mir gar nichts aus, außer, dass der return -1 war...
Dann wurde das
exit(-1)
ausgeführt. Dein Programm konnte die Datei nicht öffnen.
Dann musst du zusehen, das deine 1.txt im aktuellen Verzeichnis ist. Was immer das auch bei deiner Konstelation heißt.
-
Stimmt. LCC speichert woanders. Aber auch mit der txt im richtigen Ordner bekomme ich nur die initialisierten Zahlen raus...
-
Dann schreib die 1.txt nochmal neu. Ohne Copy&Paste.
-
Zeige mal deinen aktuellen Quelltext mit den entsprechenden Fehlerabfragen im Quelltext.
Eigentlich hätte die erste Antwort, wenn du die richtig umgesetzt hättest zur Lösung geführt. Aber ich habe den Verdacht du hast nur immer Teile der Antworten umgesetzt.Da du ja siehst, wie wir hier ohne Fehlerkontrolle in deinem Quelltext hier herum raten, sollte dein Quelltext im Fehlerfall einige Meldungen heraus geben, damit diese leichter gefunden werden können. Denn deine Aussagen was der Quelltext macht oder machen soll, waren nicht sehr genau
-
Also mein Code wäre momentan folgender:
#include <stdio.h> #include <stdlib.h> int main (void) { FILE *fp; struct star { int x,y,z,mag; int draper,hrn; }; struct star a; float x = 1.0; float y = 2.0; float z = 3.0; float mag = 4.0; int draper = 5; int hrn = 6; fp = fopen("../stars/data/stars.txt", "r"); if( fp == NULL ) exit(-1); fseek(fp, 0, SEEK_END); int end = ftell(fp); int ende = end/20; printf("%d, %d\n", end, ende); fscanf(fp, " %lf %lf %lf %d %lf %d", &x, &y, &z, &draper, &mag, &hrn); if (draper==28) { printf("True"); } else {printf("False\n");}; printf("%f, %f, %f, %d, %f, %d\n", x, y, z, draper, mag, hrn); fclose(fp); return 0; }
Ich habe noch einen kleinen Extra-Teil drin, der mir die Anzahl der Zeichen und ein zwanzigstel selbiger ausgibt. Das war mal am Anfang Teil eines Ansatzes gewesen. Aber ich bekomme immer die richtige Zeichenzahl ausgegeben, d.h. der Pfad zur Datei stimmt. Ich habe es gerade auch mal wieder mit der Datei, die später rein soll probiert, das funktioniert aber auch nicht...
Und wie gesagt, im Moment will ich einfach nur den Inhalt der Datei zeilenweise , bzw. ohne Schleife ja nur die erste Zeile, einlesen und mir wieder ausgeben.
-
DirkB schrieb:
Bei
scanf
ist %f für float, %lf für double.
Beiprintf
ist %f für float und double.Was meinst du passiert in Ziele 26:
fseek(fp, 0, SEEK_END);
Richtig, du springst ans Dateiende.
Und von dort willst du munter Zeichen lesen. Von da, wo nichts mehr ist, da du bereits am Ende bist.Mach mal in Zeile 31 ein
rewind(fp);
.Hattest du das fseek von Anfang an drin?
-
jaa..... :p
Jetzt gehts.....
Und wegen so ner kleinen Sache dafür häng ich dann 3 Tage lang am PC..Dankeschön. Du bist mein Held!
Ich hatte den Teil mit der Zeichenzahl auch schon ein paar mal rausgeschnitten und dann hatte es auch nie funktioniert. Aber da waren dann wohl auch immer noch ein paar Type-clash's drin...