【发布时间】:2018-06-08 07:26:30
【问题描述】:
我是编写读取或写入文件的程序的新手,我完全不知道我不断收到分段错误的原因。我觉得这可能与我的文件指针或新创建的文件之一有关,但如果有经验的眼睛提供任何帮助,我们将不胜感激!
另一条信息 - 当我试图调试程序时,它似乎卡在检查第 35 行周围的 if 语句的时间比我预期的要长,然后最终 - 分段错误。
下面是我的完整代码:
// program to recover deleted JPEGs from memory card
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
// ensure proper usage
if (argc != 2)
{
fprintf(stderr, "Usage: recover inputFile\n");
return 1;
}
// remember filename
char *infile = argv[1];
// open input file
FILE *inptr = fopen(infile, "r");
if (inptr == NULL)
{
fprintf(stderr, "Could not open %s.\n", infile);
return 2;
}
// read raw input file
int buffer[512];
int counter = 0;
char filename[8];
FILE* img;
// repeat until EOF
while (fread (&buffer, 1, 512, inptr) == 512)
{
//fread (&buffer, 1, 512, inptr); // this might be redundant (while statement)
// check for start of JPEG
if (buffer[0] == 0xff &&
buffer[1] == 0xd8 &&
buffer[2] == 0xff &&
(buffer[3] & 0xf0) == 0xe0)
{
if (counter > 0) // if this is not the first jpeg found, we need to close previous jpeg
{
fclose(img);
}
// create and open file
sprintf(filename, "%03i.jpg", counter);
counter ++; //keep track of current jpeg count
img = fopen(filename, "w");
// make sure our pointer wasn't NULL
if (img == NULL)
{
fprintf(stderr, "Could not open %s.\n", filename);
return 2;
}
do
{
// Write current buffer to JPEG
fwrite (&buffer, 512, 1, img);
fread (&buffer, 1, 512, inptr);
}
// making sure to stop at start of new JPEG
while ((buffer[0] == 0xff &&
buffer[1] == 0xd8 &&
buffer[2] == 0xff &&
(buffer[3] & 0xf0) == 0xe0) == 0);
// move cursor back one 512 byte block so it can be re-read for if-statement
fseek (inptr, -512, SEEK_CUR);
}
}
// close remaining open files
fclose(img);
fclose(inptr);
}
【问题讨论】:
-
fread (&buffer,->fread (buffer, -
另外你不会读到
ints,而是字符,这些应该是unsigned。同样的任务被问了很多,所以你可以用谷歌搜索 -
无论如何,使用调试器定位分段错误是你的任务。
-
另外,您应该
fseek返回您使用之前的fread调用而不是 512 实际读取的字节数。 -
@Jabberwocky,没关系,在这两种情况下
fread都会得到void*指向同一个内存地址的指针
标签: c io segmentation-fault cs50