मेरा स्रोत कोड कुल 50 चित्रों को सफलतापूर्वक संकलित और निर्मित करता है।
हालांकि, बरामद छवियों में से कोई भी मूल छवि से मेल नहीं खाता है।
नीचे सभी jpeg इस तरह दिखाई देते हैं.
जैसा कि आप देख सकते हैं, वे अजीब किनारों को ओवरलैप करते हुए प्रतीत होते हैं।
उनमें से कुछ ठीक दिखते हैं, लेकिन फिर भी मूल तस्वीर से मेल नहीं खाते।

यहां छवि विवरण दर्ज करें यहां छवि विवरण दर्ज करें

यदि आप डिबग करने के बारे में कोई जानकारी दे सकते हैं, तो कृपया मुझे बताएं।

यह मेरा कोड है

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>

int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        printf("Usage: ./recover image\n");
        return 1;
    }

    FILE *file = fopen(argv[1], "r");
    if (file == NULL)
    {
        printf("Could not open %s.\n", argv[1]);
        return 1;
    }

    typedef uint8_t BYTE;
    BYTE buffer[512];
    char *filename[8];
    int jpeg_counter = 0;
    bool foundStartOfJPEG = false;
    FILE *img;

    // read memory card until the end of file
    while(fread(buffer, sizeof(BYTE) * 512, 1, file) == 1)
    {
        // if buffer has a signature of JPEG file,
        if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && ((buffer[3]) & 0xf0) == 0xe0)
        {
            if (foundStartOfJPEG == true)
            {
                fclose(img);
                jpeg_counter += 1;
            }

            foundStartOfJPEG = true;
            // create a file with index
            sprintf(*filename, "%03i.jpg", jpeg_counter);
            // open that file to write into it
            img = fopen(*filename, "w");
            // write the block of memory (buffer), to that file
            fwrite(buffer, sizeof(buffer), 1, img);
        }
        else if (foundStartOfJPEG == true)
        {
            fwrite(buffer, sizeof(buffer), 1, img);
        }
    }

    fclose(file);
    return 0;
}
-1
FluffyCat 22 अप्रैल 2020, 09:15
1
लूप के अंदर fread() को एक और कॉल क्यों fread()पहले से ही है?
 – 
alk
22 अप्रैल 2020, 09:18
धन्यवाद, मैंने अभी-अभी fread() की अतिरिक्त लाइन हटाई है। अब, मेरे पास 50 तस्वीरें बरामद हुई हैं, लेकिन यह मूल छवि से मेल नहीं खाती। मैं समस्या को अपडेट करूंगा। @alk
 – 
FluffyCat
22 अप्रैल 2020, 09:24

2 जवाब

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

मैंने आपके कोड की कोशिश की और यह तब काम करता है जब आप फ़ाइल नाम को पॉइंटर से सरणी में बदलते हैं (यानी char * filename से char filename)।

1
mich-ish 22 अप्रैल 2020, 11:31
धन्यवाद, एक बार मेरे फ़ाइल नाम को वर्णों की एक सरणी में बदलने के बाद, यह तय हो गया है। हालाँकि, क्या आप जानते हैं कि पॉइंटर होने के कारण यह समस्या क्यों हुई? मेरी समझ है, चरित्र की एक सरणी और चरित्र की सूचक सरणी, दोनों मूल रूप से स्ट्रिंग टाइप कर रहे हैं। वैसे भी, मैंने आपका जवाब स्वीकार कर लिया है :)
 – 
FluffyCat
22 अप्रैल 2020, 13:47
1
मुझे यकीन नहीं है कि छवियों को उनके तरीके से विकृत क्यों किया जाता है, लेकिन मुझे लगता है कि सूचक का उपयोग पहली जगह में सही नहीं है, इसलिए त्रुटि किसी तरह से उत्पन्न होती है। मैंने आपको यह दिखाने के लिए एक और उत्तर जोड़ा है कि मेरा क्या मतलब है।
 – 
mich-ish
22 अप्रैल 2020, 16:41

यह भी काम करता है और पॉइंटर्स के उपयोग को शामिल करता है। यहाँ p एक सूचक है जो फ़ाइल नाम की ओर इशारा करता है। हालाँकि, मुझे लगता है कि इसका उपयोग बेमानी है। पी के उपयोग के बिना, आप कह सकते हैं कि फ़ाइल नाम एक सूचक है जो फ़ाइल नाम के पहले तत्व को इंगित करता है, यानी फ़ाइल नाम [0]। तो जब आपने char *filename[8] का उपयोग किया तो यह कहने जैसा था कि filename एक पॉइंटर है जो एक पॉइंटर की ओर इशारा करता है... आशा है कि यह समझ में आता है!

typedef uint8_t BYTE;
BYTE buffer[512];
char filename[8];
char *p = filename;
int jpeg_counter = 0;
bool foundStartOfJPEG = false;
FILE *img;

// read memory card until the end of file
while(fread(buffer, sizeof(BYTE) * 512, 1, file) == 1)
{
    // if buffer has a signature of JPEG file,
    if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && ((buffer[3]) & 0xf0) == 0xe0)
    {
        if (foundStartOfJPEG == true)
        {
            fclose(img);
        }

        jpeg_counter += 1;
        foundStartOfJPEG = true;
        // create a file with index
        sprintf(p, "%03i.jpg", jpeg_counter);
        // open that file to write into it
        img = fopen(p, "w");
        // write the block of memory (buffer), to that file
        fwrite(buffer, sizeof(buffer), 1, img);
    }
    else if (foundStartOfJPEG == true)
    {
        fwrite(buffer, sizeof(buffer), 1, img);
    }
}
1
mich-ish 22 अप्रैल 2020, 18:58