Files (reading /writing)

السلام عليكم الجميع

كل عام وانتم بخير و عيدكم سعيد يارب.

اليوم راح اشرح لكم عن files بعد ماحطيت لكم تحدي بالتويتر.

Files هو عباره عن انشاء الملف او قراءتها من جهازك بشكل مباشر.

و طبعآ يصير كأنك انت انشئت الملف او قرءت المحتوى في الملف الى موجود بجهازك

هذا مثال من جهازي مباشر انشئت الملف عن طريق terminal ليس عن طريق كود

الشرح:

كتبت nano الانشاء الملف ثم cat ليقرء لي المحتوى داخل الملف.

مثل ماتلاحظون تم انشاء الملف لاني عملت له انشاء وبنفس الوقت اقدر اقرء الملف عن طريق cat

المهم نكمل

ايش فايدته طيب:

له فوائد كثيره مثلآ في الالعاب زي العبة رزنت ايفل 3

لما تخلي الاعب او character يروح يعمل حفظ التخزين

اثناء حفظ التخزين راح يعمل نسخه الى الهارديسك او مكان للحفظ بحيث بعدين ترجع له عن طريق load the game 🙂 و الملف التخزين راح تلقاه موجود بالملفات خاصة بالتخزين

زي في بلاي ستيشن saving data او بالبي سي غالبآ تلقاه في documents

والملف هذا راح يكون محفوظ كل شي بالعبة زي الاسلحة و الادوات و المكان الى وصلته الى الخ…

طيب هل يمديني اسوي كذا؟

ايوه يمديك تسوي نفسه او اي لعبه كانت لانه هذي احد الطرق يخليك تحفظ العبه بحيث انك ترجع لها بعدين. افرض انك حذفت الملف التخزين العبة ايش راح يصير؟ اكيد راح تفقدها ولا تقدر ترجع لها ابدآ.

ملاحظة: ملفات تخزين تبع بلاي ستيشن او البي سي مشفره.

المهم نرجع الدرس:

عندنا ثلاث ادوات نحتاجها:

ofstream

يعمل أنشاء و كتابة المحتوى داخل الملف.

ifstream

يقرء المحتوى داخل الملف بشكل مباشر.

fstream

مكتبة الانشاء الملفات بحيث تقدر تعمل قراءه او كتابة المحتوى داخل الملف.

طيب خلونا نبدء بالنوعين الانشاء والقراءة المحتوى بالملف.

نوع الثالث fstream اجباري نحطه فوق including


قبل مانبدء في حال ماتعرف وين مكان الملف لما ينشئ:

  • اذا كنت تستخدم Windows او Mac راح تحصل الملف موجود داخل project تبعك الحالي
  • اذا كنت تستخدم Linux راح تحصل الملف موجود في مجلدات Home

ofstream : أنشاء او كتابة المحتوى داخل الملف.

طريقة الشرح: راح يكون كود ثم شرح تمام:

خلونا نبدء بالبداية:

#include <fstream>
 //declare fstream library

اول شئ لاتنسى المكتبة fstream هذي ضروري جدآ قبل نبدء

string line; 
//declare string variable

cout<<"please write the note you want to keep it here"<<endl; 
getline(cin,line);
//getline accept space with words

string line : نضع هذا المتغير من نوع string بحيث نكتب كتابات المحتوى داخل الملف بشكل مباشر بدون اي مشاكل

cout: يظهر المستخدم بحيث يكتب كتابات الى يريد حفظها داخل الملف

getline: هذا اهم شي لاتنساه بسبب cin الوحدها راح يقبل كلمة واحد فقط ولكن getline راح يقبل كلمات مع المسافات بدون اي مشاكل.

ofstream readme;
//ofstream: create and write in files

ofstream: ادوات يعطيك سماح الكتابة المحتوى داخل الملف

readme: هذا اسم متغير تقدر تحط اي اسم اخر مو شرط يكون هذا لانه مثل ماقلت هذا اسم متغير تابعه ofstream بسبب اننا راح نستخدمها مستقبلآ.

readme.open("blogs.txt");
//open: it creates file.

readme.open: هذي الدالة تفتح الملف مثل ماتلاحظ حطينا اسم المتغير مع الدالة open

بحيث تفتح لك الملف الى تريد تحفظ الكلمات المحتوى فيها.

مع الملاحظة: بين (” “) تستطيع تكتب اي اسم ملف اين كان ولكن لاتنسى (” “) وايضآ لاتنسى تكتب نوع صيغة الملف .txt

اذا كنت تريد المستخدم يضع اسم الملف من عنده بدلآ مايكون افتراضيآ

تستطيع عمل متغير جديد و تسئل المستخدم يدخل اسم الملف بدون اي مشاكل.

هذا مثال:

cout<<"Enter new filename: "<<endl; 
 cin>>filename;
readME.open(filename+".txt");

تلاحظ هنا وضعنا cout بحيث يسئل المستخدم ان يدخل اسم الملف جديد

وبعد الادخال راح يكون المتغير filename موجود به قيمة المدخله من قبل المستخدم.

بعدها في open نحط اسم المتغير مع الزائد

ملاحظه: في نوع string نستطيع نضع الزائد ولكن هذي ليس علامة الرياضيات مثل 1+1

هذا مختلف لانه لو عملنا filename متغير و القيمة راح تكون “blog”

بعدها نضع + ثم نوع الصيغة الملف .txt ولاتنسى النقطة مهمة جدآ لانها صيغة الملف

لما نجي نطبع راح يطلع لك كذا “blog.txt”

هذا مثال بالصوره:

نرجع نكمل

readme<<line<<endl; 
//gets input from user.

readme<<line: هنا نستخدم المتغير تبع الملف بدال cout

لانه هنا اي شي يتم كتابتها من قبل المستخدم في المتغير line راح ينكتب داخل الملف بشكل مباشر.

readme.close();
//close: close the file after write and
//clean up unnecessary memory space;

readme.close: بالنهاية بعد كتابة داخل المحتوى نريد نغلق الملف بنجاح بحيث مانترك اي مسافه فاضية بالذاكرة.

بعد مانتهينا نحفظ الكود ونعمل Run و بعد كتابة المحتوى وضغط على انتر راح يتم انشاء ملف في جهازك بنجاح 🙂

هذا مثال عملي مع الكود:

int main(){
string line; 
//declare string variable

cout<<"please write"<<endl; 
getline(cin,line);
//getline accept space with words

ofstream readme;
//ofstream: create and write in files

readme.open("blogs.txt");
//open: it creates file.
readme<<line<<endl; 
//gets input from user.
readme.close();
//close: close the file after write and
//clean up unnecessary memory space;

}
write files

هنا انتهينا الحمدالله وتم انشاء الملف بنجاح :).

وننتقل الدرس الى بعده الى هو قراءة المحتوى داخل الملف…..


ifstream: قراءة المحتوى داخل الملف.

راح اعمل نفس الطريقة فوق كود ثم شرح.

char num;
//varible character.

char num: نحتاجها بسبب نريد عمل لها شروط بحيث الملف أذا يوجد به معلومات num راح يقرءها و راح اشرحها بعدين.

ifstream input;
//ifstream to read a file.

ifstream: لقراءة الملف مع اسم المتغير input تبع قراءة الملف خاصة به

مثل ماقلنا نقدر نسمي اي متغير مو شرط input قد يكون readme مثل ماشرحنا قبل 🙂

ولكن نحتاج نضع له اسم متغير خاص به بحيث نستطيع نقرء المحتوى داخل الملف.

input.open("blogs.txt");
//open: file is opend 
// ready to read.

open(): مثل مره السابقه فتحنا اسم الملف ويجب يكون اسم الملف صحيح و موجود مسبقآ

ونقدر نعمل شروط اذا كان ملف موجود بالجهاز او لا

مثلآ زي هذا الكود:

input.open(filename + ".txt");
    if(input.fail()){
        cout<<"is not exist, try again "<<endl;
 exit();
    }

هنا الشرط يكون اذا اسم الملف موجود لن يخرج البرنامج واذا كان خطأ وغير موجود سوف يخرج البرنامج او يخبرك اعد المحاولة الملف غير موجود…

نكمل…..

while (! input.eof()){

input.get(num);

cout<<num; 

}
//check if file has data true
// otherwise false.

مثل ماوضحت اني احتاج num كانوع متغير اخر يكون متواجد بالشرط اذا كان معلومات او المحتوى داخل الملف موجود سوف يقرء الملف معناه TRUE

اذا لايوجد اي محتوى داخل الملف معناه FALSE اي يخرجك من برنامج او يخبرك لايحتوي على اي معلومات داخل الملف.

input.close();
//close file.

مثل المره السابقه نحتاج نغلق الملف بعد انتهاء منه لتجنب من ترك المساحات او اشياء غير ضروريه بالذاكره.

هذا تطبيق عملي مع الكود:

int main (){
char num;
//varible character.

ifstream input;
//ifstream to read a file.

input.open("blogs.txt");
//open: file is opend 
// ready to read.

while (! input.eof()){

input.get(num);

cout<<num; 

}
//check if file has data true
// otherwise false.

input.close();
//close file.
}
Read a file

هنا انتهينا من الدرس Read and Write in files


و النسبه التحدي الى كتبته بالتويتر قبل كم يوم:

هذا الحل الى عملته انا بالتحدي و الشرح تحتها ايش عملت بضبط:

#include <iostream>
#include <fstream>
#include <string>
using namespace std; 
void menu();
void write();
void read();
int main (){

menu();
// create();
// read();
}

void menu(){
    system("clear"); //for linux
    int menu;
    cout<<"This is write and read files"<<endl
        <<"all you have to do is select the menu"<<endl
        <<"If you want to create a file (write) <1>"<<endl
        <<"if you want to read a file (Read)    <2>"<<endl
        <<"Exit? <0>"<<endl;

    cin>>menu;
    switch(menu){
        case 1:
        write();
        break;
        case 2:
        read();
        break;
        case 0:
        cout<<"exitting..."<<endl; 
        exit(0);
        break;
        default:
        cout<<"Error input"<<endl;
        exit(0);
        
    }

}


void write(){
system("clear"); //for linux
    ofstream readME;
    string filename, lines;
    cout<<"Please write whatever you want and click Enter: "<<endl; 
    cin>>lines;
    getline(cin,lines);
    
    cout<<"Enter new filename: "<<endl; 
    cin>>filename;
    
    readME.open(filename+".txt");
    readME<<lines<<endl; 
    readME.close();

    char ch = 'y'; 

    cout<<"Do you want to return to menu <y/n>"<<endl; 
    cin>>ch;

    if((ch == 'y') || (ch == 'Y')){
        menu();
    }else
    {
        cout<<"Thanks for your time :)"<<endl;
        exit(0);
    }
    
}

void read(){
    system("clear"); //for linux
    ifstream input; 
    char num; 
    string filename;
    cout<<"Please enter filename you want to read it"<<endl;
    cin>>filename;
    input.open(filename + ".txt");
    if(input.fail()){
        cout<<"is not exist, try again "<<endl;
        read();
    }
    
    while(!input.eof()){
        input.get(num);
        cout<<num;
    }
    input.close();

    char ch = 'y'; 

    cout<<"Do you want to return to menu <y/n>"<<endl; 
    cin>>ch;

    if((ch == 'y') || (ch == 'Y')){
        menu();
    }else
    {
        cout<<"Thanks for your time :)"<<endl;
        exit(0);
    }
}

طبعآ تم استخدام ثلاث دوال داخل الكود

  • دالة الاختيارات
  • دالة القراءة
  • دالة الكتابة

كل دالة لها غرض خاصة بها و سبب استخدام الدوال بحيث اقدر استدعي الدالة اكثر من مره عن طريق function call

وسبب اخر اني استخدمت الدوال يسهل علي استخدام Function call اكثر من مرره حتى في الشروط.

هنا انتهينا. الحمدالله.

اذا شفت ملاحظة او شي مافهمته اكتب بالتعليق تحت وراح ارد عليك أن شاء الله .

أشوفكم على خير.

الى اللقاء اخر :).