problem mit printf geschlossen 

Status
Für weitere Antworten geschlossen.

the_Bug

Registered +
Registriert
Nov. 2007
Beiträge
44
Moin!
Ich bin dabei just for fun ein Programm zum analysieren von Trackmania GBX Files zu schreiben.

Der Code:
Code:
#include 
#include 
#define _gbx_header "GBX"
#define _gbx_header_2 6
#define _gbx_header_3 "BUCR"

using namespace std;

int main(int argc, char *argv[])
{
char *fpath, gbx_header[sizeof('GBX')],gbx_header_3[sizeof('BUCR')]; //read values
short gbx_header_2;
FILE *filep;
int it;

printf("GBXInfo by the_Bug:\nprints gbx file info\n\n");
if(argc!=2)
{
printf(" wrong argument count...%d\n usage: GBXInfo ",argc);
getchar();
return 1;
}
fpath=argv[1];
filep=fopen(fpath,"r+");
if(filep==NULL)
{
printf(" unable to open file %s",fpath);
getchar();
return 2;
}
fread(&gbx_header,1,3,filep);
switch(strcmp(gbx_header,_gbx_header))
{
case 0 : printf(" HEADER 1: OK (\"GBX\")\n");
break;

default : printf(" HEADER 1: UNKNOWN (\"%s\"), should be \"GBX\"\n",gbx_header);
}

fread(&gbx_header_2,2,1,filep);
switch(gbx_header_2==_gbx_header_2)
{
case 1 : printf(" HEADER 2: OK (6)\n");
break;
default : printf(" HEADER 2: UNKNOWN (%d), should be \"6\"\n",gbx_header_2);
}

fread(&gbx_header_3,1,4,filep);
switch(gbx_header_2==_gbx_header_2)
{
case 1 : printf(" HEADER 3: OK (\"BUCR\")\n");
break;
default : printf(" HEADER 3: UNKNOWN (%s), should be \"BUCR\"\n",gbx_header_3);
}

getchar();
}

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.
 
Zuletzt bearbeitet von einem Moderator:
danke!
ich dachte fread schmeißt automatisch ne null am ende ran und wegen der nachfolgenden variable im speicher kam sowas raus...
der anfang alleine(gbx_header) hat funktioniert, weil nix im speicher folgte...

danke nochmal
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben Unten