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

كيف أقرأ مصفوفة بلغة السي من فايل على الهارد

مغلق
بدأه elghamry في 14 سبتمبر 2005 · 2 رد · 973 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

انني أشكر كل القائمين على اقامة هذا المنتدى الهام والمتميز الذي استفدت منه الكثير

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

أحبتي في الله

أرجو من حضراتكم أن تساعدوني في ما أقوم بالبحث عنه منذ عدة أسابيع ، وبسبب عدم خبرتي في

كيفية التعامل في المنتديات - فهذا أول منتدى أشترك فيه - فانني لم أكن أعرف كيف أسأل الأخوة ذوو الرسائل الهامة في الموضوع الذي يهمني

انني باختصار أعمل في الدكتوراه تخصص جيوفيزياء وبدأت أتعلم لغة السي وعندي برنامج البيليز" pelles c " والذي أحتاج اليه بشدة في عملي هو المصفوفات ، كيف أقرأ مصفوفة من فايل على الهارد - لأن عملي به كميه كبيرة من البيانات تحتاج الى تحليل وهذه البيانات على هيئة

مصفوفة من x , y وأحيانا z

انني قرأت كثيرا عن المصفوفات في هذا المنتدى ولكن كان كله باختصار ولم أجد ما أريد

فأرجو من حضراتكم المساعدة فان الله يعلم مدى احتياجي لهذا الموضوع في أقرب وقت ، لأنني بعد ذلك سأتعلم الماتلاب لكي يساعدني في تحليل البيانات التي كتبت بالسي من خلاله كما أرشدني المشرف على الرسالة ، وربنا يسهل ما بعد ذلك.

وجزاكم الله خيرا

أسألكم الدعاء

email: moh_hefnawy@yahoo.com

#2

اذا كنت تعمل على وندوز و تريد ان تستخدم ال API

يمكن ان تفعل الاتى

لنفض ان المصفوفة التى تريد قراتها هى عبارة عن

double x[n]

وعندك ملف بالاسم data.dat

استعمل هذا الكود

HANDLE    f       =   CreateFile("data.dat",..............................)

لا اذكر بالضبط ما هى المعاملات التى تحتاجها الدالة, و لكن ال MSDN غنية بذلك وهى سهلة.

بعد ان اخذنا المقبض للملف فى المتغير f يمكن ان ننفذ عملية القراءة بالدالة ReadFile

و لكن انتبه فالدالة ReadFile تقراء من الملف عدد من البايتات اذن يجب ان يكون حجم البيانات

المراد قرائنها

n*sizeof(double)

و الشئ الاكثر اهمية يجب التحقق من عدد البيانات التى قورئت فعليا, لانه من المتوقع ان لا تنفذ

الدالة عملية القراءة من مرة واحدة, لذلك عليك بكل مرة بتقديم الBuffer حتى تقرا فى المكان الجديد

انا فى الحقحيقة لست متاكد من ترتيب المعاملات فى الدالة, يمكن الرجوع الى ال MSDN او الى win32.hlp

int read = 0;
while( read   < n * sizeof(double) )
{
         int readnow;
         ReadFile(f     ,  x+read    ,   n*sizeof(double)  - read   ,   &readnow,   NULL);

read  +=   readnow;
}

المعامل الاول للدالة ليس الا المقبض للملف الذى نريد القراءة منه

المعامل الثانى هو ال buffer الذى سوف تتم القراءة فيه , لاحظ تغير العنوان باضافة البايتات التى قراءناها

المعامل الثالث يمثل عدد بايتات التى نود قراتها , كذلك لاحظ ارتباط هذه القيمة ب read

المعامل الرابع هو مؤشر لمتغير يحوى عدد البيانات التى قرأناها فعليا بهذه الدالة.

اما الاخير فلا تحتاج له الان

اذا ثابرت قليلا مع ملفات الMSDN يمكن ان تفعلها ببساطة

اما اذا اردت ان تستخدم دوال لغة الC الاساسية , هذا يعمل ايضا تحت Windows

FILE*    f    =   fopen("data.dat"   ,   "r");

fread (  f    ,  x   ,   sizeof(double)   ,   n     );

بهذه البساطة سوف تتم عملية القرأة, لمزيد من التفاصيل يمكن ان تستعين باى كتاب او مقالة

عن الملفات فى لغة ال C

#3

#include <iostream>
#include <conio>
#include <fstream>
#include <process.h>
struct Data
{
 int Row;
 int Column;
 int a[100][100];


};
void Back();
Data d;
fstream DB;

void AddRec()
{
 char w='y';
 DB.open("Data.txt",ios::app);
 if(!DB)
    {
     cout<<"ERROR CAN'T OPEN FILE...!";
     DB.close();
     getch();
    }
  do
  {
    clrscr();
    cout<<"enter the Number of Rows of this array\t";
     cin>>d.Row;
    cout<<"enter the Number of column of this array\t";
     cin>>d.Column;
    //d.a = new int*[d.Row];
   //for(int i=0;i<d.Row;i++)
     //d.a = new int[d.Column];
   for(int i=0; i<d.Row;i++)
    for(int j=0;j<d.Column;j++)
    {
      cout<<"Enter the element Number["<<(i+1)<<"]["<<(j+1)<<"]\t";
       cin>>d.a[j];
    }

      DB.seekp(0,ios::end);
  DB.write(reinterpret_cast<char*>(&d),sizeof(d));
     cout<<"are u want to enter another data(y,n)==>";  cin>>w;
     }while(w!='N'&&w!='n');
     DB.close();
     clrscr();
     Back();
}


/****************************************************************************************/
void Diplay()
{

 DB.open("Data.txt", ios::in);
 if(!DB)
    {
     cout<<"Can't Open  File";
     DB.close();
     getch();
    }
 /*int NumOfRec;
 DB.seekg(0,ios::end);
 NumOfRec=int(DB.tellg())/sizeof(d);

  Data *ptr=new Data[NumOfRec];
  DB.seekg(0,ios::beg);
  for(int o=0;o<NumOfRec;o++)
  {
 	 DB.read((char*)&d,sizeof(d));
   ptr[o] = d;
  }
                   */
 while(1)
    {
     DB.read(reinterpret_cast<char*>(&d),sizeof(d));
     if(DB.eof())
        break;
     clrscr();
    for(int i=0; i<d.Row;i++)
         for(int j=0;j<d.Column;j++)
       {
        cout<<"the element Number["<<(i+1)<<"]["<<(j+1)<<"] is \t"<<d.a[j]<<endl;

           }
    getch();


    }
   /*
    int R,C;
   for(int i =0;i<NumOfRec;i++)
   {
     R = ptr.Row;
     C = ptr.Column;
     for(int j =0;j<R;j++)
     {
      for(int k =0;k<C;k++)
       {
        cout<<ptr.a[j][k]<<"\n";
       }
     }
     R=0;
     C=0;
   } */
 DB.close();
 clrscr();
 Back();
}


/****************************************************************************************/
void Back()
{
  int Key;
  cout<<"\t\tselect the case:\n";
  cout<<"\t\t\t\t1-Write in the file.\n";
  cout<<"\t\t\t\t2-Read from the file.\n";
  cout<<"\t\t\t\t3-Exit from program.\n";
  cin>>Key;
  switch(Key)
  {
    case 1:
      AddRec();
    break;
    case 2:
     Diplay();
    break;
    case 3:
     exit(0);
    break;
    default:

      cout<<"\n\n\n Sorry Error.....!";
     getch();
     exit(0);


  }
}

void main()
{

   Back();


}

يعنى أنا أعتقد ان تلك الفكرة اللى انا عاملها دى بدائية جدا جدا وتستهلك فى الram :( بس هحاول أطور فيها :rolleyes:

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

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

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