我有一个小挑战(可以在页面底部找到,标题是CSI。https://x.cs50.net/2012/psets/4/pset4.html,我太长了以至于无法粘贴。) (And no, i am not trying to cheat, i already found a full code solution but i want mine to work..)
这项工作几乎是在.raw文件(文件上传)中嗅出JPG文件
我使用下面显示的代码:
#include <stdio.h>
int main(void){
FILE* fp = fopen("card.raw", "r");
if (fp == NULL){
printf("error!");
}
char foo[512];
fread(foo,sizeof(foo),sizeof(foo[0]), fp);
for(int j = 0; j < 20000; j++) {
if (foo[0] == 0xff){
printf("jackpot");
return 0;
}
else {
printf(" %d ", foo[0]);
fread(foo,sizeof(foo),sizeof(foo[0]), fp);
}
}
}
问题是,我不知道我做错了什么。它应该在它碰到0xff时尖叫并退出但是它继续前进和前进...... 文件位于https://mega.co.nz/#!tZcFWYIS!DmPAGT7FHLFgtW0SorWU-SE-gfJfR7MlbxdNucN1Biw 如果需要的话。
更新: 感谢大家的帮助,我终于获得了大奖。这是我最终的最终代码。
#include <stdio.h>
#include <stdint.h>
typedef uint8_t BYTE;
int main(void){
FILE* fp = fopen("card.raw", "rb");
if (fp == NULL){
printf("error!");
}
BYTE foo[512];
for (int j = 0;fread(foo,sizeof(foo),sizeof(foo[0]), fp) > 0; j++){
if (foo[0] == 0xff){
printf("jackpot, %d", j);
return 0;
}
}
}
答案 0 :(得分:3)
我的猜测是你正在以"r"
模式读取文件,这可能会转换换行符并搞乱块同步。
尝试以"rb"
模式(二进制模式)读取文件。
答案 1 :(得分:2)
我看到了两个问题。
一个是你没有真正检查过你读过的块的第一个字节。第二个是你继续阅读而不考虑文件结束或错误。
你应该重新设计读取循环(同时检查错误和文件结束),并在该循环中有另一个循环来查找你正在寻找的字节序列。
这样的事情:
for (;;)
{
size_t nread = fread(...);
if (nread == 0)
{
/* Error or end-of-file */
break;
}
for (int i = 0; i < nread; i++)
{
/* Check for signature in `foo[i]` */
}
}
如果只在每个512字节块的开头找到签名,则不需要第二个内部循环,并且可以大大简化它:
while (fread(...) > 0)
{
/* Check for signature in `foo[0]` */
}