الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

برنامج سي++ للتعامل مع الملفات النصية

مغلق
بدأه medow20012000 في 31 يوليو 2005 · 11 رد · 1,252 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

هذا عباره عن مشروع قبول وتسجيل أي ادخال واخراج اسماء الطلاب

#include <iostream.h>
#include <process.h>
#include <fstream.h>
struct student
{
	long ID;
	char name[30];
	long avg;
};
int index=-1;
student st[10];
fstream student_file;
void add (student st[])
{
	cout<<"ENTER THE (ID) OF THE STUDENT  :";
    cin>>st[index].ID;
	cin.ignore();
	cout<<"ENTER THE (NAME)OF THE STUDENT  :";
	cin.getline(st[index].name ,30);
	cout<<"ENTER THE (AVRGE) OF THE STUDENT  : ";
	cin>>st[index].avg;
	cin.ignore();
	index ++;
}
void delete_information(student st[])
{
	long k;
	cout<<"ENTER THE (ID),please:";
  cin>>k;
	for(int d=-1;d<=index;d++)
  if (st[d].ID==k)
  {
 	 st[d].ID=0;
 	 cout<<"THE INFORMATION OF THE STUDENT IS(DELETED)..."<<endl;
  }
}
void re_write (student st[])
{
	long h;
	cout<<"ENTER THE (ID),please  :";
	cin>>h;
	for(int j=-1;j<=index;j++)
  if (st[j].ID==h)
  {
 	 cout<<"ENTER THE (ID) OF THE STUDENT :";
 	 cin>>st[j].ID;
 	 cin.ignore();
 	 cout<<"ENTER THE (NAME) OF THE STUDENT:";
 	 cin.getline(st[j].name ,30);
 	 cout<<"ENTER THE (AVRGE) OF THE STUDENT:";
 	 cin>>st[j].avg;
 	 cin.ignore();
  }
}
void search (student st[])
{
	long n;
	cout<<"ENTER THE (ID),please  :";
	cin>>n;
	cin.ignore();
	for (int P=-1;P<=index;P++)
  if (st[P].ID==n)
  {
 	 cout<<"THE STUDENT (ID) :"<<st[P].ID<<endl;
      cout<<"THE STUDENT (NAME) :"<<st[P].name<<endl;
            cout<<"THE STUDENT (AVRGE) :"<<st[P].avg<<endl;
  }
  cin.get();
}
void read (student st[])
{
  for (int g=-1;g<=index;g++)
  {
 	 if (st[g].ID!=0)
 	 {
 	 cout<<"THE STUDENT (ID) :"<<st[g].ID<<endl;
      cout<<"THE STUDENT (NAME) :"<<st[g].name<<endl;
            cout<<"THE STUDENT (AVRGE) :"<<st[g].avg<<endl;
 	 }
  }
	//	cin.get();
}
void save (student st[])// to save on file 
{
	student_file.open("student.dat",ios::out|ios::binary);
	for (int i=0;i<=index;i++)
	{
  if (st.ID !=0)
  student_file.write((char*)&st,sizeof(st));
	}
	student_file.close();
}
void start_reading (student st[])// to read from file 
{
	student_file.open("student.dat",ios::in|ios::binary);
index++;
student_file.read((char*)&st[index],sizeof(st[index]));
while(!student_file.eof())
{
	index++;
student_file.read((char*)&st[index],sizeof(st[index]));
}

student_file.close();
}
void main()
{                     // begin main program
	start_reading(st);
long selector;
do
{
	system("cls");
	cout<<"1- ENTER TO (ADD) THE STUDENT INFORMATION..."<<endl;
    cout<<"2- ENTER TO (DELETE) THE STUDENT INFORMATION..."<<endl;
	cout<<"3- ENTER TO (RE-WRITE) THE STUDENT INFORMATION..."<<endl;
	cout<<"4- ENTER TO (SEARCH) THE STUDENT INFORMATION..."<<endl;
	cout<<"5- ENTER TO (READ) THE STUDENT INFORMATION..."<<endl;
	cout<<"6- ENTER TO (EXIT) THE STUDENT INFORMATION..."<<endl;
	cout<<endl;
	cout<<"*** ENTER YOUR CHOOSE ,PLEASE :"<<endl;
	cin>>selector;
	cin.ignore(); 
	switch(selector)
	{

	case 1:
	cout<<endl;
	cout<<"To (add)the student information ..."<<endl;
	add(st);
	break;

	case 2:
  cout<<endl;
  cout<<"to(DELETE) THE STUDENT INFORMATION ..."<<endl;
  delete_information(st);
  break;
	case 3:
  cout<<endl;
  cout <<"TO (RE_WRITE) THE STUDENT TNFORMATION..."<<endl;
  re_write (st);
  break;
	case 4:
  cout<<endl;
  cout<<"TO(SEARCH)ABOUT STUDENT INFORMATION..."<<endl;
  search(st);
  break;
	case 5:
  cout <<endl;
  cout<<"TO (READ) the students information ..." << endl;
  break;

	case 6: 
     save (st);

  break;

defult: 
  cout<<" your choose is wrong"<<endl;
  cout<<" try again, please" << endl;
  break;
}
}while (selector!=6);

} // end main program

المطلوب : اللي ماعرفت اسويه

ابغى اسوي سورت اي ترتيب عن طريق ادخال رقم الطلاب ويرتبهم ابجدي (ولكن يرتب كل الملف تاع الطالب وليس الاسم فقط )(اي باستخدام المؤشرات )

والثاني : في الكود عند فتح الملف مكتوب binary

student_file.open("student.dat",ios::in|ios::binary);

اي ان البيانات التي ستحفظ في داخل الملف من نوع اولي اي ستحفظ مشفرة (ممكن)

الثالث : لايعمل الاختيار الذي يعرض بيانات الطالب ...لماذا؟

وشكرا....

ابو رواد .. فلسطين ... جامعة الاقصى

تم تعديل هذه المشاركة بواسطة أحمد الشنقيطي في 28 يونيو 2012 في 02:20 — السبب: تعديل العنوان.

#2

اخي هل تستخدم

ftell(pointer) or fread and fseek and rewind(ponter ) tell me?

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

حيث اننا نتعامل مع byts

لذالك يجب استخدامها للترتيب

ملاحظه: انا استطيع ان اساعدك لو كنت تكتب البرنامج بلغه السي

#3

بسم الله الرحمن الرحيم

أخى فكرتك جميلة أنك عامل data file يتم تخزين فية البيانات اللى يدخلها المستخدم

أما عند عمل DELETE يتم عمل الID =0 ودة جميل

بس قبل ان احل لك المشكلة بتاعتك

أولا دة ممكن يسبب أستهلاك كبيير جدا وضخم للرام

والحل أستخدم الindex file

يعنى file جديد يوجد بة رقم الطالب وflag بيساوى 1 او 0

يعنى لو كان الflag=1 يبقى الملف موجود أما اذا كان بيساوى صفر يبقى الملف معمول لة DELETE ودة أفضل من طريقة اللى انت شغال بيها علشان كل شغلك هيبقى ب index file يعنى الrecord الواحد الموجود فى الindex file يوجد بة رقم الطالب والflag وindex يشاور على بيانات الطالب فى الdata file

أما الdata file سيوجد بها جميع البيانات الخاصة بالطالب

من حيث رقمة واسمة وعنوانة والايميل وهكذا

السبب فى انشأ index file أبسط بكتييييييير

يعنى اى منهما اسهل فى التعامل معة وعمل sort لة

هل الdata file اللى كل حجم record فية كبييير جدا

أم الindex file اللى حجم كل record فية صغير وأبسط منة

طب لو عملت sort للindex file عن طريق الID

وجيت أقراء الData file سيتم قرائتة عن طريق الindex file وبما ان الindexfile مرتب وبة عنوان الrecord الموجود فى الdata file وبالتالى سيحس المستخدم بأن الdata file هوة اللى مرتب

ودى طريقة أفضل ولو حبيت اى مساعدة فى أحنا موجودين

أما بالنسبة لسؤالك انت عاوز تعمل sort

أولا هحمل الrecord فى array ثم هرتب الarray على حسب الID

لاحظ ذلك الكود

/****************************************************************************************/
void Library::sortindexfile()
{
        int o,j;
    IndexFile.open("INDEXFILE.txt",ios::out|ios::in);
   // DB.open("allam.txt",ios::in);
   // IndexName.open("INDEXNAEME.txt",ios::out|ios::trunc);
    int NumOfRec;
 IndexFile.seekg(0,ios::end);
 NumOfRec=int(IndexFile.tellg())/sizeof(i);
  indexfile *ptr=new indexfile[NumOfRec];
  IndexFile.seekg(0,ios::beg);
  IndexFile.seekp(0,ios::beg);
  for(o=0;o<NumOfRec;o++)  { IndexFile.read((char*)&i,sizeof(i));  if(i.flag==1) {ptr[o]=i;} }
  for(o=0;o<NumOfRec;o++)
   {
     for(j=o+1;j<NumOfRec;j++)
      {
        if(   (ptr[o].isbN>ptr[j].isbN)    && (i.flag==1))
         {
            tmp=ptr[j];
            ptr[j]=ptr[o];
            ptr[o]=tmp;
         }
      }
   }
     IndexFile.close();
     IndexFile.open("INDEXFILE.txt",ios::out|ios::trunc);
 if(!IndexFile)
    {
     cout<<"Can't Open Data File";
     getch();
     IndexFile.close();
     //IndexFile.close();
     back();
    }
   IndexFile.seekp(0,ios::beg);
 for(int s=0;s<NumOfRec;s++)
    {
       // DB.seekg(ptr.num,ios::beg);
       // DB.read(reinterpret_cast<char*>(&l),sizeof(l));
      //  strcpy(index2.Publisher,l.PublisherName);
      //  strcpy(index2.BOOKNAME,l.BookName);
      //  IndexFile.seekp(0,ios::end);
     // index2.N=IndexFile.tellp();
     IndexFile.write(reinterpret_cast<char*>(&ptr),sizeof(ptr));
    // IndexName.write(reinterpret_cast<char*>(&index2),sizeof(index2));
    }
   /* for(o=0;o<NumOfRec;o++)
   {  if( i.flag==1){
    cout<<ptr[o].num<<"\t";
   cout<<ptr[o].isbN<<"\t";
   cout<<ptr[o].flag<<"\n";
   }   }   */
     IndexFile.close();
          //IndexName.close();
          //DB.close();
     delete []ptr;
}
/****************************************************************************************/

الاشياء اللى معمول comment ماتشغلش بالك بيها <_<

خلى بالك الكود السابق دة ماشى بأستخدام الindex file

الجمل المشروحة هى التى تستخدمها فى برنامجك

أفترض ان اسم الملف عندى اسمة IndexFile ودة المراد عمل sort لة

IndexFile.open("INDEXFILE.txt",ios::out|ios::in);

فى بداية الامر فتحت الملف للقراءة منة والكتابة بس

كتابة علشان يرتب ويحفظ على القديم يعنى يعمل override

int NumOfRec;

عرفت متغير علشان هجيب فية حجم الملف المراد تريبة وسيكون حجم الarray بحجم الملف

IndexFile.seekg(0,ios::end);

وديت الcurrent cursor الى أخر الملف حتى اجيب حجمة الفعلى عن طريق دالة تسمى seekg

Ios::end معناها روح للنهاية أما الصفر مش فاكرة بس غالبا أول argument يتم وضعة بصفر

طب علشان اجيب حجم الملف يبقى عن طريق دالة تسمى tellg وأقسم الرقم الراجع منها على حجم الrecord واحد كما فى السطر التالى

NumOfRec=int(IndexFile.tellg())/sizeof(i);
حيث الi   is instance from struct

ثم بعد كدة هبدأ أعرف الarray وتكون تعريفها بالمعامل new وأيضا يكون حجمها هو NumOfRec كما موضح فى ذلك السطر

indexfile *ptr=new indexfile[NumOfRec];

ثم بعد ذلك هبدأ أودى الcurrent cursor الى البداية الملف علشان أبدأ أحمل record record فى الarray

كما موضح فى ذلك السطر

IndexFile.seekg(0,ios::beg);
Ios::beg روح لبداية الملف

ثم دلوقتى همشى بلوووب واقراء سجل سجل واحطة فى الarray كما موضح

  for(o=0;o<NumOfRec;o++)  { IndexFile.read((char*)&i,sizeof(i)); ptr[o]=i;}

وبكدة حملت الملف كلة فى الarray

ولو انت هتمشى على طريقة أستخدام indexfile هتحط

Condition

Condition 
if(i.flag==1) {ptr[o]=i;} }

يعنى لو كان الflag بواحد يعنى الملف لسة ماتعملش لة delete يبقى حطة فى الarray

ثم بعد ذلك أستخدم اى algorithm من بتوع الsort

وأرتب الarray

كما موضح

for(o=0;o<NumOfRec;o++)    {      for(j=o+1;j<NumOfRec;j++)       {         if(   (ptr[o].isbN>ptr[j].isbN)    && (i.flag==1))          {             tmp=ptr[j];             ptr[j]=ptr[o];             ptr[o]=tmp;          }       }    }

حيث يتم ترتيب الarray على حسب الID

وبكدة يبقى أنا رتبت الملف

ثم بعد كدة أقفل الملف

IndexFile.close();

ثم أفتحة مرة اخرى واعمل فية override أو لازم يكون truncate يعنى لو الملف مش موجود من اساسة طلع خطأ

     IndexFile.open("INDEXFILE.txt",ios::out|ios::trunc);

if(!IndexFile)
    {
     cout<<"Can't Open Data File";
     getch();
     IndexFile.close();
     //IndexFile.close();
     back();
    }

والكود السابق دة علشان لو اى خطأ يقفل الملف ويطلع رسالة ويخرج من البرنامج

ثم بعد ذلك أودى الcurrent cursor للبداية كما هو موضح

IndexFile.seekp(0,ios::beg);

ثم أخر حاجة ابدأ فى الكتابة ف الملف

for(int s=0;s<NumOfRec;s++)
    {
IndexFile.write(reinterpret_cast<char*>(&ptr),sizeof(ptr));
     

    }

اكتب عن طريق دالة write كما موضح سابقا

ثم فى الاخر أقفل الملف

IndexFile.close();

وبعد كدة أعمل delete to ptr for free space which was allocated

 delete []ptr;

يارب أكون وضحتلك حل تلك المشكلة

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#4

أما عن سؤالك الثانى فالذى يحفظ binary هوint علشان ان الint عبارة عن 4byte وبالتالى ممكن الرقم اللى انت دخلتة لا يكون كامل اى لا يمثل فى اربعة بايت بل اقل وبالتالى

يتم تشفيرة حاول ان تفتح اى exe مكتوب تحت الdos ستجد ان الاسماء الموجودة بة ليست مشفرة ولكن الباقى مشفر لان الاغلب يكون ارقام

والله أعلم

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#5

شكرا على هذا التوضيح

وان شاء الله باجربه وباطلعك على اخر الاخبار

بس فاضل السؤال الثالث ....

وشكرا

ابو رواد

#6

ما شاء الله

اللهم لاحسد

أضاعوني وأي فتى أضاعـوا * * * ليـوم كــريهـة وســـداد ثغــــر

وخـــــلونـي ومعتـرك المنايـا * * * وقد شـــرعوا أسنــتهم لنحـري

كأني لم أكــــــن فيهـم وسيطـا * * * ولم تك نســبتي في آل عمــرو

أجرر في الجـــوامع كـل يـوم * * * ألا لله مظــــلمتـي وهـصـــري

عسى الملك المجيب لمن دعاه * * * سينجيني فيعلم كيــف شكـري

فأجـــزي بالكرامـة أهـل ودي * * * وأجزي بالضـغينة أهل ضري

منتديات الرياضيات العربية

#7

شكرا لك يارومانوف على اطلاعكم ...

ابو رواد-فلسطين

#8

السؤال الثالث يانااااااااااااااس

#9

انت عاوز تعرض بيانات الطلبة كلهم ولا طالب محدد ولا عاوز تعمل استعلام عن طالب(يعنى لو الطالب لة اكتر من سجل يطلعهم كلهم)؟؟؟

حدد انت عاوز اية ياأخى علشان أقدر أساعدك

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#10

هفترض انك عاوز تطبع كل اللى فى الملف

دة كود الدالة

void Library::Diplay()
{
IndexFile.open("INDEXFILE.txt",ios::in|ios::binary);
 if(!IndexFile)
    {
     cout<<"Can't Open  File";
     DB.close();
     IndexFile.close();
     getch();
     back();
    }

 DB.open("allam.txt", ios::in|ios::binary);
 if(!DB)
    {
     cout<<"Can't Open  File";
     DB.close();
     DB.close();
     getch();
     back();
    }
 while(1)
    {
        clrscr();
         DB.seekg(i.num,ios::beg);
         DB.read(reinterpret_cast<char*>(&l),sizeof(l));
          if(DB.eof())
        break;
        if(i.flag==1)
        {

    cout<<"the isbn is:\t\t"<<l.isbn<<"\n";
     cout<<"the book name:\t\t"<<l.BookName<<"\n";
     cout<<"the publisher name is:\t\t"<<l.PublisherName<<"\n";
     cout<<"the author name is:\t\t"<<l.AuthorName<<"\n";
     cout<<"the num of copies is:\t\t"<<l.NumOfCopies<<"\n";
      cout<< "\n\n\n";
     cout<< i.num<<"\t";
     cout<< i.isbN<<"\n";
     getch();
        }

    }

 DB.close();
 IndexFile.close();

 back();
}


/****************************************************************************************/

الشرح الدالة المستخدمة

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

أدخل فى لوووب نهائية علشان يقراء كل حاجة داخل الملف

هيطلع فى حالة لما يوصل لنهاية الملف

DB.open("allam.txt", ios::in|ios::binary);
 if(!DB)
    {
     cout<<"Can't Open  File";
     DB.close();
     DB.close();
     getch();
     back();
    }

فى الكود السابق فتحت الملف وكان مهيأ بالbinary للقراءة فقط (in )

ثم أختبرت هل لو فى اى خطأ طلع رسالة وماتفتحش باقى الملفات

الكود التالى ماشى بنظام الindex file وبما انك لست ماشى بتلك الطريقة فيتم تجاهل بعض الاكواد التى معمول عليها comment

while(1)
    {
        clrscr();
         DB.seekg(i.num,ios::beg);
         DB.read(reinterpret_cast<char*>(&l),sizeof(l));
          if(DB.eof())
        break;

دخلت داخل اللوب

خليتة يعمل clrscr() يعنى كل سجل يطلع فى صفحة جديدة

وجهت الcurrent cursor للبداية (للتأكد انا معرفش هوة واقف فين ف الملف)

ثم بدائت أقراء عن طريق دالة read

ثم DB.eof() هل الملف وصل للاخر لو وصل أعمل break يعنى أقف وأطلع من الوب اللى موجودة

if(i.flag==1)
        {

دة أختبار للشرط أذا كان الflag==1 يبقى الملف لم يتم عمل delete

لو كان بواحد أطبع البيانات بتاعتة عن طريق

    cout<<"the isbn is:\t\t"<<l.isbn<<"\n";
     cout<<"the book name:\t\t"<<l.BookName<<"\n";
     cout<<"the publisher name is:\t\t"<<l.PublisherName<<"\n";
     cout<<"the author name is:\t\t"<<l.AuthorName<<"\n";
     cout<<"the num of copies is:\t\t"<<l.NumOfCopies<<"\n";
      cout<< "\n\n\n";
     cout<< i.num<<"\t";
     cout<< i.isbN<<"\n";
     getch();
        }

    }

ثم قفلت قوس ال codintion and while loop

DB.close();

ثم بعد ذلك قفلت الملف

بالنسبة للdelete فى دالة اسمها system دور عليها واستخدمها أفضل بدل عمل استخدام الflag

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#11

-------------------------------------------------------

eng_3llam

مــاشالله عليك اللهم لا حسد خمسه وخميسه :D

يأخي انا درست لغات سي و سي ++ و كنت اعتقد اني خبيييير B)

لكن هناك بعض cods اول مره اشوفه مثل

ios::in|ios::binary

DB.open("allam.txt", ios::in|ios::binary);

i.isbN

مع العلم ان الكتب التي درستها هي :

Programming and Problem Solving with C++ -----For Dale weems

the othe book in talking about the C languge it was :

Problem Solving and Program Design in C -------For Addison wesely

-----------------------------------------

can you tell me if should I learn this cods you used ????

:wacko:

ســبحان اللــــــه والحمدالله ولا إله الا اللــــــه والله أكبــر

اللهم إغفــــر لي ولوالدي ولجميع المسلميــن

مهمــا طالت غيبتي ســأعود يوما

pearly_free_palestine.GIF

#12

السلام عليكم ورحمه الله وبركاته ....

الى الاخ : errorcode

هذا الكود بلغة فيجوال سي ++ اولا

وقصه bineary هاذي لحفظ البيانات المدخله في الملف باستخدام الاعداد الاوليه اي زي نظام تشفير عشان لا احد يفهما لو احد فتح الملف

بس هاذي هي القصة .....

وشكرا....

ابو رواد -جامعة الاقصى

فلسطين -رفح الصمود

هذا الموضوع مغلق.

مواضيع مشابهة