आप C ++ में फ़ाइल कैसे खोलते हैं?

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

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

  • बाइनरी फ़ाइलें, जो कच्चे डेटा को char * buffer में पढ़ने का तरीका प्रदान करती हैं।

0
ro fr bn
RAII में रुचि रखने वाले किसी भी व्यक्ति को Bartosz Milewski द्वारा आधिकारिक संसाधन प्रबंधन पृष्ठ देखना चाहिए।
जोड़ा लेखक titanae, स्रोत

8 उत्तर

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

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

Update: seems that std::fstream already implements RAII so the code below is useless. I'll keep it here for posterity and as an example of RAII.

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, "");
myfile.read(somedata,nsize);
// myfile is closed automatically when opener destructor is called

सीखना कि आरएआईआई कैसे काम करता है आपको कुछ सिरदर्द और कुछ प्रमुख मेमोरी प्रबंधन कीड़े बचा सकता है।

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

यदि आप बस चाहते हैं तो आपको एक ifstream का उपयोग करने की आवश्यकता है पढ़ने के लिए (लिखने के लिए ऑफ़स्ट्रीम का उपयोग करें, या दोनों के लिए 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
जोड़ा
roger, मुझे कभी ऐसा मामला नहीं मिला है जहां मुझे विंडोज या यूनिक्स पर बाइनरी झंडा चाहिए। सिद्धांत रूप में, हालांकि, इसका उपयोग किसी भी अंतर्निहित रूपांतरण से बचने के लिए किया जाना चाहिए। stdcxx.apache.org/doc/stdlibug/30-4.html
जोड़ा लेखक Derek Park, स्रोत
मुझे लगता है कि बाइनरी ध्वज केवल विंडोज वातावरण में जरूरी है?
जोड़ा लेखक rogerdpack, स्रोत
यह ध्यान देने के लिए +1 कि सदस्य फ़ंक्शन के बजाय वैश्विक getline() फ़ंक्शन का उपयोग किया जाना है।
जोड़ा लेखक foraidt, स्रोत

प्रति पंक्ति एक टेक्स्ट फ़ाइल लाइन खोलने और पढ़ने के लिए, आप निम्न का उपयोग कर सकते हैं:

// 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 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);
}

बाइनरी फ़ाइल को खोलने और पढ़ने के लिए आपको बाइनरी होने के लिए अपनी इनपुट स्ट्रीम में पढ़ने के प्रारूप को स्पष्ट रूप से घोषित करने की आवश्यकता है, और उस स्मृति को पढ़ें जिसमें स्ट्रीम सदस्य फ़ंक्शन पढ़ें() :

// 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);

When doing this you'll need to #include the header :

0
जोड़ा

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

All of these are suitable for both text and binary, though none have a specific readline functionality. What you'd most likely do instead in that case is use the fstream classes (fstream.h) and use the stream operators (<< and >>) or the read function to read/write blocks of text:

int nsize = 10;
char *somedata;
ifstream myfile;
myfile.open("");
myfile.read(somedata,nsize);
myfile.close();

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

0
जोड़ा
क्या आपको पढ़ने पर सीगफॉल्ट नहीं मिलेगा? आपने डेटा के लिए कोई स्थान आवंटित नहीं किया था। char somedata [10] होना चाहिए, है ना?
जोड़ा लेखक swdev, स्रोत
#include 
#include 
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......
}
0
जोड़ा
#include 
#include 
using namespace std;

int main() {
  ofstream file;
  file.open ("codebind.txt");
  file << "Please writr this text to a file.\n this text is written using C++\n";
  file.close();
  return 0;
}
0
जोड़ा
क्या आप इस कोड स्निपेट के प्रश्न का उत्तर कैसे/क्यों एक संक्षिप्त स्पष्टीकरण जोड़ सकते हैं?
जोड़ा लेखक mech, स्रोत
#include 

ifstream infile;
infile.open(**file path**);
while(!infile.eof())
{
   getline(infile,data);
}
infile.close();
0
जोड़ा
आपको कोड या टिप्पणियों के साथ या तो अपने उत्तर की व्याख्या करनी चाहिए ताकि अन्य लोग जो कुछ करने की कोशिश कर रहे हैं उसे समझ सकें।
जोड़ा लेखक Michael, स्रोत

उनके नक़्शे - कदम पर चलिए,

  1. फ़ाइल वर्ग तक पहुंचने के लिए शीर्षलेख फ़ाइलें या नाम स्थान शामिल करें।
  2. फ़ाइल क्लास ऑब्जेक्ट बनाएं अपने आईडीई प्लेटफार्म के आधार पर (यानी, CFile, QFile, fstream)।
  3. अब आप उस वर्ग विधियों को आसानी से किसी भी फ़ाइल को खोलने/पढ़ने/बंद/गेटलाइन या अन्य चीज़ों को ढूंढ सकते हैं।
  CFile/QFile/ifstream m_file;
m_file.Open (पथ, फ़ाइल खोलने के लिए अन्य पैरामीटर/मूड);
 

फ़ाइल पढ़ने के लिए आपको डेटा को सहेजने के लिए बफर या स्ट्रिंग बनाना होगा और आप उस चर को पढ़ने() विधि में पास कर सकते हैं।

0
जोड़ा