Bir dosyada belirli bir bayt bulma

0

Soru

Bu bayt dizisini aramaya çalıştığım bir dosyam var: 0xFF, 0xD8, 0xFF ve 0xE0. Şimdilik, sadece 0xff'yi aradığımı varsayalım. Bu programı test için yaptım:

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

Bu işe yaramıyor. Analyzefile'ı "test" parametresiyle çağırdığımda.txt", dosyanın içeriğini iyi yazdırır, ancak tek bir 0xFF baytı algılamaz:

testin içeriği.txt:

aÿØÿÿà1234

çıktı:

aÿØÿÿà1234
0

başvuru için 0xFF, ASCII'YE göre y-diaeresis'e eşdeğerdir.

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

En iyi cevabı

0

Kodunuzla ilgili iki sorun var. Birincisi için bakınız: Neden " while ( !feof (dosya)) " her zaman yanlış mı?

İkinci sorun şu kigetc (veya fgetc) döndürür int değil char. Haliyle, senin char değeri 0xFF işaret uzatıldı mı (için 0xFFFFFFFF, büyük olasılıkla) terfi ettirildiğinde int için if ((bytes == 0xFF)) karşılaştırma. Yani, kullan int senin için bytes değişken ve okunan değeri sınamak için döngüyü değiştirme EOF sinyal:

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

Soruyla ilgisi yok, ama oyuncu kadrosu değil mi (char)bytes bir parametre olarak printf işe yaramaz? Geri atılacak int varsayılan olarak promosyonlar.
Eugene Sh.

Yardımın için teşekkürler!
human bean

Değeri (char)bytes uygulama şu durumlarda tanımlanır mı bytes > CHAR_MAX (bu sadece şu durumlarda olabilir char imzalı bir türdür), bu yüzden muhtemelen onu atmamak daha iyidir char. Ayrıca, %X bir bekliyor unsigned int, bu yüzden bir oyuncu kadrosuna ihtiyacınız var unsigned int) bunun için.
Ian Abbott

@IanAbbott Fuarı yorumu-düzenlemeye bakın.
Adrian Mole

Diğer dillerde

Bu sayfa diğer dillerde

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