problem mit printf

  • geschlossen
  • C

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • problem mit printf

    Moin!
    Ich bin dabei just for fun ein Programm zum analysieren von Trackmania GBX Files zu schreiben.

    Der Code:

    C-Quellcode

    1. #include <cstdlib>
    2. #include <iostream>
    3. #define _gbx_header "GBX"
    4. #define _gbx_header_2 6
    5. #define _gbx_header_3 "BUCR"
    6. using namespace std;
    7. int main(int argc, char *argv[])
    8. {
    9. char *fpath, gbx_header[sizeof('GBX')],gbx_header_3[sizeof('BUCR')]; //read values
    10. short gbx_header_2;
    11. FILE *filep;
    12. int it;
    13. printf("GBXInfo by the_Bug:\nprints gbx file info\n\n");
    14. if(argc!=2)
    15. {
    16. printf(" wrong argument count...%d\n usage: GBXInfo <gbxpath>",argc);
    17. getchar();
    18. return 1;
    19. }
    20. fpath=argv[1];
    21. filep=fopen(fpath,"r+");
    22. if(filep==NULL)
    23. {
    24. printf(" unable to open file %s",fpath);
    25. getchar();
    26. return 2;
    27. }
    28. fread(&gbx_header,1,3,filep);
    29. switch(strcmp(gbx_header,_gbx_header))
    30. {
    31. case 0 : printf(" HEADER 1: OK (\"GBX\")\n");
    32. break;
    33. default : printf(" HEADER 1: UNKNOWN (\"%s\"), should be \"GBX\"\n",gbx_header);
    34. }
    35. fread(&gbx_header_2,2,1,filep);
    36. switch(gbx_header_2==_gbx_header_2)
    37. {
    38. case 1 : printf(" HEADER 2: OK (6)\n");
    39. break;
    40. default : printf(" HEADER 2: UNKNOWN (%d), should be \"6\"\n",gbx_header_2);
    41. }
    42. fread(&gbx_header_3,1,4,filep);
    43. switch(gbx_header_2==_gbx_header_2)
    44. {
    45. case 1 : printf(" HEADER 3: OK (\"BUCR\")\n");
    46. break;
    47. default : printf(" HEADER 3: UNKNOWN (%s), should be \"BUCR\"\n",gbx_header_3);
    48. }
    49. getchar();
    50. }
    Alles anzeigen


    ich hab das ganze mit DevCpp compiled...
    An dem Archiv kanns nicht liegen, da es völlig der definition entspricht (http://en.tm-wiki.org/wiki/GBX).

    Die Ausgabe:

    GBXInfo by the_Bug:
    prints gbx file info

    HEADER 1: UNKNOWN ("GBX☺f$="), should be "GBX"
    HEADER 2: OK (6)
    HEADER 3: OK ("BUCR")

    ...

    Warum kommt bei HEADER1 son Müll raus?

    Hope for Answer
  • Ist lang her mit c++.
    Aber ich würde sagen der String ist nicht (null) terminiert ...

    Um konkreter zu werden, hier sehe ich das Problem:

    gbx_header[sizeof('GBX')] : sizeof ("GBX") ist 4 (wegen null-terminiert)
    fread(&gbx_header,1,3,filep) : da werden genau drei Zeichen gelesen -> "GBX"

    Jetzt müsste an der 4. Stelle \0 kommen. Hat aber niemand gesetzt. Darum liest Dein printf später munter weiter.

    Bau einfach mal vor der Schleife so was wie: gbx_header[sizeof('GBX')-1] = 0; ein.
    Dann sollte der Fehler weg sein. Ich gebe zu das ist ein Hack, bitte nicht schlagen.

    Ach ja,noch ein Update:
    Wenn Du dich fragst warum es bei Header 3 (scheinbar) funktioniert, dann schau Dir folgende Zeilen aus dem Code an:

    fread(&gbx_header_3,1,4,filep);
    switch(gbx_header_2==_gbx_header_2)


    So denke ich mir das wenigstens.
    Aber inzwischen programmiere ich halt auch nur noch für Mädchen (C#) und nicht mehr für Männer (c++).
    Aua. Das war mal wieder was fürs AGG.
    Es ist besser zu schweigen und für einen Narren gehalten zu werden, als zu reden und damit alle Zweifel zu beseitigen ...

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von wasawasa ()