Warum nicht der ASCII Wert?
-
Hi,
ich versuche eine Datei zeichenweise auszulesen und verstehe nicht ganz warum in c dabei nicht der ASCII Wert gespeichert wird.
(c ist ein long long unsigned - ja ich brauche so große integertypen)
c = fgetc(source)) printf("%c %llu ", c, c);
Ausgabe: t 498216206336
Eigentlich hätte ich als Ausgabe: t 116 erwartet.
Wie bekomme ich den gewünschten Wert in c, was mache ich falsch?
MfG
Komisch
-
printf
erwartet bei %c einenchar
(bzw ein int). Du übergibst aber einunsigned long long
. Da kommtprintf
beim Zugriff durcheinander.Übergib als ersten Parameter ein
char
und gut is.printf("%c %llu ", (char)c, c);
-
DirkB schrieb:
printf
erwartet bei %c einenchar
(bzw ein int). Du übergibst aber einunsigned long long
. Da kommtprintf
beim Zugriff durcheinander.Übergib als ersten Parameter ein
char
und gut is.printf("%c %llu ", (char)c, c);
? Die Ausgabe lautet wie bereits geschrieben:
Ausgabe: t 498216206336
der Cast auf Char findet also implizit statt. Mein Problem ist, dass er mir irgendeinen Zahlwert ausgibt allerdings nicht den ASCII-Wert von t, welcher 116 wäre.
-
116 ist 0x74
498216206336 ist 0x7400000000
Bsp: int ist 32-Bit Little-Endian. Übergeben wird zweimal c (in Hex)
74000000 00000000 74000000 00000000printf
holt sich einint
für das %c. 74000000
Das ist 0x74 und wird als 't' ausgegebenBleibt noch 00000000 74000000 00000000
%llu holt sich 00000000 74000000 und das sind die 0x7400000000 bzw 498216206336 die du siehst.Komisch schrieb:
der Cast auf Char findet also implizit statt.
Tut er nicht. Der Compiler wertet den Formatstring nur für die Warnungen aus, nicht für die Anpassung der Parameter.
Auf welchem System mit welchem Compiler arbeitest du?
-
Ah ok danke,
ich arbeite auf Win7 mit gcc (default standard vermutlich c 98 oder 99 standard)
Wie komme ich dann an die 116? Gibt es da einen einfachen Trick?
-
Komisch schrieb:
Wie komme ich dann an die 116? Gibt es da einen einfachen Trick?
Der cast ist das einfachste: http://ideone.com/gDFwFG
-
DirkB schrieb:
116 ist 0x74
498216206336 ist 0x7400000000
Bsp: int ist 32-Bit Little-Endian. Übergeben wird zweimal c (in Hex)
74000000 00000000 74000000 00000000printf
holt sich einint
für das %c.Aber ob ich ihm einen int oder einen char gebe, dass erkennt printf doch ohne Probleme?
-
Achso ok vielen Dank.
Eine Sache hätte ich allerdings noch:
Ich schreibe in eine Datei folgendes:
fprintf(encfile, "%llu\n", c_new);
Dann steht dort im Anschluss z.B. (der Teil funktioniert):
58
67
36
9Nun möchte ich den Inhalt lesen und weiterverwenden:
fscanf(decfile, "%llu\n", c); printf("%llu", c);
Als Ausgabe bekomme ich wieder riesige Zahlen - möchte aber eigentlich genau die Werte aus der Datei. Wie mache ich dies richtig?
-
fscanf
erwartet Adressen auf die Variablen (und nicht deren Inhalt)fscanf(decfile, "%llu", &c); // Das \n ist nicht nötig, da bei %u die Whitespace überlesen werden
-
die scan-Fuktionen verändern den übergebenen Parameter, d.h. du mußt dort einen Zeiger (Adresse der Variablen) übergeben:
fscanf(decfile, "%llu\n", &c); printf("%llu", c);
-
Schalte doch mal die Warnungen vom Compiler an bzw. beachte sie.
Beim gcc wäre das -Wall oder zumindest -Wformat
-
logisch - autsch - ähm alles klar danke - hab ich einfach übersehen
allerdings besteht das Problem weiterhin also er gibt weiterhin riesige Zahlenwerte die den gesamten 64Bit Bereich füllen aus. z.B.: 11536662113036736
-
Nochmal zusammenfassend wo ich gerade hänge:
Die Datei sieht wie folgt aus:
15
1
15
71nun möchte ich aus dieser Datei die Zahl von jeder Zeile lesen:
(gekürzt zusammengeschrieben für das Lesen der Zahl aus der ersten Zeile)
File *decfile = fopen(path, "w+"); long long unsigned c; fscanf(decfile, "%llu\n", &c);//fscanf(decfile, "%llu", &c); <-- geht auch nicht
anschließend steht in c der Wert:
11536662113036640Wie bekomme ich den Wert 15 in c? (Das Problem sieht für die anderen gelesenen Zeilen genauso aus)
-
Mit gekürztem Code kann hier niemand was anfangen.
So wie es jetzt da steht ist die Datei leer, wenn Du zufscanf()
kommst. ("w+").Wertest Du den Rückgabewert von
fsanf()
aus?
-
... k danke, das wars ich überschreibe die Datei... traurig trotzdem danke - ich glaub ich geh schlafen