مدونة علم البرمجة والحاسوب
من حقك ان تتعلم اكثر

الملفات سي بلس بلس - C++ Files

في هذا الدرس سوف نتعرض لتخزين البيانات واسترجاعها من الملفات بالطبع مافائدة ادخال كم كبير من البيانات اذا لم نستطع تخزينها واسترجاعها ان اوامر الحفظ بالبرامج التي تستخدمها من اهم الاوامر التي تستخدمها وان امر فتح ملف ماهي الا عملية استرجاع لبيانات سبق حفظها بملف وهذا هو موضوعنا اليوم.
عندنا اليوم فئتين هامتين للعمليتين السابق ذكرهما ألا وهما الحفظ والاسترجاع وبالاضافة الى الفئتين سيكون بصحبتنا الملف fstream.h كرأس ملف للتعريفات الخاصة بالفئتين
الفئة الاولى ifstream
ستتولى هذه الفئة القراءة من الملفات اي عملية استرجاع البيانات او فتح الملفات
 
الفئة الثانية ofstream
ستتولى هذه الفئة الكتابة في الملفات اي عملية حفظ البيانات
 
ولنأخذ مثال للتوضيح
ifstream  MyFile (“mydata.txt”);

ولنرى طريقة صياغة الامر بالجدول المعتاد
الصيغة
الشرح
ifstream
اسم الفئة الخاصة بفتح الملفات
MyFile
بارامتر اختياري تختاره لاستدعاء دوال الفئة
(mydata.txt”);
بين قوسين وعلامتي اقتباس تضح اسم الملف المراد فتحه ولايغيب عنك انه يجب ان يكون ملف موجود على القرص
 
يستخدم البارامتر الاختياري لاستدعاء دوال الفئة سواء لفتح او اغلاق الملف وكل ملف يفتح سواء للكتابة او القراءة لابد ان يغلق بعد تمام العملية واذا نسيت ذلك فتأكد من ضياع بياناتك وهذا يحدث كثيرا عند اغلاق الكومبيوتر بغير الطريقه الصحيحة حينها تكون البرامج قد قامت بفتح ملفات ولم تغلقها لانك اغلقت الجهاز حينها تحدث اخطاء ويقوم نظام تشغيل الوندوز باستدعاء scandisk للتصحيح هذه المشكلة
 
MyFile.close();
البارامتر السابق تعريفه للفئة يقوم باستدعاء احد الدوال الهامه وهي دالة اغلاق الملف كما ذكرنا لك سابقا واليك مثال كامل لعمليات الحفظ والاسترجاع لتتضح الصورة امامك كاملة.
 
 
 
#include <fstream.h>
#include <iostream.h>


int main()
{
  char str[10];           
  ofstream svfile("example.txt");
  svfile<<"I want to save this line of data as an example";
  svfile.close();                          
             
  ifstream rdfile("example.txt");
  rdfile>>str;   
  cout<<str;  
  rdfile.close();   
}
تم الاعلان عن معاملين افتراضيين هما svfile ليعمل مع الفئة ofstream  لتخزين البيانات والمتمثلة تخزين العبارة I want to save this line of data as an example
بعد ذلك استخدم معامل الفئة لاغلاق الملف بالدالة close
  والمعامل الثاني rdfile ليعمل مع الفئة ifstream لقراءة البيانات من الملفات وبالتحديد الملف المذكور example.txt ثم تحميل البيانات الى متغير حرفي سبق الاعلان عنه واستخدام معامل الفئة لاغلاق الملف
 
المشكلة الواجب التنبيه عليها انه مع الفئة ofstream  واذكرك بأنها هي التي تحفظ الملفات ان الملف الذي اعطيتها اسمه اذا لم يكن موجود فسوف ينشأ اما اذا كان موجود فسوف يلغى مابداخله وهذه مشكله فربما انك تفتح ملف موجود وتريد اضافة بيانات له او تعديل بيانات فيه ولذلك يجب اعطاء وتمرير بارامترات للدالة المستخدمة كما يلي
 
Flag
Function
ios::app
Opens an output file for appending.
ios::ate
Opens an existing file (either input or output) and seeks the end.
ios::in
Opens an input file. Use ios::in as an open_mode for an ofstream file to prevent truncating an existing file.
ios::out
Opens an output file. When you use ios::out for an ofstream object without ios::app, ios::ate, or ios::in, ios::trunc is implied.
ios::nocreate
Opens a file only if it already exists; otherwise the operation fails.
ios::noreplace
Opens a file only if it does not exist; otherwise the operation fails.
ios::trunc
Opens a file and deletes the old file (if it already exists).
ios::binary
Opens a file in binary mode (default is text mode).


ifstream svfile("mydata.txt", ios::nocreate);
Read On

الملفات سي بلس بلس - C++ Files

في هذا الدرس سوف نتعرض لتخزين البيانات واسترجاعها من الملفات بالطبع مافائدة ادخال كم كبير من البيانات اذا لم نستطع تخزينها واسترجاعها ان اوامر الحفظ بالبرامج التي تستخدمها من اهم الاوامر التي تستخدمها وان امر فتح ملف ماهي الا عملية استرجاع لبيانات سبق حفظها بملف وهذا هو موضوعنا اليوم.
عندنا اليوم فئتين هامتين للعمليتين السابق ذكرهما ألا وهما الحفظ والاسترجاع وبالاضافة الى الفئتين سيكون بصحبتنا الملف fstream.h كرأس ملف للتعريفات الخاصة بالفئتين
الفئة الاولى ifstream
ستتولى هذه الفئة القراءة من الملفات اي عملية استرجاع البيانات او فتح الملفات
 
الفئة الثانية ofstream
ستتولى هذه الفئة الكتابة في الملفات اي عملية حفظ البيانات
 
ولنأخذ مثال للتوضيح
ifstream  MyFile (“mydata.txt”);

ولنرى طريقة صياغة الامر بالجدول المعتاد
الصيغة
الشرح
ifstream
اسم الفئة الخاصة بفتح الملفات
MyFile
بارامتر اختياري تختاره لاستدعاء دوال الفئة
(mydata.txt”);
بين قوسين وعلامتي اقتباس تضح اسم الملف المراد فتحه ولايغيب عنك انه يجب ان يكون ملف موجود على القرص
 
يستخدم البارامتر الاختياري لاستدعاء دوال الفئة سواء لفتح او اغلاق الملف وكل ملف يفتح سواء للكتابة او القراءة لابد ان يغلق بعد تمام العملية واذا نسيت ذلك فتأكد من ضياع بياناتك وهذا يحدث كثيرا عند اغلاق الكومبيوتر بغير الطريقه الصحيحة حينها تكون البرامج قد قامت بفتح ملفات ولم تغلقها لانك اغلقت الجهاز حينها تحدث اخطاء ويقوم نظام تشغيل الوندوز باستدعاء scandisk للتصحيح هذه المشكلة
 
MyFile.close();
البارامتر السابق تعريفه للفئة يقوم باستدعاء احد الدوال الهامه وهي دالة اغلاق الملف كما ذكرنا لك سابقا واليك مثال كامل لعمليات الحفظ والاسترجاع لتتضح الصورة امامك كاملة.
 
 
 
#include <fstream.h>
#include <iostream.h>


int main()
{
  char str[10];           
  ofstream svfile("example.txt");
  svfile<<"I want to save this line of data as an example";
  svfile.close();                          
             
  ifstream rdfile("example.txt");
  rdfile>>str;   
  cout<<str;  
  rdfile.close();   
}
تم الاعلان عن معاملين افتراضيين هما svfile ليعمل مع الفئة ofstream  لتخزين البيانات والمتمثلة تخزين العبارة I want to save this line of data as an example
بعد ذلك استخدم معامل الفئة لاغلاق الملف بالدالة close
  والمعامل الثاني rdfile ليعمل مع الفئة ifstream لقراءة البيانات من الملفات وبالتحديد الملف المذكور example.txt ثم تحميل البيانات الى متغير حرفي سبق الاعلان عنه واستخدام معامل الفئة لاغلاق الملف
 
المشكلة الواجب التنبيه عليها انه مع الفئة ofstream  واذكرك بأنها هي التي تحفظ الملفات ان الملف الذي اعطيتها اسمه اذا لم يكن موجود فسوف ينشأ اما اذا كان موجود فسوف يلغى مابداخله وهذه مشكله فربما انك تفتح ملف موجود وتريد اضافة بيانات له او تعديل بيانات فيه ولذلك يجب اعطاء وتمرير بارامترات للدالة المستخدمة كما يلي
 
Flag
Function
ios::app
Opens an output file for appending.
ios::ate
Opens an existing file (either input or output) and seeks the end.
ios::in
Opens an input file. Use ios::in as an open_mode for an ofstream file to prevent truncating an existing file.
ios::out
Opens an output file. When you use ios::out for an ofstream object without ios::app, ios::ate, or ios::in, ios::trunc is implied.
ios::nocreate
Opens a file only if it already exists; otherwise the operation fails.
ios::noreplace
Opens a file only if it does not exist; otherwise the operation fails.
ios::trunc
Opens a file and deletes the old file (if it already exists).
ios::binary
Opens a file in binary mode (default is text mode).


ifstream svfile("mydata.txt", ios::nocreate);
Read On

المتغيرات الحرفية سي بلس بلس - C++ Tutorial


لقد تحدثنا في الدرس السابق عن تخزين الحروف في مصفوفات وألان سوف نعيد ما قلناه بشئ من التفصيل لنأخذ مثال مشابه لما سبق تماما
char A[50];
سوف تتذكر الآن ماقلناه بأن المصفوفة السابقة تقوم بتخزين اسم او مجموعة حروف عددها 50 حرف شاملا المسافات التي بين الاسماء فعند ضغطك على قضيب المسافات يعتبر حرف ولكنه ليس له شكل لينتج المسافة بين الكلمات المهم ان المجموع 50 حرف تبدء المصفوفة من صفر الى 49 كما قلنا سابقا ان مصفوفات سي++ تبدء من صفر وليس من واحدد ولذلك الاعداد من صفر الى 49 هي 50 عدد وبالتالي عدد الحرف المخزنة هي 50 حرف كما سبق وطلبت وتم تلبية طلبك كل ذلك قلناه سابقا ولكن دعني اضيف بأن عدد الحروف التي سوف تدخلها سوف تكون 49 فقط وليس 50 لان سي++ تضيف في نهاية المتغير الحرف رقم 50 من عندها وهو الحرف \0 وهو يعني نهاية المتغير الحرفي ليعرف نظام التشغيل بأن هذه هي نهاية المتغير ولا يوجد شئ بعدها والرمز السابق يطلق عليه NULL character
وخلاصة القول ان تعلن عن المصفوفة بعدد يزيد بواحد عن سعتها المدخلة
لا تتضايق مما تفعلة سي++ من اضافة رمز على حسابك الخاص في نهاية المتغير انك تفعل ذلك وانا ايضا افعل ذلك فعند كتابة فقرة مكونة من حروف نضع نقطة في نهاية الكلام لنفيد القارئ بأن الكلام انتهى – أليس كذلك

استخدام المؤشرات للاعلان عن متغيرات الحروف
  يمكنك ايضا ان تعلن عن المتغير الحرفي باستخدام المؤشرات وهو درس كان يجب ان اشرحة ضمن الدروس السابقة ولكني رأيت ان اتركه للنهاية مع انه من المفترض ان يكون في البداية ولكن لصعوبته قليلا تلافيت وضع امثلة تحتوى مؤاشرات ما أمكن في البداية انتظارا لشرحة – يمكنك ان تعلن عن متغير حرفي بهذه الطريقة
char *A;
  وهذه طريقة اخرى للاعلان عن متغيرات حرفية تحتوي مميزات اكبر
 A = new char [50];
  ولنأخذ طريقة صياغة الامر السابق بجدولنا المعتاد

الصيغة
الشرح
A
اسم المصفوفة المفترض
=
لابد ان توضع لتون الصيغة صحيحة
New
من اوامر اللغة للاعلان عن متغير جديد
char
نوع المصفوفة (حروف)
[50];
قوسين بينهم سعة المصفوفة
 
والجديد في الصيغة السابقة هو انك بعد ان تنتهي من جميع العمليات الخاصة بالمصفوفة السابقة يمكن ان تلغيها ولذلك لتفريغ المساحة الخاصة بها من الذاكرة وهذه هي سي++ القوية جدا وذلك بالصيغة التالية
 
delete  [A] ;
ادخال المتغيرات الحرفية
  بالطبع ليس عندك مشكلة الآن في ادخال المتغيرات الحرفية باستخدام cin  ولكن لزم هنا التنويه بأن هذا الامر بالفعل سوف يدخل الحروف ولكنه سوف يتوقف عن الادخال عند الضغط على قضيب المسافة فلو انك تريد ادخال الاسم Mohamad Hasan الى متغير حرفي سوف يستقبل الاسم Mohamad  وعند ضغطك على قضيب المسافة لادخال بقية الاسم Hasan
حينها سوف يتوقف ولا يقبل الا الجزء الاول من الاسم وعليه استخدام احد عناصر فئة cin والفئات سوف نشرحها في درس قادم وهو
cin.getline (A,50,’\n’);
وصيغتة كما يلي
الصيغة
الشرح
cin.getline
الامر المشتق من cin
(
قوس احتواء البارامترات
A
اسم المصفوفة السابق الاعلان عنها
,
فاصلة بين بارامترين
50
طول او عدد الحروف المتوقع ادخالها
,
فاصلة بين بارامترين
‘\n’
معناه سطر جديد بعد المتغير ويمكنك اهمال هذا البارامتر
);
قوس نهاية احتواء البارامترات والفاصلة المنقوطة لانها ادخال الصيغة كلها
  مزيدا من الدوال التي تتعامل مع المتغيرات الحرفية
  انها عدد من الدوال للمقارنة بين الحروف والتعامل معها كما سيلي شرحه
char  Name1 [30] = “MOHAMAD HASAN”;
 char  Name2 [30] = “mohamad hasan”;
 int  L;
 L = strcmp (Name1 , Name2);
الدالة strcmp  تقارن بين متغيرين حرفيين مع الاخذ في الاعتبار حالة الحروف الصغيرة والكبيرة فالحرف A  بالنسبة لها غير الحرف a  وتعيد قيمة عدد صحيح يخزن في المتغير الصحيح L  كما يلي
 
القيمة المعادة
الشرح
اصغر من الصفر
عندما يكون الاسم الاول اصغر من الثاني
تساوي صفر
عندما يتساوى الاسمان
اكبر من الصفر
عندما يكون الاسم الاول اكبر من الثاني
 ربما يسأل احدكم سؤال ما معنى ان يكون اسم اكبر من اسم حيث ان اسم يساوي اسم هو شئ مفهوم اي تطبق الحروف فما معنى ان يكون اكبر او اصغر نعم ربما يهمك فقط عملية التساوى كأن تدخل كلمة سر يتم مقارنتها مع كلمة اخرى مخزنة داخل الحاسب للتعرف على الشخص  اما حالة ان يكون الاسم اكبر او اصغر فهي نادرة الاستخدام وتستخدم فقط في ترتيب الاسماء ابجديا ومعنى اكبر ان يكون ترتيب الحروف في جدول اسكي  للاسم الاكبر يلي ترتب الحروف للمتغير الاصغر .
في المثال السابق لن تكون قيمة L  تساوي صفر رغم ان الحروف واحدة للاسمين ولكن مرة حروف صغيرة ومرة حروف كبيرة ولكن هناك الدالة التالية التي لاتهتم بحالة الحروف

char  Name1 [30] = “MOHAMAD HASAN”;
 char  Name2 [30] = “mohamad hasan”;
 int  L;
 L = strcmpi (Name1 , Name2);

هذه الدالة strcmpi  سوف تعطي قيمة = صفر لان الاسمين متساويين وهي لاتهتم بحالة الحروف
الحاق متغير حرفي بآخر strcat
 
char  Name1 [30] = “Mohamad”;
 char  Name2 [30] = “Hasan”;
 int  L;
strcat (Name1 , Name2);
تقوم الدالة بالحاق الاسم الثاني بالاول ليصبح الاسم الثاني عبارة عن الاسمين مدموجين وتكون النتيجة ان المتغير الثاني Name2 بعد العملية السابقة يصبح حاملا القيمة
Mohamad Hasan
 
تحويل الحروف الصغيرة الى كبيرة strupr
 
char  Name [30] = “mohamad hasan”;
strupr (Name);
بعد العملية السابقة يتحول المتغير Name  الى MOHAMAD HASAN

تحويل الحروف الكبيرة الى صغيرة strlwr
 
char  Name [30] = “MOHAMAD HASAN”;
strlwr (Name);
 بعد العملية السابقة يتحول المتغير Name  الى mohamad hasan

قياس طول متغير حرفي strlen
char  Name [30] = “MOHAMAD HASAN”;
int L;
L = strlen (Name);
بعد العملية السابقة سيتم قياس طول المتغير الحرفي او عدد حروفه ويوضع كعدد بالمتغير L  حيث سبق الاعلان عنه كعدد صحيح
واليك مثال يشمل كل ما سبق شرحه
#include <iostream.h>   //For cout
#include <string.h>     //For many of the string functions
int main()
{
  char name[50];            //Declare variables
  char lastname[50];        //This could have been declared on the last line  
cout<<"Please enter your name: ";   //Tell the user what to do
  cin.getline(name, 50, '\n');      //Use gets to input strings with spaces
// or just to get strings after the user presses enter
 
  if(!strcmpi("Mohamad", name)) //The ! means not,strcmpi returns 0 for
  {                               //equal strings
    cout<<"That's my name too."<<endl; //Tell the userif its my name
 
  }
  else                              //else is used to keep it from always
    {                             //outputting this line
     cout<<"That's not my name." 
  }

   cout<<"What is your name in uppercase..."<<endl;
  strupr(name);                   //strupr converts the string to uppercase
  cout<<name<<endl;              
  cout<<"And, your name in lowercase..."<<endl;
  strlwr(name);                    //strlwr converts the string to lowercase
  cout<<name<<endl;
  cout<<"Your name is "<<strlen(name)<<" letters long"<<endl;  //strlen returns
//the length of the string
  cout<<"Enter your last name:";
  gets(lastname);               //lastname is also a string
  strcat(name, " ");              //We want to space the two names apart
  strcat(name, lastname);      //Now we put them together, we a space in
//the middle
  cout<<"Your full name is "<<name; //Outputting it all...
  return 0;

}
  
Read On

أرشيف المدونة الإلكترونية

من انا ؟