Probleme beim Auswerten eines Strings



  • Erster Post, also erst mal Hi all!

    Ich hab folgendes Problem. Ich lese einen String von einer Datei in einem proprietären Format, die Bytefolgen kenne ich genau. Ich möchte den String in ein von mir definiertes struct-array umwandeln. Vorher habe ich den String genommen und per TCP an einen anderen Computer geschickt und dort die Umwandlung vorgenommen. Jetzt da ich die Umwanwandlung auf dem Rechner wo die Datei gelesen wird (dem Server) selbst mache, funktioniert es nicht mehr, dabei hab ich den Code gecopy-pasted! Hier der erste Teil:

    pFile = fopen ( "artists.txt" , "rb" );
    	fseek (pFile , 0 , SEEK_END);
    	lSize = ftell (pFile);
    	rewind (pFile);
    	buffer = (char*) malloc (lSize); 
    	fread (buffer,1,lSize,pFile);
    	fclose (pFile);
    
    	memcpy(num_artists_c, &buffer, 5);
    	num_artists_c[5]='\0';
    	offset = 5;
    	printf("%s\n", num_artists_c);
    	printf("num artists: %d\n", atoi(num_artists_c));
    	num_artists = atoi(num_artists_c);
    	artist_entry * artist_list;
    	artist_list = (artist_entry *)malloc(num_artists*sizeof(artist_entry));
    

    Ausgabe:

    êO1
    num artists: 0

    Auf dem Client hat er mir '517' ausgegeben, was richtig so war... .


  • Administrator

    Also erstens hat es überhaupt rein gar nix mit der MFC zu tun, also völlig das falsche Forum. Das gehört wohl eher ins C Forum.

    Aber dein Problem ist wohl einfach zu lösen. buffer ist schon ein zeiger auf den Speicherbereich. Wenn du vom Zeiger den Zeiger holst, dann kopierst du was falsches. Also beim memcpy musst du das so schreiben:

    memcpy(num_artists_c, buffer, 5);
    

    Ansonsten fällt mir so spontan nichts auf. Aber du bist hier sowieso im falschen Forum ^^

    Grüssli



  • Dieser Thread wurde von Moderator/in estartu aus dem Forum MFC (Visual C++) in das Forum ANSI C verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Gut... danke! Aber warum funktioniert der Rest?

    Beispielcode

    offset=5;
    memcpy(artist_name_lenght_c, &buffer[offset], 3);
    artist_name_lenght_c[3]='\0';
    artist_name_lenght = atoi(artist_name_lenght_c);
    offset += 3;
    

  • Administrator

    buffer[offset] ist wieder das Objekt, dadurch bekommst du mit dem &-Operator den Zeiger auf das Objekt. Grundsätzlich allerdings ist das ein wenig blöd gelöst. Denn folgendes passiert da in etwa:

    &(*(buffer + offset));
    

    Also der Zeiger buffer geht um die Anzahl offset im Speicher weiter, der neue Zeiger wird dereferenziert und dann wird aus dem Objekt wieder der Zeiger geholt. Daher könntest du eigentlich gleich folgendes schreiben:

    memcpy(artist_name_length_c, buffer + offset, 3);
    

    Verstanden? Hat es geholfen? Ansonsten schlage ich vor, dass du dir vielleicht zuerst nochmals nen Tutorial zu Zeiger reinziehst.

    Grüssli



  • Dravere schrieb:

    buffer[offset] [...]
    Daher könntest du eigentlich gleich folgendes schreiben:

    memcpy(artist_name_length_c, buffer + offset, 3);
    

    Verstanden? Hat es geholfen? Ansonsten schlage ich vor, dass du dir vielleicht zuerst nochmals nen Tutorial zu Zeiger reinziehst.

    Grüssli

    Verstanden ja, das Tutorial über Zeiger muss ich mir aber trotzdem sowieso nochmal geben

    Danke!


Anmelden zum Antworten