जब भी मैं प्रोग्राम चलाता हूं तो सेगमेंटेशन गलती होती है। प्रिंटफ फ़ंक्शंस का उपयोग करके, मैंने संकुचित कर दिया है कि कोड fwrite (बफर, आकार (BYTE), ब्लॉक, आउटपुट) की अंतिम पंक्ति में मेरे fwrite फ़ंक्शन में seg-fault दूसरी लूप के पहले पुनरावृत्ति में होता है। मैंने बहुत सी चीजों की कोशिश की है, लेकिन मैं दूर जाने के लिए सेग-गलती नहीं कर सकता। कोई विचार यह क्या कारण हो सकता है और इसे कैसे ठीक किया जा सकता है?

#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");
}
}
0
tahahasan360 6 अप्रैल 2020, 05:20

1 उत्तर

सबसे बढ़िया उत्तर

आप एक fread(output,...,...,file) कर रहे हैं

यानी, आप एक बफ़र में पढ़ रहे हैं जो आपका output FILE डिस्क्रिप्टर है। शायद वो नहीं जो आपका इरादा था...

ध्यान दें कि fread के लिए पहला तर्क एक void * सूचक है, इसलिए इसे स्वीकार करने में पूरी तरह से खुशी होती है (यानी कोई संकलन त्रुटि नहीं)।

दूसरे शब्दों में, आप ट्रैशिंग कर रहे हैं जो FILE *output इंगित करता है।

0
Craig Estey 6 अप्रैल 2020, 02:25