2011-06-19 14 views
13

गुगल फ़ाइल इनपुट मुझे फ़ाइल से पाठ इनपुट करने के दो तरीके मिले - fopen और ifstream। नीचे दो स्निपेट हैं। मेरे पास एक टेक्स्ट फ़ाइल है जिसमें एक पूर्णांक वाला एक लाइन है जिसमें मुझे पढ़ने की आवश्यकता है। क्या मुझे फॉपेन या ifstream का उपयोग करना चाहिए?एक टेक्स्ट फ़ाइल पढ़ना - fopen बनाम ifstream

SNIPPET 1 - fopen

FILE * pFile = fopen ("myfile.txt" , "r"); 
char mystring [100]; 
if (pFile == NULL) 
{ 
    perror ("Error opening file"); 
} 
else 
{ 
    fgets (mystring , 100 , pFile); 
    puts (mystring); 
    fclose (pFile); 
} 

SNIPPET 2 - ifstream

string line; 
ifstream myfile ("example.txt"); 
if (myfile.is_open()) 
{ 
    while (myfile.good()) 
    { 
     getline (myfile,line); 
     cout << line << endl; 
    } 
    myfile.close(); 
} 
else 
{ 
    cout << "Unable to open file"; 
} 

उत्तर

13

मैं ifstream पसंद करेंगे क्योंकि यह fopen से थोड़ा अधिक मॉड्यूलर है। मान लीजिए कि आप स्ट्रीम से पढ़ते कोड को स्ट्रिंग स्ट्रीम से पढ़ सकते हैं, या किसी अन्य आईट्रीम से पढ़ सकते हैं। आप इसे इस तरह लिख सकते हैं:

void file_reader() 
{ 
    string line; 
    ifstream myfile ("example.txt"); 
    if (myfile.is_open()) 
    { 
     while (myfile.good()) 
     { 
      stream_reader(myfile); 
     } 
     myfile.close(); 
    } 
    else 
    { 
     cout << "Unable to open file"; 
    } 
} 

void stream_reader(istream& stream) 
{ 
    getline (stream,line); 
    cout << line << endl; 
} 

अब आप एक असली फ़ाइल का उपयोग किए बिना stream_reader का परीक्षण, या उसका उपयोग अन्य इनपुट प्रकार से पढ़ने के लिए कर सकते हैं। यह फॉपेन के साथ और अधिक कठिन है।

+0

'स्ट्रीम स्ट्रीमर (फ़ाइल * स्ट्रीम) {fgets (लाइन, लेन, स्ट्रीम) क्यों नहीं होगा; पुट (लाइन); } 'अनिवार्य रूप से समान होना चाहिए? –

+0

क्या फॉपेन या tmpfile के कॉल के बिना 'FILE * 'बनाना संभव है? मुझे विश्वास नहीं है कि यह है, लेकिन मैं गलत हो सकता हूं। चूंकि 'stream_reader' के संचालन के लिए केवल एक स्ट्रीम की आवश्यकता होती है, न कि फ़ाइल, मैं इसे' फ़ाइल * 'की आवश्यकता के बजाय इसे अधिक नहीं समझूंगा। यूनिट परीक्षणों में उदाहरण के लिए, इसे 'फ़ाइल *' के बजाय स्ट्रिंग स्ट्रीम पास करना आसान हो सकता है। –

+0

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

25

चूंकि इसे सी ++ के रूप में टैग किया गया है, तो मैं ifstream कहूंगा। अगर इसे सी के रूप में टैग किया गया था, तो मैं फॉपेन के साथ जाऊंगा: पी

+2

मुझे लगता है कि सी इंटरफ़ेस फ़ाइलों को पढ़ने के लिए क्लीनर है लेकिन फिर भी +1। –

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