2010-06-24 12 views
7

में अंतर मैं व्यवहार में निम्नलिखित अंतर से हैरान हूँ fscanf_s:fscanf/व्यवहार

// suppose myfile.txt contains a single line with the single character 's' 
    errno_t res; 
    FILE* fp; 
    char cmd[81]; 

    res = fopen_s(&fp, "D:\\myfile.txt", "rb"); 
    fscanf(fp,"%80s",cmd); // cmd now contains 's/0' 
    fclose(fp); 

    res = fopen_s(&fp, "D:\\myfile.txt", "rb"); 
    fscanf_s(fp,"%80s",cmd); // cmd now contains '/0' ! 
    fclose(fp); 

परिणाम कॉल के क्रम में निर्भर नहीं है (यानी, fscanf_s पहले फोन, आप खाली मिलता था स्ट्रिंग पहले)। वीसी ++ - वीएस2005 पर संकलित। क्या कोई पुनरुत्पादित कर सकता है? क्या कोई समझा सकता है?

धन्यवाद!

उत्तर

8
डॉक्स से fscanf_s() पर

, http://msdn.microsoft.com/en-us/library/6ybhk9kc.aspx:

सुरक्षित कार्य (_s प्रत्यय सहित) और पुराने कार्यों के बीच मुख्य अंतर यह है कि सुरक्षित कार्यों है आपको लगता है कि तर्क को छोड़ते हुए कर रहे हैं प्रत्येक सी, सी, एस, एस और [प्रकार फ़ील्ड को वैरिएबल के तुरंत बाद तर्क के रूप में पारित करने के लिए आवश्यक है। अधिक जानकारी के लिए, scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l और scanf चौड़ाई विशिष्टता देखें।

और http://msdn.microsoft.com/en-us/library/w40768et.aspx:

scanf और wscanf के विपरीत, scanf_s और wscanf_s की आवश्यकता होती है बफर आकार के प्रकार सी, सी, एस, एस, या [सभी इनपुट पैरामीटर के लिए निर्दिष्ट किया जाना है। बफर आकार को बफर या चर के सूचक के तुरंत बाद एक अतिरिक्त पैरामीटर के रूप में पारित किया जाता है। उदाहरण के लिए, यदि स्ट्रिंग पढ़ना है, तो उस स्ट्रिंग के लिए बफर आकार निम्नानुसार पास किया गया है:

char s [10];

स्कैनफ़ ("% 9 एस", एस, 10);

तो तुम यह इतना तरह बुलाना चाहिए:

fscanf_s(fp,"%80s",cmd, sizeof(cmd)); 
6

fscanf_s (और पूरे scanf_s परिवार) की आवश्यकता है कि आप के आकार पारित किसी भी %c, %C, %s, %S, या %[ बफर ही के बाद;

fscanf_s(fp, "%80s", cmd, 81); 
+3

यह वास्तव में गलत उपयोग की तरह लगता है। '81'' cmd' बफर का आकार माना जाता है। लेकिन क्या यह है? "सुरक्षित" फ़ंक्शन का उपयोग करने के बावजूद, क्रैश होने वाले कोड को लिखने का यह एक अच्छा तरीका है। वर्णों की स्थिर सरणी में पढ़ने के मामले में 'sizeof (cmd) 'होना चाहिए, कुछ चर जो बफर को आवंटित किया गया है, या दिए गए बफर के आकार/क्षमता फ़ंक्शन को कॉल करता है। जबकि आपका उदाहरण तकनीकी रूप से सही है, यह कई लोगों के लिए भ्रामक हो सकता है। –

2

आपका प्रश्न सी टैग है ++ और आप कुलपति ++ में संकलित कर रहे हैं, लेकिन fscanf का उपयोग कर? एक std :: ifstream प्राप्त करें।

std::string buffer; 
std::ifstream fp("my filepath"); 
fp >> buffer;