CS50 pset4 restore: ошибка сегмента в функции fwrite - PullRequest
0 голосов
/ 06 апреля 2020

Ошибка сегментации возникает всякий раз, когда я запускаю программу. Используя функции printf, я сузил, что ошибка seg возникает в моей функции fwrite в последней строке кода fwrite (buffer, sizeof (BYTE), block, output) в первой итерации второй, пока l oop. Я много чего перепробовал, но я не могу уйти из-за ошибки в go. Любая идея, что может быть причиной этого и как это исправить?

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

1 Ответ

0 голосов
/ 06 апреля 2020

Вы делаете fread(output,...,...,file)

То есть вы читаете в буфер, который является вашим output дескриптором FILE. Вероятно, не то, что вы намеревались ...

Обратите внимание, что первый аргумент fread - это указатель void *, поэтому он очень рад принять это (т.е. без ошибки компиляции).

Другими словами, вы уничтожаете , на что указывает FILE *output.

...