मेरा स्रोत कोड कुल 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;
}
2 जवाब
मैंने आपके कोड की कोशिश की और यह तब काम करता है जब आप फ़ाइल नाम को पॉइंटर से सरणी में बदलते हैं (यानी char * filename से char filename)।
यह भी काम करता है और पॉइंटर्स के उपयोग को शामिल करता है। यहाँ 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);
}
}
fread()
को एक और कॉल क्योंfread()
पहले से ही है?fread()
की अतिरिक्त लाइन हटाई है। अब, मेरे पास 50 तस्वीरें बरामद हुई हैं, लेकिन यह मूल छवि से मेल नहीं खाती। मैं समस्या को अपडेट करूंगा। @alk