Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何修复显示的ecxeeded消息的文件大小限制_C_Cs50 - Fatal编程技术网

如何修复显示的ecxeeded消息的文件大小限制

如何修复显示的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")

我正在尝试恢复存储卡中的jpg文件。50个显示中有49个按预期显示,但最后一个显示无效或不受支持的文件格式,同时显示错误消息“超出文件大小限制”。有人能告诉我这是为什么吗。代码如下

#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));