2016-02-17 8 views
8

मैंने ओटीपी एन्क्रिप्टेड, फ़ाइल को डिक्रिप्ट करने के लिए एक छोटा प्रोग्राम लिखा था। यह ठीक काम करता है।लौटे हुए पॉइंटर को सहेजे बिना फॉपेन क्यों काम करता है?

लेकिन मुझे एहसास हुआ कि मैं "Solution.jpg" पर फॉपेन को कॉल करते समय लौटाए गए फ़ाइल पॉइंटर को सहेजना भूल गया था। जैसा कि आप देख सकते हैं, मैं फ़ाइल सूचक एफ को लिख रहा हूं। मैं सोच रहा हूं कि यह कोड क्यों काम कर रहा है।

#include <stdio.h> 

#define FILE_SIZE 4202 

int main() { 
    unsigned char key[FILE_SIZE], otpCipher[FILE_SIZE]; 

    FILE *f = fopen("otpkey.bin", "r"); 
    fread(key, sizeof(char), FILE_SIZE, f); 
    fclose(f); 

    f = fopen("otpcipher.bin", "r"); 
    fread(otpCipher, sizeof(char), FILE_SIZE, f); 
    fclose(f); 

    fopen("Solution.jpg", "w"); 

    for (int j = 0; j < FILE_SIZE; ++j) { 
     otpCipher[j] = otpCipher[j]^key[j]; 
     fputc(otpCipher[j], f); 
    } 

    fclose(f); 

    return 0; 
} 
+1

'f' इसे बंद करने के बाद अमान्य है। तो इसके बाद किसी भी अन्य समारोह में इसका उपयोग अनिर्धारित व्यवहार है। यूबी का मतलब है कि यह काम कर सकता है लेकिन यह क्रैश हो सकता है, या किसी अन्य फाइल को लिख सकता है, या चुपचाप जारी रख सकता है, या कोई अन्य अपरिभाषित कार्रवाई। – kaylum

+0

'fputc (otpCipher [j], f) है;' 'Solution.jpg' पर लिख रहा है? मुझे ऐसा नहीं लगता ... – LPs

+3

@ एलपी मुझे लगता है कि यह ओपी के मामले में करता है। क्योंकि 'fopen ("Solution.jpg", "w");' 'FILE' के लिए उसी स्मृति का पुन: उपयोग करना होता है क्योंकि सूचक' f' पहले से संदर्भ है। तो उस 'fputc' के लिए उपयोग किए जाने वाले' f' में पॉइंटर मौका से मान्य है। – kaylum

उत्तर

6

मैं सिर्फ gdb का उपयोग कर जवाब मिल गया।

इसलिए जब से मैं नई फ़ाइल खोलने से पहले fclose() का उपयोग कर रहा हूं, पहले इस्तेमाल की गई फ़ाइल में पॉइंटर मुक्त हो गया था। इस सूचक को फिर से इस्तेमाल किया जा सकता है और fopen() हर बार जब मैंने इस कार्यक्रम को चलाया तो इस सूचक को वापस कर दिया।

तो यह सिर्फ इसलिए काम करता था क्योंकि उस समय कोई अन्य फ़ाइल खोला नहीं गया था जब मैंने fopen() कहा था।

यह अनिर्धारित व्यवहार है और जो अन्य समस्याओं का कारण बन सकता है। इसे सभी परिस्थितियों में टालना चाहिए (मैंने इसे गलती से किया)। मैं सिर्फ यह समझना चाहता था कि यह क्यों काम कर रहा था और मेरा कोड तय कर रहा था।

+4

आपने वास्तविक व्यवहार का सही ढंग से निदान किया है, लेकिन ध्यान रखें कि यह सी मानक द्वारा किसी भी तरह से निंदा नहीं किया गया है। 'Fclose (f) 'कॉल करने के बाद' f' का उपयोग करने के लिए यह अनिर्धारित व्यवहार है। इसे एक छोटा चमत्कार कहें कि 'फॉपेन()' एक ही सूचक लौटाता है, निश्चित रूप से इस पर भरोसा नहीं करता है। यह भी ध्यान रखें कि आपको 'fopen' और' fread' के वापसी मानों को भी देखना चाहिए। – chqrlie

+0

धन्यवाद, मुझे पता है कि यह एक बुरी बात है। तो मैंने स्पष्टता के लिए इसे अपने उत्तर में जोड़ा। – johnson262

+4

+1 स्वयं को जीडीबी का उपयोग करके समस्या का पता लगाने और "यह काम करने के लिए होता है" को स्वीकार करने/स्वीकार करने के लिए +1 एक अच्छी स्थिति नहीं है। – TripeHound

संबंधित मुद्दे