如何修复显示的ecxeeded消息的文件大小限制
我正在尝试恢复存储卡中的jpg文件。50个显示中有49个按预期显示,但最后一个显示无效或不受支持的文件格式,同时显示错误消息“超出文件大小限制”。有人能告诉我这是为什么吗。代码如下如何修复显示的ecxeeded消息的文件大小限制,c,cs50,C,Cs50,我正在尝试恢复存储卡中的jpg文件。50个显示中有49个按预期显示,但最后一个显示无效或不受支持的文件格式,同时显示错误消息“超出文件大小限制”。有人能告诉我这是为什么吗。代码如下 #include <stdio.h> #include <stdlib.h> int main(int argc, char * argv[]) { if (argc != 2) { fprintf(stderr, "Usage: ./recover image\n")
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char * argv[])
{
if (argc != 2)
{
fprintf(stderr, "Usage: ./recover image\n");
return (1);
}
FILE * fileptr = fopen(argv[1], "r");
if (fileptr == NULL) {
fprintf(stderr, "Could not open image file\n");
return (2);
}
unsigned char array[512] = {0};
int value = 0;
char filename[8] = "";
do {
value = fread(array, sizeof(array), 1, fileptr);
} while (!(array[0] == 0xff && array[1] == 0xd8 && array[2] == 0xff &&
(array[3] & 0xf0) == 0xe0));
int count = 0;
sprintf(filename, "%03i.jpg", count);
FILE * img = fopen(filename, "w");
while (value == 1) {
do {
fwrite(array, sizeof(array), 1, img);
value = fread(array, sizeof(array), 1, fileptr);
} while (!(array[0] == 0xff && array[1] == 0xd8 && array[2] ==
0xff && (array[3] & 0xf0) == 0xe0));
count = count + 1;
fclose(img);
sprintf(filename, "%03i.jpg", count);
img = fopen(filename, "w");
}
fclose(img);
fclose(fileptr);
return 0;
}
#包括
#包括
int main(int argc,char*argv[])
{
如果(argc!=2)
{
fprintf(stderr,“用法:./recover image\n”);
申报表(1);
}
FILE*fileptr=fopen(argv[1],“r”);
if(fileptr==NULL){
fprintf(stderr,“无法打开图像文件”\n);
返回(2);
}
无符号字符数组[512]={0};
int值=0;
字符文件名[8]=“”;
做{
value=fread(数组,sizeof(数组),1,fileptr);
}而(!(数组[0]==0xff&&array[1]==0xd8&&array[2]==0xff&&
(数组[3]&0xf0)==0xe0);
整数计数=0;
sprintf(文件名为“%03i.jpg”,计数);
文件*img=fopen(文件名,“w”);
while(值==1){
做{
fwrite(数组,sizeof(数组),1,img);
value=fread(数组,sizeof(数组),1,fileptr);
}而(!(数组[0]==0xff&&array[1]==0xd8&&array[2]==
0xff&(数组[3]&0xf0)==0xe0);
计数=计数+1;
fclose(img);
sprintf(文件名为“%03i.jpg”,计数);
img=fopen(文件名,“w”);
}
fclose(img);
fclose(文件管理器);
返回0;
}
代码是错误的。在找到对齐的标题之前,不会进行复制。您可以复制头上显示的字节数。如果您正在尝试恢复,您应该在每个有效的头上提取,即使它与另一个图像重叠。您认为一个jpg在找到的下一个jpg开始之前结束。如果幸运的话,所有的文件都是连续的,所有的文件都是jpg,这就是除了最后一个文件外所有文件都能工作的原因。最后一个,显然没有下一个jpg文件,因此将失败。请谷歌“超出文件大小限制”。同时告诉我们你的平台是什么。可能是因为您试图读取的jpg文件已损坏。还要使用调试器。为什么标记cs50???因为这是一个来自那里的pset问题,这就解释了为什么您不只是使用photorec。还要注意,您正在以文本模式打开文件:
file*fileptr=fopen(argv[1],“r”)代码>在不翻译文本文件内容的POSIX系统上,您可以避免这种情况,但在翻译文本文件内容的系统上,如Windows,将对二进制文件造成严重破坏。您需要以二进制模式打开它:FILE*fileptr=fopen(argv[1],“rb”)代码>
while( !(array[0] == 0xff && array[1] == 0xd8 && array[2] ==
0xff && (array[3] & 0xf0) == 0xe0));