找到一个具体的字节的文件

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-diaeresis,ÿ,根据ASCII。

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

最好的答案

0

有两个问题与你的代码。 第一,参见: 什么是"while(!feof(文件))"总是错误的吗?

第二个问题是, getc (或 fgetc)返回一个 int不一 char. 因为它的立场,您 char0xFF 是符号扩展(来 0xFFFFFFFF最有可能的)时被提升到一个 intif ((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ý
..................................................................................................................