我正在尝试将一个文件“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;
}
答案 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转换所取消,弄乱您的二进制数据。