2008-08-11 18 views
19

मैं पढ़ने के लिए एक फ़ाइल खोलना चाहता हूं, सी ++ तरीका। मुझे इसके लिए ऐसा करने में सक्षम होना चाहिए:सी ++ में फ़ाइल कैसे खोलें?

  • टेक्स्ट फ़ाइलें, जिसमें कुछ प्रकार के रीड लाइन फ़ंक्शन शामिल होंगे।

  • द्विआधारी फ़ाइलें, जो char* बफर में कच्चे डेटा को पढ़ने का एक तरीका प्रदान करेगी।

+1

[सी ++: फाइलों के साथ इनपुट/आउटपुट] (http://www.cplusplus.com/doc/tutorial/files.html) – mreggen

+0

आरएआईआई में दिलचस्पी रखने वाले किसी भी व्यक्ति को जांचना चाहिए [आधिकारिक संसाधन प्रबंधन पेज] (http://www.relisoft.com/resource/resmain.html) Bartosz Milewski द्वारा। – titanae

उत्तर

8

आपकी आवश्यकताओं के आधार पर ऐसा करने के तीन तरीके हैं। आप पुराने स्कूल सी तरीके का उपयोग कर सकते हैं और फॉपेन/फ्रेड/फ्लेक्स कॉल कर सकते हैं, या आप सी ++ एफस्ट्रीम सुविधाओं (ifstream/ऑफस्ट्रीम) का उपयोग कर सकते हैं, या यदि आप एमएफसी का उपयोग कर रहे हैं, तो सीएफआईएल क्लास का उपयोग करें, जो वास्तविक को पूरा करने के लिए कार्य प्रदान करता है फाइल ऑपरेशंस

ये सभी टेक्स्ट और बाइनरी दोनों के लिए उपयुक्त हैं, हालांकि किसी के पास कोई विशिष्ट रीडलाइन कार्यक्षमता नहीं है।

int nsize = 10; 
char *somedata; 
ifstream myfile; 
myfile.open("<path to file>"); 
myfile.read(somedata,nsize); 
myfile.close(); 
: क्या आप सबसे अधिक संभावना है कि मामले में बजाय करना चाहते हैं fstream वर्ग (fstream.h) का उपयोग करें और धारा ऑपरेटरों (< < और >>) या पढ़ने समारोह का उपयोग पाठ की/लिखने ब्लॉक पढ़ने के लिए है

ध्यान दें कि, यदि आप विजुअल स्टूडियो 2005 या उच्चतर का उपयोग कर रहे हैं, तो पारंपरिक fstream उपलब्ध नहीं हो सकता है (एक नया माइक्रोसॉफ्ट कार्यान्वयन है, जो थोड़ा अलग है, लेकिन एक ही चीज़ पूरा करता है)।

+6

क्या आपको पढ़ने पर सीगफॉल्ट नहीं मिलेगा? आपने डेटा के लिए कोई स्थान आवंटित नहीं किया था। 'Char somedata [10] 'होना चाहिए, है ना? – swdev

24

यदि आप बस पढ़ना चाहते हैं तो आपको ifstream का उपयोग करने की आवश्यकता है (लिखने के लिए ofstream का उपयोग करें, या fstream दोनों के लिए)।

पाठ मोड में किसी फ़ाइल को खोलने के लिए, निम्न कार्य करें:

ifstream in("filename.ext", ios_base::in); // the in flag is optional 

द्विआधारी मोड में एक फ़ाइल को खोलने के लिए, आप केवल "बाइनरी" ध्वज जोड़ने की जरूरत है।

ifstream in2("filename2.ext", ios_base::in | ios_base::binary); 

ifstream.read() फ़ंक्शन का उपयोग पात्रों में से एक ब्लॉक (बाइनरी या पाठ मोड में) को पढ़ने के लिए। पूरी लाइन पढ़ने के लिए getline() फ़ंक्शन (यह वैश्विक है) का उपयोग करें।

+0

+1 यह नोट करने के लिए कि वैश्विक फ़ंक्शनलाइन फ़ंक्शन का उपयोग सदस्य फ़ंक्शन के बजाय किया जाना है। – foraidt

+0

मुझे लगता है कि बाइनरी ध्वज केवल विंडोज वातावरण में ही आवश्यक है? – rogerdpack

+0

roger, मुझे ऐसा कोई मामला नहीं मिला है जहां मुझे विंडोज या यूनिक्स पर बाइनरी ध्वज की आवश्यकता थी। सिद्धांत रूप में, हालांकि, इसका उपयोग किसी भी अंतर्निहित रूपांतरण से बचने के लिए किया जाना चाहिए। http://stdcxx.apache.org/doc/stdlibug/30-4.html –

-2

fstream बहुत अच्छे हैं लेकिन मैं थोड़ा गहराई से जाऊंगा और आपको RAII के बारे में बताऊंगा।

क्लासिक उदाहरण के साथ समस्या यह है कि आपको फ़ाइल को अपने आप बंद करने के लिए मजबूर होना पड़ता है, जिसका अर्थ है कि आपको इस आवश्यकता के लिए अपने आर्किटेक्चर को मोड़ना होगा। आरएआईआई आपके लिए फाइल बंद करने के लिए सी ++ में स्वचालित विनाशक कॉल का उपयोग करता है।

अद्यतन: ऐसा लगता है कि std :: fstream पहले ही आरएआईआई लागू करता है, इसलिए नीचे दिया गया कोड बेकार है। मैं इसे यहां पोस्टरिटी के लिए और आरएआईआई के उदाहरण के रूप में रखूंगा।

class FileOpener 
{ 
public: 
    FileOpener(std::fstream& file, const char* fileName): m_file(file) 
    { 
     m_file.open(fileName); 
    } 
    ~FileOpeneer() 
    { 
     file.close(); 
    } 

private: 
    std::fstream& m_file; 
}; 

अब आप इस तरह अपने कोड में इस वर्ग का उपयोग कर सकते हैं:

int nsize = 10; 
char *somedata; 
ifstream myfile; 
FileOpener opener(myfile, "<path to file>"); 
myfile.read(somedata,nsize); 
// myfile is closed automatically when opener destructor is called 

सीखना कैसे आरए II काम करता है आप कुछ सिर दर्द और कुछ प्रमुख स्मृति प्रबंधन कीड़े बचा सकता है।खोलने के लिए और एक बाइनरी फ़ाइल आप स्पष्ट रूप से अपने इनपुट धारा में पढ़ने प्रारूप की घोषणा करने की जरूरत है पढ़ने के लिए

// define your file name 
string file_name = "data.txt"; 

// attach an input stream to the wanted file 
ifstream input_stream(file_name); 

// check stream status 
if (!input_stream) cerr << "Can't open input file!"; 

// file contents 
vector<string> text; 

// one line 
string line; 

// extract all the text from the input file 
while (getline(input_stream, line)) { 

    // store each line in the vector 
    text.push_back(line); 
} 

:

+4

फ़ाइल स्ट्रीम ऑब्जेक्ट्स उनके विनाशक में बंद हो जाते हैं, इसलिए यह नई कक्षा बेकार है। – Flame

0
#include <iostream> 
#include <fstream> 
using namespace std; 

void main() 
{ 
    ifstream in_stream; // fstream command to initiate "in_stream" as a command. 
    char filename[31]; // variable for "filename". 
    cout << "Enter file name to open :: "; // asks user for input for "filename". 
    cin.getline(filename, 30); // this gets the line from input for "filename". 
    in_stream.open(filename); // this in_stream (fstream) the "filename" to open. 
    if (in_stream.fail()) 
    { 
     cout << "Could not open file to read.""\n"; // if the open file fails. 
     return; 
    } 
    //.....the rest of the text goes beneath...... 
} 
2

खोलने के लिए और प्रत्येक पंक्ति में एक पाठ फ़ाइल लाइन पढ़ने के लिए, आप निम्नलिखित इस्तेमाल कर सकते हैं द्विआधारी होने के लिए, और स्मृति धारा सदस्य समारोह read() का उपयोग कर कोई स्पष्ट व्याख्या है कि पढ़ें:

// define your file name 
string file_name = "binary_data.bin"; 

// attach an input stream to the wanted file 
ifstream input_stream(file_name, ios::binary); 

// check stream status 
if (!input_stream) cerr << "Can't open input file!"; 

// use function that explicitly specifies the amount of block memory read 
int memory_size = 10; 

// allocate 10 bytes of memory on heap 
char* dynamic_buffer = new char[memory_size]; 

// read 10 bytes and store in dynamic_buffer 
file_name.read(dynamic_buffer, memory_size); 

यह कर जब आपकरने की आवश्यकता होगीहेडर: <iostream>

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