使用fread在C中无法读取文件

4

我正在尝试读取一个名为"file.raw"的文件,每次读取4个字节到一个数组中,并检查它是否包含我要查找的特定的4个字节签名。但是我遇到了麻烦。使用fread时,得到的result值为0,而不是4。

#include<stdint.h> 
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef uint8_t BYTE; 

int main(void)
{
    size_t result;
    FILE *inptr = fopen("file.raw","r+");
    //Check if file can be opened.
    if (inptr == NULL)
    {
        printf("File Open Error\n");
        return -1;
    }
    long int x = 0;

    while(!feof(inptr))
    {
        // Make space for reading in to an array
        BYTE *array = (BYTE *) malloc(10);
        if(array == NULL)
        {
            printf("Array Initialization Error\n");
            return -1;
        }

        result = fread(array,1,4,inptr);
        //Exit if file not read. ** This is where I can't get past.
        if(result != 4)
        {
            printf("File Read Error\n");
            printf("%d\n",result);
            free(array);
            fclose(inptr);
            return -1;
        }

        //Compare strings

        if(memcmp(array,"0xffd8ffe0",4)==0)
        {
            printf("File Start found\n");
            printf("Exiting...\n");
            printf("%p\n",inptr);
            free(array);
            fclose(inptr);
            return 0;
        }
        x++;
        free(array);
    }

    printf("%p\n",inptr);
    printf("%ld\n",x);
    fclose(inptr);
    return 0;
}

ferror(inptr) 会给你什么结果? - M.Babcock
1
检查 feof()ferror() 以确定原因:是 EOF 还是读取失败。如果是读取失败,请检查 errno 获取失败原因。 - hmjd
同时编写 while(!feof(inptr)) 是完全错误的。feof 仅在读取操作完成后才有意义... - Evan Teran
2个回答

4
我的猜测是,在while循环的第一次迭代中它不会失败,而是继续读取文件,直到到达文件末尾,此时fread()返回0,你的程序退出。
找不到签名的原因是这样的:
memcmp(array,"0xffd8ffe0",4)==0

那个memcmp()调用几乎肯定不是你想要的(它正在寻找ASCII字符序列'0''x''f''f')。

PS:如@Mat在评论中指出,为了最大的可移植性,应该以二进制模式打开文件(使用"r+b"而不是"r+")。

非常有可能。在某些平台上,打开模式中缺少 "b" 可能会出现问题。 - Mat
@aix,你说得对。谢谢。在我的文件中,应该使用什么来代替memcmp来查找0xffd8ffe0? - kevin
1
@kevin:memcmp() 本身并不是问题,问题在于您提供的第二个参数字符串。您可能想要创建一个类似于 char header[] = {0xff, 0xd8, 0xff, 0xe0} 的字符数组,并在 memcmp() 调用中使用它。 - NPE

1
尝试以二进制模式("r+b")而不是文本模式("r+")打开文件。您可能会因无意中进行的CRLF转换而导致二进制数据混乱。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接