CS50 pset4 恢复:fwrite 函数中的段错误
CS50 pset4 recover: Seg-fault in fwrite function
每当我 运行 程序时,就会出现段错误。使用 printf 函数,我缩小了在第二个 while 循环的第一次迭代中最后一行代码 fwrite(buffer, sizeof(BYTE), block, output) 中我的 fwrite 函数中发生段错误的范围。我已经尝试了很多东西,但我无法让段错误消失。知道是什么原因造成的以及如何解决这个问题吗?
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <cs50.h>
#include <string.h>
typedef uint8_t BYTE;
const int block = 512;
int main(int argc, char *argv[])
{
if (argc != 2)
{
printf("Usage: ./recover card.raw");
return 1;
}
//open file for reading
char *infile = argv[1];
FILE *file = fopen(infile, "r");
if (file == NULL)
{
printf("Error while opening file");
return 1;
}
//initializing
BYTE buffer[block];
memset(buffer, 0x00, block);
BYTE x = 0;
memset(&x, 0x00, 1);
BYTE JPEG[3] = {0xff, 0xd8, 0xff};
char filename[8];
int imagecount = 0;
//open file output for writing
FILE* output = NULL;
output = fopen("000.jpg", "w");
while (1)
{
fread(&x, sizeof(BYTE), 1, file);
if (x == JPEG[0])
{
fread(&x, sizeof(BYTE), 1, file);
if (x == JPEG[1])
{
fread(&x, sizeof(BYTE), 1, file);
if (x == JPEG[2])
{
fread(&x, sizeof(BYTE), 1, file);
int y = (int) x;
if ((y >= 224) && (y <= 239))
{
break;
}
}
}
}
}
fwrite(JPEG, sizeof(BYTE), 3, output);
fwrite(&x, sizeof(BYTE), 1, output);
fread(output, sizeof(BYTE), block - 4, file);
while (1)
{
int n = fread(&buffer, sizeof(BYTE), block, file);
if (n == 0)
{
break;
}
if (buffer[0] == JPEG[0] && buffer[1] == JPEG[1] && buffer[2] == JPEG[2] && output != NULL)
{
fclose(output);
imagecount++;
sprintf(filename, "%03i.jpg", imagecount);
output = fopen(filename, "w");
}
printf("z");
fwrite(buffer, sizeof(BYTE), block, output);
printf("z");
}
}
您正在做 fread(output,...,...,file)
也就是说,您正在读入作为 output
FILE 描述符的缓冲区。可能不是你想要的......
请注意 fread
的第一个参数是一个 void *
指针,因此很高兴接受它(即没有编译错误)。
换句话说,您正在破坏 FILE *output
指向的内容。
每当我 运行 程序时,就会出现段错误。使用 printf 函数,我缩小了在第二个 while 循环的第一次迭代中最后一行代码 fwrite(buffer, sizeof(BYTE), block, output) 中我的 fwrite 函数中发生段错误的范围。我已经尝试了很多东西,但我无法让段错误消失。知道是什么原因造成的以及如何解决这个问题吗?
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <cs50.h>
#include <string.h>
typedef uint8_t BYTE;
const int block = 512;
int main(int argc, char *argv[])
{
if (argc != 2)
{
printf("Usage: ./recover card.raw");
return 1;
}
//open file for reading
char *infile = argv[1];
FILE *file = fopen(infile, "r");
if (file == NULL)
{
printf("Error while opening file");
return 1;
}
//initializing
BYTE buffer[block];
memset(buffer, 0x00, block);
BYTE x = 0;
memset(&x, 0x00, 1);
BYTE JPEG[3] = {0xff, 0xd8, 0xff};
char filename[8];
int imagecount = 0;
//open file output for writing
FILE* output = NULL;
output = fopen("000.jpg", "w");
while (1)
{
fread(&x, sizeof(BYTE), 1, file);
if (x == JPEG[0])
{
fread(&x, sizeof(BYTE), 1, file);
if (x == JPEG[1])
{
fread(&x, sizeof(BYTE), 1, file);
if (x == JPEG[2])
{
fread(&x, sizeof(BYTE), 1, file);
int y = (int) x;
if ((y >= 224) && (y <= 239))
{
break;
}
}
}
}
}
fwrite(JPEG, sizeof(BYTE), 3, output);
fwrite(&x, sizeof(BYTE), 1, output);
fread(output, sizeof(BYTE), block - 4, file);
while (1)
{
int n = fread(&buffer, sizeof(BYTE), block, file);
if (n == 0)
{
break;
}
if (buffer[0] == JPEG[0] && buffer[1] == JPEG[1] && buffer[2] == JPEG[2] && output != NULL)
{
fclose(output);
imagecount++;
sprintf(filename, "%03i.jpg", imagecount);
output = fopen(filename, "w");
}
printf("z");
fwrite(buffer, sizeof(BYTE), block, output);
printf("z");
}
}
您正在做 fread(output,...,...,file)
也就是说,您正在读入作为 output
FILE 描述符的缓冲区。可能不是你想要的......
请注意 fread
的第一个参数是一个 void *
指针,因此很高兴接受它(即没有编译错误)。
换句话说,您正在破坏 FILE *output
指向的内容。