2017-10-02 3 views
2

Je travaille sur mon premier projet dans mon premier cours de programmation C et je me perds avec des pointeurs. Nous devons modifier les bitmaps de diverses manières et j'ai du mal à comprendre comment je peux utiliser les pointeurs de fichiers pour saisir les données d'octets que je veux utiliser et manipuler. Je connais l'en-tête du fichier bitmap et la structure d'en-tête DIB ainsi que le décalage d'octets pour les valeurs qui les composent. Cependant, j'ai de la difficulté à comprendre comment sauvegarder chacune de ces valeurs pour les utiliser plus tard avec des pointeurs de fichiers. Puisque c'est pour un projet, je ne veux pas demander trop d'aide. Voici mon code à ce jour et divers moyens que j'ai tenté de capturer des parties de l'en-tête:Analyse des octets d'un en-tête de bitmap et enregistrement avec des pointeurs de fichier

int main(int argc, const char * argv[]){ 
    FILE *fp; 
    char buff[2]; //only trying '2' to try and capture 'BM' at start of file. 
    fp = fopen(argv[1], "r+b"); 
    fseek(fp, 0, SEEK_END); 
    long fsize = ftell(fp); 
    rewind(fp); 

    // this is where I test what to do but can't get it correct 
    unsigned short filetype = fgetc(fp); 
    printf("First letter of filetype %c\n", filetype); //prints 'B' which is awesome 

    //Now I do not understand how to capture both the 'BM'. 
    //I've changed to use the fread as follows: 
    fread(buff, sizeof(char), 2, fp); 
    printf("Captured bytes with fread %s\n", buff) //this prints 4 char's and not 2? 

    fclose(fp); 
    return 0; 
} 

J'ai aussi testé simple while pour parcourir le fichier entier et imprimer chaque caractère jusqu'à EOF est rencontrée à l'aide fgetc qui travaillé. Donc, je suppose qu'à chaque appel de fgetc il change l'emplacement de la position actuelle des octets en position actuelle + 1.

Je suppose que je ne comprends pas complètement comment le pointeur de fichier peut être utilisé pour enregistrer de nombreux octets en une seule variable stockée. J'ai également essayé fseek et fgets en vain.

J'apprécierais n'importe quelle aide et contribution que je peux obtenir de la communauté ici.

+0

Pour évaluer votre compréhension actuelle: Qu'est-ce qu'une chaîne de caractères en C? – immibis

+0

Tableau de caractères @immibis – Pwrcdr87

+0

Comment des fonctions comme 'printf' savent-elles où se trouve la fin? – immibis

Répondre

1

printf("%s", buff) imprime le caractère pointé par buff et les caractères suivants jusqu'à ce qu'il atteigne un caractère NUL. Malheureusement, buff contenait seulement B et M, donc printf continuait à lire au-delà de la fin du tableau jusqu'à ce qu'il trouve un NUL. C'est mauvais!

Remplacer

char buff[2]; 
fread(buff, sizeof(char), 2, fp); 

avec

char buff[3]; 
size_t num_read = fread(buff, sizeof(char), 3, fp); 
buff[num_read] = 0; 

Notez que sizeof(char) est garanti d'être 1.

Notez que fgetc avancé le pointeur de fichier au-delà du B, vous aurez donc besoin de revenir en arrière une fois de plus si vous voulez que le fread lire le B.

+0

Cela a du sens. J'apprécie vraiment ton exemple. Cela aide à éclaircir cela. – Pwrcdr87

+0

Commentant votre montage: Je sais que je devrai continuellement avancer et ramener le pointeur de fichier pendant que je traverse les données de pixel quand je veux changer leurs valeurs. J'ai juste eu du mal à essayer de comprendre comment je pourrais enregistrer les paramètres d'en-tête aux variables pour les utiliser plus tard. Vous et immibis avez vraiment aidé. – Pwrcdr87

+0

J'étais assez sûr que vous comprendrez ce bit dehors, mais juste s'assurant :) – ikegami