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

时间:2012-01-04 20:47:23

标签: c fread

我正在尝试将一个文件“file.raw”和4个字节一次读取到一个数组,并检查它是否具有我正在寻找的特定4字节签名。我遇到了麻烦。使用fread时,得到的结果值为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;
}

2 个答案:

答案 0 :(得分:4)

我的猜测是它在while循环的第一次迭代中没有失败,而是继续读取文件,直到你到达文件的末尾,此时fread()返回0并且你的程序退出。

找不到签名的原因是:

memcmp(array,"0xffd8ffe0",4)==0

memcmp()调用几乎肯定不是您想要的(它正在查找ASCII字符序列'0''x''f''f'

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

答案 1 :(得分:0)

尝试以二进制模式("r+b")而不是文本模式("r+")打开文件。您可能会被无意的CRLF转换所取消,弄乱您的二进制数据。