Găsirea unui anumit octet într-un fișier

0

Problema

Am un dosar în care încerc să arăt pentru această secvență de octeți: 0xFF, 0xD8, 0xFF, și 0xE0. Acum, să presupunem că sunt doar în căutarea pentru 0xFF. Am făcut acest program pentru testare:

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

Acest lucru nu este de lucru. Când m-am apel analyzeFile cu parametru "test.txt", se imprimă conținutul fișierului bine, dar nu detecta o singură 0xFF octet:

conținutul de test.txt:

aÿØÿÿà1234

ieșire:

aÿØÿÿà1234
0

pentru referință, 0xFF este echivalent cu y-diaeresis, ÿ, potrivit ASCII.

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

Cel mai bun răspuns

0

Există două probleme cu codul. Pentru prima, a se vedea: de Ce este ", în timp ce ( !feof (file) )" întotdeauna greșit?

A doua problemă este că getc (sau fgetc) returnează un intnu o char. Ca atare, dumneavoastră char valoarea 0xFF este semn-extins (la 0xFFFFFFFFcel mai probabil), atunci când este promovată o int pentru if ((bytes == 0xFF)) comparație. Deci, utilizarea int pentru bytes variabile și de a schimba buclă pentru a testa valoarea care a fost citit pentru EOF semnal:

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

Fără legătură cu întrebarea, dar nu e de aruncat (char)bytes ca un parametru pentru a printf inutil? Acesta va fi turnat înapoi la int implicit promotii.
Eugene Sh.

Multumesc pentru ajutor!
human bean

Valoarea de (char)bytes este punerea în aplicare definit dacă bytes > CHAR_MAX (care se poate întâmpla doar dacă char este un semnat de tip), deci, probabil, mai bine să nu-l arunce la char. De asemenea, %X se așteaptă o unsigned int, așa că nu avea nevoie de o distributie (la unsigned int) pentru asta.
Ian Abbott

@IanAbbott comentariu Corect - vezi edit.
Adrian Mole

În alte limbi

Această pagină este în alte limbi

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