मैं आमतौर पर या तो stdin से पढ़ता हूं या किसी फ़ाइल नाम से:

FILE *open_file(char *filename, FILE *fallback, char *mode)
{
    FILE *fp = fallback;

    if (filename != NULL) {
        if ((fp = fopen(filename, mode)) == NULL) {
            fprintf(stderr, "Error: cannot open '%s'!\n", filename);
            exit(ERROR_CANNOT_READ_FILE);
        }
    }

    if (fp == NULL) {
        fprintf(stderr, "Error: file error!\n");
        exit(ERROR_CANNOT_READ_FILE);
    }
    return fp;
}

int main(int argc, char* argv[]) {
    FILE *fp = open_file(argc > 1 ? argv[1] : NULL, stdin, "r");

    // some stuff...

    if(!fclose(fp)) {
       exit(EXIT_FAILURE);
    }        
}

इस उदाहरण में, मुझे fclose के साथ समस्या हो सकती है। मैं न तो stdin और न ही stdout को बंद कर सकता हूं। मैं fp को ठीक से और सशर्त रूप से कैसे बंद कर सकता हूं?

क्या मुझे fp बंद करना चाहिए?

1
nowox 10 मार्च 2020, 16:38
क्या आप fclose: if (fp != stdin && !fclose(fp)) ... पर कॉल करने से पहले stdin के लिए परीक्षण कर सकते हैं?
 – 
Adrian Mole
10 मार्च 2020, 16:46
5
आप stdin और stdout में से किसी एक को या दोनों को बंद कर सकते हैं। आप if (fp != stdout) … का परीक्षण कर सकते हैं
 – 
Jonathan Leffler
10 मार्च 2020, 16:46
1
"मैं न तो स्टड को बंद कर सकता हूं और न ही स्टडआउट" को विभिन्न तरीकों से लिया जा सकता है: आपको लगता है कि इन्हें बंद नहीं किया जा सकता है। या उन्हें बंद करने से कुछ अवांछनीय अनुवर्ती कार्य होते हैं (fclose() त्रुटि देता है?) कृपया विस्तार करें।
 – 
chux - Reinstate Monica
10 मार्च 2020, 16:57
प्रश्न अधिक है: यदि stdin या stdout नहीं है तो क्या मुझे fp को बंद कर देना चाहिए?
 – 
nowox
10 मार्च 2020, 17:43
1
आप स्टड या स्टडआउट को बंद क्यों नहीं कर सकते?
 – 
William Pursell
11 मार्च 2020, 05:47

1 उत्तर

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

यदि कोई फ़ाइल सफलतापूर्वक बंद हो जाती है लेकिन आपके कोड में fclose () 0 देता है

 if(!fclose(fp)) {
   exit(EXIT_FAILURE);
} 

यदि fclose () फ़ाइल को सफलतापूर्वक बंद कर देता है तो मुख्य () EXIT_FAILURE लौटाता है, ताकि आप इसे बदल सकें

 if(fclose(fp)) {
   exit(EXIT_FAILURE);
} 

या

 if(fclose(fp)!=0){
   exit(EXIT_FAILURE);
} 

संपादित करें:

प्रश्न अधिक है: यदि stdin या stdout नहीं है तो क्या मुझे fp को बंद कर देना चाहिए?

       if( (fp!=stdin) && (fp!=stdout) )
             if( fclose(fp) )
                 exit(EXIT_FAILURE);

या

      if( (fp!=stdin&&fp!=stdout) && fclose(fp) )
                   exit(EXIT_FAILURE);

क्योंकि && एक शॉर्ट-सर्किटिंग ऑपरेटर है और बाएं से दाएं मूल्यांकन की गारंटी देता है

1
srilakshmikanthanp 11 मार्च 2020, 07:11