La ricerca di un determinato byte in un file

0

Domanda

Ho un file in cui sto provando a cercare questa sequenza di byte: 0xFF, 0xD8, 0xFF, e 0xE0. Per ora, supponiamo che io sto solo cercando 0xFF. Ho fatto questo programma per il test:

#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);
}

Questo non funziona. Quando l'ho chiamata analyzeFile con il parametro "test.txt" e stampa il contenuto del file benissimo, ma non consente di individuare un unico 0xFF byte:

contenuto della test.txt:

aÿØÿÿà1234

output:

aÿØÿÿà1234
0

per riferimento, 0xFF è equivalente a y-dieresi, ÿ, secondo ASCII.

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

Migliore risposta

0

Ci sono due problemi con il tuo codice. Per la prima, vedere: Perché “while ( !feof (file) )” sempre sbagliato?

Il secondo problema è che getc (o fgetc) restituisce un intnon un char. Così com'è, il tuo char valore di 0xFF è esteso con segno (a 0xFFFFFFFF, più probabilmente, quando si è promosso un int per il if ((bytes == 0xFF)) confronto. Quindi, utilizzare int per il vostro bytes variabile e modificare il ciclo per verificare il valore di lettura per l' EOF segnale:

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

Estranei alla questione, ma non è il cast (char)bytes come parametro di printf inutile? Sarà colato indietro int per impostazione predefinita promozioni.
Eugene Sh.

Grazie per l'aiuto!
human bean

Il valore di (char)bytes è l'attuazione definito se bytes > CHAR_MAX (il che può accadere solo se char è un tipo signed), quindi probabilmente è meglio non eseguire il cast di char. Inoltre, %X si aspetta un unsigned int, in modo che si non hanno bisogno di un cast (per unsigned int) per quello.
Ian Abbott

@IanAbbott Fiera commento - vedi modifica.
Adrian Mole

In altre lingue

Questa pagina è in altre lingue

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