Vyhľadanie konkrétneho byte v súbore

0

Otázka

Mám súbor, v ktorom sa snažím hľadať táto postupnosť bajtov: 0xFF, 0xD8, 0xFF, a 0xE0. Teraz, povedzme, ja som len hľadáte 0xFF. Urobil som tento program na testovanie:

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

To nefunguje. Keď som hovor analyzeFile s parametrom "test.txt" to vypíše obsah súboru jemné, ale nerozpozná jednu 0xFF byte:

obsah test.txt:

aÿØÿÿà1234

výstup:

aÿØÿÿà1234
0

pre odkaz, 0xFF je ekvivalent y-diaeresis, ÿ podľa ASCII.

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

Najlepšiu odpoveď

0

Tam sú dva problémy, s vaším kódom. Za prvé, pozrite si: Prečo je "while ( !feof (súbor) )" vždy zlé?

Druhý problém je, že getc (alebo fgetc) vráti intnie char. Ako to stojí, vaše char hodnota 0xFF je znamenie-rozšírené (na 0xFFFFFFFF, pravdepodobne), keď je povýšený na int pre if ((bytes == 0xFF)) porovnanie. Áno, pomocou int pre vaše bytes variabilný a zmena slučky na testovanie hodnota, ktorá bola čítanie na EOF signál:

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

Nesúvisia s otázkou, ale nie je cast (char)bytes ako parameter printf k ničomu? Bude si odliatok späť int podľa predvoleného nastavenia propagačné akcie.
Eugene Sh.

Vďaka za pomoc!
human bean

Hodnota (char)bytes je implementácia definovať, ak bytes > CHAR_MAX (čo môže stať iba v prípade, char je podpísaný typ), tak asi lepšie, aby nevznikali to char. Tiež, %X očakáva, že e unsigned int,, takže si urobiť potrebné obsadenie (na unsigned int) v prípade, že jeden.
Ian Abbott

@IanAbbott Reálnej komentár - pozri upraviť.
Adrian Mole

V iných jazykoch

Táto stránka je v iných jazykoch

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