Trouver un spécifique octet dans un fichier

0

La question

J'ai un fichier dans lequel je suis en train de regarder cette séquence d'octets: 0xFF, 0xD8, 0xFF, et 0xE0. Pour l'instant, supposons que je suis seulement à la recherche de 0xFF. J'ai fait ce programme pour les tests:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void analyzeFile(char* filename)
{
    FILE* filePtr = fopen(filename, "rb");

    int numImages = 0;

    while (!feof(filePtr))
    {
        char bytes;

        bytes = getc(filePtr);

        printf("%c", bytes);

        if ((bytes == 0xFF))
        {
            numImages++;
            printf("image found!\n");
        }
    }

    printf("%d\n", numImages);
}

Ce n'est pas de travail. Quand je l'appelle analyzeFile avec le paramètre "test.txt", il imprime le contenu du fichier fines, mais ne détecte pas un seul octet 0xFF:

contenu de test.txt:

aÿØÿÿà1234

sortie:

aÿØÿÿà1234
0

pour référence, 0xFF est équivalent à y tréma, ÿ, selon ASCII.

c char file
2021-11-23 15:01:14
1

La meilleure réponse

0

Il y a deux problèmes avec votre code. Pour la première, voir: Pourquoi le “while ( !feof (fichier) )” toujours tort?

Le deuxième problème est que getc (ou fgetc) renvoie un int, pas un char. Comme il est, votre char la valeur de 0xFF est signe étendu (à 0xFFFFFFFF, le plus probable) lorsqu'il est promu à un int pour l' if ((bytes == 0xFF)) la comparaison. Ainsi, l'utilisation de int pour votre bytes variable et de modifier la boucle pour tester la valeur qui a été lu pour la EOF signal:

void analyzeFile(char* filename)
{
    FILE* filePtr = fopen(filename, "rb");
    if (!filePtr) { // Add some error handling...
        printf("Could not open file!");
        return;
    }
    int numImages = 0;
    int bytes;
    while ( ( bytes = getc(filePtr) ) != EOF) {
        printf("%02X %c\n", (unsigned)bytes, bytes);

        if (bytes == 0xFF) { // Removed redundant extra parentheses
            numImages++;
            printf("image found!\n");
        }
    }
    fclose(filePtr); // Don't forget to close the file!
    printf("%d\n", numImages);
}
2021-11-23 17:14:53

Aucun rapport avec la question, mais ce n'est pas le casting (char)bytes en tant que paramètre à printf inutile? Il obtiendra coulé retour à int par le défaut des promotions.
Eugene Sh.

Merci pour l'aide!
human bean

La valeur de (char)bytes la mise en œuvre est définie si bytes > CHAR_MAX (ce qui ne peut se faire que si char est un type signé), et c'est probablement mieux de ne pas la lancer à char. Aussi, %X s'attend à une unsigned int, de sorte que vous ne besoin d'un cast (à unsigned int) pour que l'on.
Ian Abbott

@IanAbbott Juste le commentaire - voir modifier.
Adrian Mole

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................