2010-04-04 11 views
19

मैं टेक्स्ट फ़ाइल में आउटपुट लिखने के लिए सी में fopen का उपयोग कर रहा हूं। समारोह घोषणा है (जहां ARRAY_SIZE पहले परिभाषित किया गया है):fopen/fopen_s और फ़ाइलों को लिखना

void create_out_file(char file_name[],long double *z1){ 
    FILE *out; 
    int i; 

    if((out = fopen(file_name, "w+")) == NULL){ 
    fprintf(stderr, "***> Open error on output file %s", file_name); 
    exit(-1); 
    } 

    for(i = 0; i < ARRAY_SIZE; i++) 
    fprintf(out, "%.16Le\n", z1[i]); 
    fclose(out); 
} 

मेरे सवालों का:

  1. MVS2008 साथ

    संकलन को मैं चेतावनी मिलती है: C4996 चेतावनी: 'fopen': यह समारोह या चर असुरक्षित हो सकता है। इसके बजाय fopen_s का उपयोग करने पर विचार करें। मुझे fopen_s पर अधिक जानकारी नहीं मिली है ताकि मैं अपना कोड बदल सकूं। कोई सुझाव?

  2. एक fprintf निर्देश दे सकते हैं एक वांछित संख्यात्मक परिशुद्धता एक फ़ाइल को पर संख्या लिखने के लिए? अगर मैं long double का उपयोग कर रहा हूं तो मुझे लगता है कि मेरे अंक दशमलव बिंदु के बाद 15 अंकों तक अच्छे हैं। क्या मैं सही हू?

+16

एफओपीएन() के बारे में कुछ भी दूरस्थ रूप से असुरक्षित नहीं है, लेकिन एमएस में कुछ लोगों ने उन कार्यों पर अपने सामूहिक पत्थर खो दिए हैं जो पैरामीटर के रूप में शून्य-समाप्त तारों को लेते हैं। –

+0

मेरा मानना ​​है कि यह माइक्रोसॉफ्ट द्वारा विंडोज़-केवल प्रोग्रामिंग में लोगों को लॉक करने के लिए एक साजिश है। – stackptr

उत्तर

16

fopen_sfopen का एक प्रकार है जो पैरामीटर मान्यता और हाथ वापस शामिल मामला कुछ में एक सूचक के बजाय एक त्रुटि कोड खुला प्रक्रिया के दौरान गलत हो जाता है। यह आधार संस्करण से अधिक सुरक्षित है क्योंकि यह अधिक किनारे की स्थिति के लिए जिम्मेदार है। संकलक आपको इसका उपयोग करने की चेतावनी दे रहा है क्योंकि fopen आपके आवेदन में संभावित शोषण वेक्टर का प्रतिनिधित्व करता है।

आप विनिर्देशक %.xg, जहां एक्स परिशुद्धता के अंक आप उत्पादन में चाहते हैं का उपयोग करके कार्यों का printf परिवार के लिए परिशुद्धता के अंक निर्दिष्ट कर सकते हैं। long double प्लेटफ़ॉर्म से प्लेटफ़ॉर्म तक परिशुद्धता में भिन्न होता है, लेकिन आप आमतौर पर दशमलव परिशुद्धता के कम से कम 16 अंकों पर शर्त लगा सकते हैं।

संपादित करें: जब मैं अन्य लोगों ने सुझाव दे रहे हैं कि fopen_s समय की एक पूरा बर्बादी है के साथ बोर्ड पर पूरी तरह से नहीं कर रहा हूँ, यह शोषण का एक बहुत कम मौका का प्रतिनिधित्व करता है और यह व्यापक रूप से समर्थित नहीं है। सी 4 9 6 9 के तहत चेतावनी दी गई कुछ अन्य कार्रवाइयां बहुत गंभीर भेद्यताएं हैं, हालांकि, और _CRT_SECURE_NO_WARNINGS का उपयोग करके "आप अपने बेडरूम का दरवाजा अनलॉक छोड़ दिया" और "आपने रसोई में परमाणु बम छोड़ा" दोनों के लिए अलार्म बंद करने के बराबर है।

जब तक आप अपनी परियोजना के लिए "शुद्ध सी" का उपयोग करने के लिए प्रतिबंधित नहीं हैं (उदा।एक स्कूल असाइनमेंट या एम्बेडेड माइक्रोकंट्रोलर के लिए), आपको इस तथ्य का फायदा उठाना अच्छा होगा कि लगभग सभी आधुनिक सी कंपाइलर भी सी ++ कंपाइलर्स हैं और इन सभी I/O फ़ंक्शंस के C++ iostream रूपों का उपयोग बेहतर सुरक्षा दोनों प्राप्त करने के लिए करते हैं। और एक ही समय में संगतता।

+0

धन्यवाद। मेरे पास fprintf (आउट, "% .16Le \ n", z1 [i]) मेरे कोड में है और हाँ मुझे d.p के बाद 16 सटीक अंक मिलते हैं। – yCalleecharan

+0

फिर से धन्यवाद। मैं सी का उपयोग कर रहा हूं क्योंकि यह मैं बेहतर जानता हूं। मैं शोध उद्देश्यों के लिए एक कोड लिख रहा हूं जिसे सटीक परिणाम देना है। मुझे सी कोड बनाने के मेरे समीकरणों को गैर-आयामी बनाना था ताकि मूल्यों की एक अच्छी श्रृंखला हो जो कि बहुत बड़े मूल्यों को रोकती है और न ही सिमुलेशन में और इसलिए समाधान में रुकने के लिए बहुत कम मूल्यों को रोकती है। मुझे सी ++ के बारे में बहुत कुछ पता नहीं है और मुझे नहीं पता कि मैं सिर्फ अपनी फाइल को सीपीपी में सहेज सकता हूं और सी ++ iostream का उपयोग अपने कोड के अन्य हिस्सों के बिना सुरक्षित रूप से संकलन त्रुटियों को दे रहा हूं। अभी के लिए, मैं खुद को सी तक सीमित कर दूंगा जब तक कि मुझे पता न हो कि सी ++ पर स्विच कैसे करें। – yCalleecharan

1

बस _CRT_SECURE_NO_WARNINGS को परिभाषित करने से पहले आप इस चेतावनी से छुटकारा पाने के लिए किसी भी फ़ाइल में शामिल हैं, और रोकने के क्या एमएस कहते हैं के बारे में fopen

+0

धन्यवाद। क्या यह शीर्ष पर #define _CRT_SECURE_NO_WARNINGS जोड़ना है? – yCalleecharan

6
  1. fopen_s और अन्य सभी _s कार्यों MS-विशिष्ट हैं "करने के लिए विश्वास करते हैं सुरक्षित "मानक कार्यों के रूप। यदि आपके कोड को क्रॉस-प्लेटफ़ॉर्म होने की आवश्यकता नहीं है, तो आप बस स्विच कर सकते हैं और कंपाइलर को खुश कर सकते हैं। अन्यथा, बस अपनी परियोजना सेटिंग्स में _CRT_SECURE_NO_WARNINGS प्री-प्रोसेसर निर्देश जोड़ें और यह आपको इसके बारे में चेतावनी देना बंद कर देगा।

  2. हाँ, लंबी अवधि सटीकता के 15 अंकों के लिए आसानी से अच्छा है; असल में, यहां तक ​​कि नियमित युगल भी उतना ही अच्छा है (लेकिन कोई और नहीं)।

+0

धन्यवाद। मेरी 32-बिट मशीन पर, डबल और लम्बी डबल दोनों मुझे सटीकता के 16 अंक देता है और 16 वां अंक सटीक नहीं है। – yCalleecharan

+0

हाँ, 'लंबा डबल' आकार मंच-निर्भर है; दुख की बात है, एमएसवीसी ++ इसे 'डबल' के समान बनाता है, इसलिए वास्तव में कोई उपयोग नहीं है। 64-बिट डबल में मंटिसा में 53-बिट सटीकता है, जो लगभग 15.9 5 दशमलव अंक (लॉग 10 (53)) है। – tzaman

+0

जानकारी के लिए धन्यवाद। – yCalleecharan

4

अन्य पोस्टर्स ने इंगित किया है कि फॉपेन वास्तव में बहुत असुरक्षित नहीं है। यदि आप यह चेतावनी नहीं चाहते हैं, लेकिन आप उन अन्य लोगों को चाहते हैं जो वास्तविक भेद्यता की चेतावनी देते हैं, #define _CRT_SECURE_NO_WARNINGS नहीं।

इसके बजाय, अगली बार जब आप फॉपेन चेतावनी प्राप्त करेंगे, तो उस पंक्ति पर क्लिक करें जो "फॉपेन की घोषणा देखें"। यह आपको stdio.h में लाइन पर ले जाएगा जो चेतावनी इंजेक्शन दे रहा है। उस पंक्ति से _CRT_INSECURE_DEPRECATE(fopen_s) टेक्स्ट हटाएं, और जब आप फॉपेन का उपयोग करते हैं तो आपको सुरक्षा चेतावनी नहीं मिलेगी, लेकिन यह स्ट्रैपी, स्ट्रडअप और अन्य संभावित रूप से खतरनाक लोगों के लिए रहेगी।

+1

वास्तव में विंडोज़ पर "मानक" कार्यान्वयन के लिए 14, 125, 16 वर्षीय ब्रैट्स की वजह से कुछ कमजोरियां होती हैं जिनके पास कार्यक्रमों को हैक करने और अन्य लोगों के कंप्यूटर को गड़बड़ करने के तरीकों की तुलना में अपने समय के साथ कुछ बेहतर नहीं होता है, इसलिए वे फ़ाइल रेस्क्रिप्टर को – BrierMay

8

मैं विजुअल स्टूडियो 2012 के साथ काम करने वाली एक ही समस्या में भाग गया लेकिन जहां मेरी समस्या का विस्तार हुआ, मैं एक प्रोग्राम बना रहा हूं कि मैं परीक्षण स्टूडियो की घंटी और सीटी का उपयोग करना चाहता हूं और अंत में संकलन और चलाने में सक्षम हूं मेरे लिनक्स सर्वर पर एक ही एप्लीकेशन (मैं एक बॉट बना रहा हूं)

तो मैं कुछ Google- ing के बाद आया था और सोचा था कि अगर मैं किसी और की मदद कर सकता हूं तो मैं इसे पोस्ट करूंगा।

FILE *fp_config; 
const char *configfile ; 
configfile = "bot.conf"; 
#ifdef WIN32 
    errno_t err; 
    if((err = fopen_s(&fp_config, configfile, "r")) !=0) { 
#else 
    if ((fp_config = fopen(configfile, "r")) == NULL) { 
#endif 
     fprintf(stderr, "Cannot open config file %s!\n", configfile); 
    } 

इस दृश्य स्टूडियो को खुश हो जाएगा और यह शिकायत नहीं होगी और यह भी एक ही कोड जीसीसी पर संकलित करने के लिए या किसी अन्य मानकों के अनुरूप C/C++ संकलक

4

fopen से fopen_s स्थानांतरण करने की क्षमता अक्षम की अनुमति देगा फ़ाइल को खोला जाने और लिखने के दौरान नोटपैड में फ़ाइल खोलने के लिए (केवल पढ़ने के लिए)। फॉपेन पर वापस स्विथिंग और मैं प्रोग्राम पढ़ सकता हूं, मेरा प्रोग्राम फ़ाइल लिखता है।

+0

किशोरों के लिए कठिन बनाना [संदर्भ] (http://en.cppreference.com/w/c/io/fopen): fopen_s या freopen_s का उपयोग करते समय फ़ाइल डिस्क्रिप्टर को पार करने के लिए एक अलग तरीके से आया, फ़ाइल "डब्ल्यू" या "ए" के साथ बनाई गई किसी भी फ़ाइल के लिए एक्सेस अनुमतियां अन्य उपयोगकर्ताओं को इसे एक्सेस करने से रोकती हैं।फ़ाइल एक्सेस मोड ध्वज "यू" वैकल्पिक रूप से डिफ़ॉल्ट फॉपेन अनुमतियों को सक्षम करने के लिए "डब्ल्यू" या "ए" से शुरू होने वाले किसी भी विनिर्देशक के लिए प्रीपेड किया जा सकता है। (सी 11) –

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