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 einen char (bzw ein int). Du übergibst aber ein unsigned long long . Da kommt printf beim Zugriff durcheinander.

    Übergib als ersten Parameter ein char und gut is.

    printf("%c %llu ", (char)c, c);
    


  • DirkB schrieb:

    printf erwartet bei %c einen char (bzw ein int). Du übergibst aber ein unsigned long long . Da kommt printf 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 00000000

    printf holt sich ein int für das %c. 74000000
    Das ist 0x74 und wird als 't' ausgegeben

    Bleibt 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 00000000

    printf holt sich ein int 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
    9

    Nun 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
    71

    nun 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:
    11536662113036640

    Wie 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 zu fscanf() 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


Anmelden zum Antworten