komisches Verhalten *ratlos*
-
Hallo Ihr,
ich wollte mit scanf ein file einlesen.
Bsp.file1 0.38234 09:00 243
2 0.38235 09:00 243
3 0.38235 09:00 234Mit dem nachfolgenden Code unter linux mit gcc ging das auch - alles korrekt wiedergegeben, bis auf die erste Spalte (linenumber). Da kamen nicht nachvollziehbare Werte raus. ala
48
48
48
50
50
..gcc hat auch keine Warnungen oder Errors ausgegeben.
#include <stdio.h> int main() { FILE *fout; fout = NULL; fout = fopen("/home/sample.txt","w"); if(fout == NULL) { printf("Konnte sample nicht oeffnen oder erstellen\n"); return 0; } else{ printf("sample geoeffnet oder erstellt\n"); } long ln = 0; //$1 line float time = 0; //$2 xtime (%.9f) char time1[5]; //$3 trashbuf long vol = 0; //$4 vol long counter = 0; while(EOF != scanf("%ld %f %s %ld",&ln, &time, time1, &vol)){ counter++; printf("%ld %.9f %s %ld\n",ln, time, time1, vol); } fclose(fout); return 0; }
Unter Win mit VC++ kompiliert er den Code gar nicht erst.
Es sei denn man lässt den Teil mit dem FILE-zeiger weg!??
Dann läuft auch der unter linux compilierte code einwandfrei.Mit dem FILE zeiger meckert VC++ bei der ersten variablen-deklaration (ln)
(und bei allen folgenden)
Error 2 error C2143: syntax error : missing ';' before 'type'
..hat wer eine idee wie das kommt?
hier nochmal der gleiche code etwas schlanker. Das Verhalten tritt auf sobald die Zeile mit dem FILE *fout; fout = NULL; auskommentiert wird#include <stdio.h> int main() { //FILE *fout; fout = NULL; long ln = 0; //$1 line float time = 0; //$2 xtime (%.9f) char time1[40]; //$3 trashbuf long vol = 0; //$4 vol long counter = 0; while(EOF != scanf("%ld %f %s %ld",&ln, &time, time1, &vol)) { counter++; printf("%ld %.9f %s %ld\n",ln, time, time1, vol); } //fclose(fout); return 0; }
Grüße Plotty
-
Das liegt wohl nur an deiner Interpretation der Werte. ASCII 48 entspricht dem char '0', 49 entspricht '1' usw.
-
Hi _matze!
versteh nicht ganz, was meinst du genau?
Grüße Spaceplotty
-
Ich bezog mich auf deine nicht nachvollziehbaren Werte und dachte, dass du die eingelesenen Werte falsch interpretierst (also einen char '0' einliest, der ja den Wert 48 hat). Da du scanf mit %ld verwendest, sollte das doch aber eigentlich passen. Sorry, da hab ich nur die Hälfte gelesen...
-
Trotzdem THX!
-
Visual Studio 8 hat deinen Code problemlos kompiliert.
Zu den logischen Fehlern:
1. Du öffnest eine Datei zum schreiben, willst aber daraus lesen?
2. Wenn du aus einer Datei lesen willst, mußt du fscanf statt scanf verwenden.
3. time1 muß 1 Byte größer gemacht werden, weil du \0 auch noch berücksichtigen mußt#include <stdio.h> int main() { FILE *fout; fout = NULL; fout = fopen("c:\\sample.txt","r"); // r wie read if(fout == NULL) { printf("Konnte sample nicht oeffnen oder erstellen\n"); return 0; } else { printf("sample geoeffnet oder erstellt\n"); } long ln = 0; //$1 line float time = 0; //$2 xtime (%.9f) char time1[5 + 1]; //$3 trashbuf (5 + 1 wegen der 0) long vol = 0; //$4 vol long counter = 0; while(EOF != fscanf(fout, "%ld %f %s %ld",&ln, &time, time1, &vol)) { //fscanf, da aus dateien gelesen wird counter++; printf("%ld %.9f %s %ld\n",ln, time, time1, vol); } fclose(fout); return 0; }
-
Unter Windows muss diese Zeile so aussehen:
fopen("\\home\\sample.txt","r");
Anstelle von '/' akzeptiert Windows nur '\'.
Alles andere wurde bereits gesagt.
-
Ach ja:
Es war früher der Standard, dass Variablen immer am Anfang eines Anweisungsblockes deklariert werden _mussten_. Je nachdem, welchen Compiler du benutzt, könnte es passieren, dass "Error 2 error C2143: syntax error : missing ';' before 'type' " genau deswegen kommt, weil deine Variablen "irgendwo im Raum" definiert worden sind. Versuch einfach mal diese gleich an den Anfang von main() zu stellen.
-
HEDA!
3. time1 muß 1 Byte größer gemacht werden, weil du \0 auch noch berücksichtigen mußt
Das war der Fehler! So läuft es einwandfrei.
Es war früher der Standard, dass Variablen immer am Anfang eines Anweisungsblockes deklariert werden _mussten_. Je nachdem, welchen Compiler du benutzt, könnte es passieren, dass "Error 2 error C2143: syntax error : missing ';' before 'type' " genau deswegen kommt, weil deine Variablen "irgendwo im Raum" definiert worden sind. Versuch einfach mal diese gleich an den Anfang von main() zu stellen.
Da muss man erstmal draufkommen - genau so ist es, Visualexpress 2008 legt offenbar wert darauf.
gcc macht es nix.SUPER
MANY THANKS!
-
johny_legend schrieb:
Anstelle von '/' akzeptiert Windows nur '\'.
Das ist falsch. Siehe z.B. http://bytes.com/forum/thread23123.html