Поиск определенного байта в файле

0

Вопрос

У меня есть файл, в котором я пытаюсь найти эту последовательность байтов: 0xFF, 0xD8, 0xFF и 0xE0. На данный момент давайте предположим, что я ищу только 0xFF. Я сделал эту программу для тестирования:

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

Это не работает. Когда я вызываю analyzeFile с параметром "test.txt", он отлично выводит содержимое файла, но не обнаруживает ни одного байта 0xFF:

содержание test.txt:

aÿØÿÿà1234

выход:

aÿØÿÿà1234
0

для справки, 0xFF эквивалентно y-диарезе, y, в соответствии с ASCII.

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

Лучший ответ

0

С вашим кодом есть две проблемы. Во-первых, смотрите: Почему “while ( !feof (файл) )” всегда неверно?

Вторая проблема заключается в том, чтоgetc (или fgetc) возвращает int, а не char. В нынешнем виде ваш char значение 0xFF является расширенным знаком (до 0xFFFFFFFF, скорее всего), когда он будет повышен до int для if ((bytes == 0xFF)) сравнение. Итак, используйте int для вашего bytes переменную и измените цикл, чтобы проверить значение, которое было считано для EOF сигнал:

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

Не имеет отношения к вопросу, но разве актерский состав (char)bytes в качестве параметра для printf бесполезно? Он будет отброшен обратно в int по акциям по умолчанию.
Eugene Sh.

Спасибо за помощь!
human bean

Значение (char)bytes определена ли реализация, если bytes > CHAR_MAX (что может произойти только в том случае, если char является подписанным типом), поэтому, вероятно, лучше не приводить его к char. Также, %X ожидает, что unsigned int, так что вам действительно нужен актерский состав (для unsigned int) для этого.
Ian Abbott

@IanAbbott Справедливый комментарий - см. правку.
Adrian Mole

На других языках

Эта страница на других языках

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