سؤال

أريد فتح ملف للقراءة ، C++ الطريق.أنا بحاجة إلى أن تكون قادرة على القيام بذلك من أجل:

  • ملفات نصية, التي من شأنها أن تنطوي على نوع من قراءة وظيفة خط.

  • الملفات الثنائية ، والتي من شأنها أن توفر وسيلة لقراءة البيانات الخام إلى char* العازلة.

هل كانت مفيدة؟

المحلول

هناك ثلاث طرق للقيام بذلك ، اعتمادا على الاحتياجات الخاصة بك.هل يمكن استخدام المدرسة القديمة ج طريقة استدعاء الدالة fopen/fread/fclose أو يمكنك استخدام C++ fstream المرافق (ifstream/ofstream) ، أو إذا كنت تستخدم MFC استخدام CFile الدرجة التي توفر وظائف لإنجاز الفعلية عمليات الملف.

كل هذه هي مناسبة لكلا النص الثنائية ، على الرغم من لا شيء محدد readline وظائف.ما كنت على الأرجح تفعل بدلا من ذلك في هذه الحالة هو استخدام fstream الطبقات (fstream.ح) واستخدام تيار المشغلين (<< و >>) أو وظيفة القراءة إلى القراءة/الكتابة كتل من النص:

int nsize = 10;
char *somedata;
ifstream myfile;
myfile.open("<path to file>");
myfile.read(somedata,nsize);
myfile.close();

لاحظ أنه إذا كنت تستخدم Visual Studio 2005 أو أعلى التقليدية fstream قد لا تكون متاحة (هناك جديد Microsoft التنفيذ ، والتي هي مختلفة قليلا ، ولكن يحقق نفس الشيء).

نصائح أخرى

تحتاج إلى استخدام 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() وظيفة (إنها العالمي) لقراءة كامل خط.

لفتح و قراءة ملف نصي سطر في كل سطر ، يمكنك استخدام الإجراءات التالية:

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

لفتح و قراءة ملف ثنائي عليك أن تعلن صراحة القراءة تنسيق في تيار الإدخال إلى الثنائية ، قراءة الذاكرة التي لا يوجد لديه صريحة التفسير باستخدام تيار وظيفة عضو 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);

عند القيام بذلك سوف تحتاج إلى #include الرأس : <iostream>

#include <iostream>
#include <fstream>
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;
}
#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......
}

اتبع الخطوات ،

  1. تشمل الملفات رأس أو اسم الفضاء للوصول إلى الملف الدرجة.
  2. جعل ملف كائن الفئة اعتمادا على IDE منصة ( أنا.ه ، CFile,QFile,fstream).
  3. الآن يمكنك بسهولة العثور على تلك الفئة طرق لفتح/قراءة/إغلاق/getline أو آخر من أي ملف.
CFile/QFile/ifstream m_file;
m_file.Open(path,Other parameter/mood to open file);

لقراءة الملف لديك لجعل العازلة أو سلسلة لحفظ البيانات و يمكنك تمرير هذا المتغير في طريقة قراءة ().

**#include<fstream> //to use file
#include<string>  //to use getline
using namespace std;
int main(){
ifstream file;
string str;
file.open("path the file" , ios::binary | ios::in);
while(true){
   getline(file , str);
   if(file.fail())
       break;
   cout<<str;
}
}**
#include <fstream>

ifstream infile;
infile.open(**file path**);
while(!infile.eof())
{
   getline(infile,data);
}
infile.close();

fstream كبيرة ولكن سوف نذهب أعمق قليلا و اقول لكم عن RAII.

المشكلة مع والمثال الكلاسيكي هو أن كنت اضطر إلى إغلاق الملف من قبل نفسك ، وهذا يعني أنه سيكون لديك لثني العمارة إلى هذه الحاجة.RAII يجعل من استخدام التلقائي المدمر الدعوة في C++ لإغلاق الملف لك.

التحديث:يبدو أن الأمراض المنقولة جنسيا::fstream بالفعل بتنفيذ RAII حتى البرمجية أدناه لا طائل منه.سوف تبقى هنا من أجل الأجيال القادمة و كمثال على 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, "<path to file>");
myfile.read(somedata,nsize);
// myfile is closed automatically when opener destructor is called

تعلم كيف RAII الأعمال يمكن أن توفر لك بعض الصداع وبعض الرئيسية إدارة الذاكرة البق.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top