إعـــــــلان

تقليص
لا يوجد إعلان حتى الآن.

الكتابة بنسق ملفات Ini

تقليص
X
 
  • تصفية - فلترة
  • الوقت
  • عرض
إلغاء تحديد الكل
مشاركات جديدة

  • الكتابة بنسق ملفات Ini

    نسق ملفات أي أن أي هووه نسق واسع الاستخدام بخصائص الويندوس و كذلك يستخدم على
    التطبيقات البرمجية ... يساعدك هذا النسق من الكتابة على تسجيل معطيات عملية منطقية
    ثم قراءة هذه المعطيات أثناء تشغيل البرنامج أو عمليات بالويندوس و من بعد التطبيق على
    ضوء هذه المعطيات المخزنة مسبقا ... ربما كثير منا يعرف التثبيت التلقائي للويندوس حيث
    أن تثبيت نظام الويندوس يدويا يتطلب معطيات ... منها مفتاح تسجيل الويندوس اللغة و اسم
    الكمبيوتر و المنطقة الزمنية و غيرها ... و بما أن التثبيت التلقائي يتم تلقائيا فجميع المعطيات
    السابقة يتم تخزينها على ملف و باستخدام نسق ملفات أي أن أي في ملف يدعى winnt.sif

    على المرفقات ملفات المشروع كاملة مع مثال مترجم لتطبيق .

    شرح سريع لنسق أي أن أي

    عند تسجيل قيمة على ملفات أي أن أي يتطلب الأمر ثلاث مدخلات

    القسم (أي اسم)
    Section
    المفتاح
    Key (أي اسم)
    و القيمة التي سنخزنها
    Value

    تسجل على ملفات أي أن أي بالصورة التالية
    كود:
    [Section]
    Key=Value
    عند استدعاء القيمة المسجلة و التي هي Value
    يتطلب الأمر إثنين من المعطيات القسم و المفتاح
    Section و Key

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

    IniFile.h
    كود:
    #include <string.h>
    #include <ctype.h>
    #include <stdio.h>
    char* StringMid(char* iString,int Start,int Count);
    char* StringLeft(char* iString,int Count);
    char* StringRight(char* iString,int Count);
    char* StringStripWS(char* iString);
    char* StringAdd(char* StrA,char* StrB);
    char* StringUpper(char* iString);
    int CharIsSpace(char* CharA);
    int StringIsCRLF(char* iString);
    int StringExceedsCRLF(char* Text,int Pos);
    char* CRLF();
    int IsSection(char* Text,char* Section);
    int IsKey(char* Text,char* Key,int Pos);
    int IsNewSection(char* Text,int Pos);
    char* StringIniWrite(char* Text,char* Section,char* Key,char* Value);
    char* StringIniRead(char* Text,char* Section,char* Key,char* iDefault);
    int FileIniWrite(char* FileFullName,char* Section,char* Key,char* Value);
    char* FileIniRead(char* Text,char* Section,char* Key,char* iDefault);
    
    int FileIniWrite(char* FileFullName,char* Section,char* Key,char* Value)
    {
    FILE * pFile = fopen (FileFullName,"rb");
    if (pFile == NULL )
    {
    FILE * nFile = fopen (FileFullName,"wb");
    if (nFile == NULL) return 0;
    char* Text = StringIniWrite("",Section,Key,Value);
    fwrite(Text,1,strlen(Text) + 1,nFile);
    fclose(nFile);
    } else {
    fseek(pFile,0,SEEK_END);
    int FileSize = ftell(pFile);
    rewind(pFile);
    char* Text = new char[FileSize];
    ZeroMemory(Text,FileSize);
    fread(Text,FileSize,1,pFile);
    Text = StringIniWrite(Text,Section,Key,Value);
    fclose(pFile);
    pFile = fopen (FileFullName,"wb");
    if (pFile == NULL) return 0;
    fwrite(Text,1,strlen(Text) + 1,pFile);
    fclose(pFile);
    }
    
    return 1;
    }
    
    char* FileIniRead(char* FileFullName,char* Section,char* Key,char* iDefault)
    {
    FILE * pFile = fopen (FileFullName,"rb");
    if (pFile == NULL ) return iDefault;
    fseek(pFile,0,SEEK_END);
    int FileSize = ftell(pFile);
    rewind(pFile);
    char* Text = new char[FileSize];
    ZeroMemory(Text,FileSize);
    fread(Text,FileSize,1,pFile);
    fclose(pFile);
    return StringIniRead(Text,Section,Key,iDefault);
    }
    
    char* StringIniRead(char* Text,char* Section,char* Key,char* iDefault)
    {
    Section = StringStripWS(Section);
    Key = StringStripWS(Key);
    int TLen = strlen(Text);
    int PosA = IsSection(Text,Section);
    if (PosA)
    {
    int PosB = IsKey(Text,Key,PosA);
    if (PosB)
    {
    for (int A = PosB; A <= TLen ; A++)
    {
    char* CharA = StringMid(Text,A,2);
    if ((StringIsCRLF(CharA)) || A == TLen)
    return StringMid(Text,(PosB + 1),A - (PosB + 1));
    }
    }else {
    return iDefault;
    }
    }
    return iDefault;
    }
    
    char* StringIniWrite(char* Text,char* Section,char* Key,char* Value)
    {
    Section = StringStripWS(Section);
    Key = StringStripWS(Key);
    int TLen = strlen(Text);
    int PosA = IsSection(Text,Section);
    if (PosA)
    {
    int PosB = IsKey(Text,Key,PosA);
    if (PosB)
    {
    for (int A = PosB; A <= TLen ; A++)
    {
    char* CharA = StringMid(Text,A,2);
    if ((StringIsCRLF(CharA)) || A == TLen)
    {
    if (StringIsCRLF(CharA)) A--;
    char* TextA = StringLeft(Text,PosB);
    char* TextB = StringRight(Text,TLen - A);
    TextA = StringAdd(TextA,Value);
    TextA = StringAdd(TextA,TextB);
    return TextA;
    }
    }
    }else {
    char* CharB = StringMid(Text,PosA,2);
    if (StringIsCRLF(CharB)) PosA++;
    char* TextA = StringLeft(Text,PosA);
    char* TextB = StringRight(Text,TLen - PosA);
    if (!StringIsCRLF(CharB)) TextA = StringAdd(TextA,CRLF());
    TextA = StringAdd(TextA,Key);
    TextA = StringAdd(TextA,"=");
    TextA = StringAdd(TextA,Value);
    TextA = StringAdd(TextA,CRLF());
    TextA = StringAdd(TextA,TextB);
    return TextA;
    }
    }
    char* CharC = StringRight(Text,2);
    if (!StringIsCRLF(CharC)) Text = StringAdd(Text,CRLF());
    Text = StringAdd(Text,"[");
    Text = StringAdd(Text,Section);
    Text = StringAdd(Text,"]");
    Text = StringAdd(Text,CRLF());
    Text = StringAdd(Text,Key);
    Text = StringAdd(Text,"=");
    Text = StringAdd(Text,Value);
    Text = StringAdd(Text,CRLF());
    return Text;
    }
    
    int IsSection(char* Text,char* Section)
    {
    int TLen = strlen(Text);
    int SLen = strlen(Section);
    int ExitLoop = 0;
    Section = StringUpper(Section);
    for (int A = 1; A <= TLen ; A++)
    {
    ExitLoop = 0;
    char* CharA = StringMid(Text,A,2);
    if ((StringIsCRLF(CharA)) || A == 1)
    {
    A = StringExceedsCRLF(Text,A);
    for (int B = A; B <= TLen ; B++)
    {
    char* CharB = StringMid(Text,B,1);
    if (!CharIsSpace(CharB))
    {
    for (int C = B; C <= TLen ; C++)
    {
    char* CharC = StringMid(Text,C,1);
    if (strcmp(CharC,"[") == 0)
    {
    for (int D = C + 1; D <= TLen ; D++)
    {
    char* CharD = StringMid(Text,D,1);
    if (!CharIsSpace(CharD))
    {
    if (strcmp(StringUpper(StringMid(Text,D,SLen)),Section) == 0)
    {
    for (int E = D + SLen; E <= TLen ; E++)
    {
    char* CharE = StringMid(Text,E,1);
    if (!CharIsSpace(CharE))
    {
    for (int F = E; F <= TLen ; F++)
    {
    char* CharF = StringMid(Text,F,1);
    if (strcmp(CharF,"]") == 0)
    {
    if (F == TLen) return F;
    for (int G = F + 1; G <= TLen ; G++)
    {
    char* CharG = StringMid(Text,G,1);
    char* CharH = StringMid(Text,G,2);
    if (!CharIsSpace(CharG))
    {
    if (StringIsCRLF(CharH))
    {
    return G;
    } else {
    if (G == TLen) return G;
    ExitLoop = 1;
    break;
    }
    }
    if (G == TLen) return G;
    if (ExitLoop == 1) break;
    }
    } else {
    ExitLoop = 1;
    }
    if (F == TLen) return 0;
    if (ExitLoop == 1) break;
    }
    }
    if (E == TLen) return 0;
    if (ExitLoop == 1) break;
    }
    } else {
    ExitLoop = 1;
    }
    }
    if (D == TLen) return 0;
    if (ExitLoop == 1) break;
    }
    } else {
    ExitLoop = 1;
    }
    if (C == TLen) return 0;
    if (ExitLoop == 1) break;
    }
    }
    if (B == TLen) return 0;
    if (ExitLoop == 1) break;
    }
    }
    if (A == TLen) return 0;
    }
    return 0;
    }
    
    int IsNewSection(char* Text,int Pos)
    {
    int TLen = strlen(Text);
    for (int A = Pos; A <= TLen ; A++)
    {
    char* CharA = StringMid(Text,A,2);
    if (StringIsCRLF(CharA))
    {
    A = StringExceedsCRLF(Text,A);
    for (int B = A; B <= TLen ; B++)
    {
    char* CharB = StringMid(Text,B,1);
    if (!CharIsSpace(CharB))
    {
    for (int C = B; C <= TLen ; C++)
    {
    char* CharC = StringMid(Text,C,1);
    if (strcmp(CharC,"[") == 0)
    {
    for (int D = C + 1; D <= TLen ; D++)
    {
    char* CharD = StringMid(Text,D,1);
    char* CharE = StringMid(Text,D,2);
    if (StringIsCRLF(CharE) || D == TLen) return 0;
    if (strcmp(CharD,"]") == 0)
    {
    for (int E = D + 1; E <= TLen ; E++)
    {
    char* CharF = StringMid(Text,E,1);
    char* CharG = StringMid(Text,E,2);
    if (!CharIsSpace(CharF))
    {
    if (StringIsCRLF(CharG) || E == TLen)
    {
    return E;
    } else {
    return 0;
    }
    }
    }
    if (D == TLen) return D;
    }
    if (D == TLen) return 0;
    }
    } else {
    return 0;
    }
    if (C == TLen) return 0;
    }
    }
    if (B == TLen) return 0;
    }
    }
    if (A == TLen) return 0;
    }
    return 0;
    }
    
    int IsKey(char* Text,char* Key,int Pos)
    {
    int TLen = strlen(Text);
    int KLen = strlen(Key);
    int ExitLoop = 0;
    Key = StringUpper(Key);
    for (int A = Pos; A <= TLen ; A++)
    {
    char* CharA = StringMid(Text,A,1);
    if (!CharIsSpace(CharA))
    {
    for (int B = A; B <= TLen ; B++)
    {
    ExitLoop = 0;
    char* CharB = StringMid(Text,B,2);
    if (StringIsCRLF(CharB))
    {
    if (IsNewSection(Text,B)) return 0;
    B = StringExceedsCRLF(Text,B);
    for (int C = B; C <= TLen ; C++)
    {
    char* CharC = StringMid(Text,C,1);
    if (!CharIsSpace(CharC))
    {
    for (int D = C; D <= TLen ; D++)
    {
    if (strcmp(StringUpper(StringMid(Text,D,KLen)),Key) == 0)
    {
    for (int E = D + KLen; E <= TLen ; E++)
    {
    char* CharD = StringMid(Text,E,1);
    if (!CharIsSpace(CharD))
    {
    for (int F = E; F <= TLen ; F++)
    {
    char* CharE = StringMid(Text,F,1);
    if (strcmp(CharE,"=") == 0)
    {
    return F;
    } else {
    ExitLoop = 1;
    }
    if (ExitLoop == 1) break;
    }
    }
    if (ExitLoop == 1) break;
    }
    } else {
    ExitLoop = 1;
    }
    if (ExitLoop == 1) break;
    }
    }
    if (ExitLoop == 1) break;
    }
    }
    }
    }
    }
    return 0;
    }
    
    char* StringMid(char* iString,int Start,int Count)
    {
    int len = strlen(iString) , iCount = Count;
    if (Start > len || Start < 0 || Count < 1) return "";
    if (Count > (len - Start)) iCount == (len - Start);
    return StringRight(StringLeft(iString,(Start + iCount) - 1),iCount);
    }
    
    char* StringLeft(char* iString,int Count)
    {
    if (Count < 1 ) return "";
    if (Count > strlen(iString)) Count = strlen(iString);
    char* StrA = new char[Count + 1];
    strncpy(StrA,iString,Count);
    StrA[Count]='\0';
    return StrA;
    }
    
    char* StringRight(char* iString,int Count)
    {
    if (Count < 1 ) return "";
    if (Count > strlen(iString)) Count = strlen(iString);
    char* StrA = new char[Count + 1];
    strncpy(StrA,iString + (strlen(iString) - Count),Count);
    StrA[Count]='\0';
    return StrA;
    }
    
    char* StringUpper(char* iString)
    {
    char* pString = new char[strlen(iString)];
    for ( int i = 0 ; i <= strlen(iString) ; i++ )
    pString[i] = toupper(iString[i]);
    return pString;
    }
    
    char* StringStripWS(char* iString)
    {
    char* StrA = iString;
    for ( int A = 0 ; A <= strlen(iString) ; A++ )
    {
    if (iString[A] == (char) 32) {StrA = StringRight(iString,strlen(iString) - A);} else {break;}
    }
    char* StrB = StrA;
    for ( int A = strlen(StrA) ; A >= 0 ; A--)
    {
    if (StrA[A] == (char) 32) {StrB = StringLeft(StrA,A);} else {break;}
    }
    return StrB;
    }
    
    int StringIsCRLF(char* iString)
    {
    if (strcmp(iString ,CRLF()) == 0) return 1;
    return 0;
    }
    
    int CharIsSpace(char* CharA)
    {
    if (strcmp(CharA," ") == 0) return 1;
    return 0;
    }
    
    int StringExceedsCRLF(char* Text,int Pos)
    {
    int A = Pos;
    int TLen = strlen(Text);
    while (A != TLen)
    {
    char* CharA = StringMid(Text,A,1);
    if (strcmp(CharA,"\r") != 0 && strcmp(CharA,"\n") != 0) break;
    A++;
    }
    return A;
    }
    
    char* CRLF()
    {
    return StringAdd("\r","\n");
    }
    
    char* StringAdd(char* StrA,char* StrB)
    {
    char* StrC = new char[strlen(StrA) + strlen(StrB) + 1];
    strcpy(StrC,StrA);
    strcpy(StrC + strlen(StrA),StrB);
    return StrC;
    }
    وهذا المثال لاستخدام الدوال السابقة
    Example.cpp
    كود:
    #include <windows.h>
    #include "IniFile.h"
    
    int WINAPI WinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPSTR lpCmdLine,
                       int nCmdShow)
    {
    
    FileIniWrite("FileName.ini","Section1","Key1","value1");
    FileIniWrite("FileName.ini","Section2","Key1","value1");
    FileIniWrite("FileName.ini","Section3","Key1","value1");
    FileIniWrite("FileName.ini","Section4","Key1","value1");
    FileIniWrite("FileName.ini","Section5","Key1","value1");
    
    char* RTA = FileIniRead("FileName.ini","Section1","Key1","NotFound");
    char* RTB = FileIniRead("FileName.ini","Section2","Key1","NotFound");
    char* RTC = FileIniRead("FileName.ini","Section3","Key1","NotFound");
    char* RTD = FileIniRead("FileName.ini","Section4","Key1","NotFound");
    char* RTE = FileIniRead("FileName.ini","Section5","Key1","NotFound");
    char* RTF = FileIniRead("FileName.ini","Section5","Key2","NotFound");
    
    char* RTText = StringAdd("","Section1 Key1 ==> ");
    RTText = StringAdd(RTText,RTA);
    RTText = StringAdd(RTText,CRLF());
    
    RTText = StringAdd(RTText,"Section2 Key1 ==> ");
    RTText = StringAdd(RTText,RTB);
    RTText = StringAdd(RTText,CRLF());
    
    RTText = StringAdd(RTText,"Section3 Key1 ==> ");
    RTText = StringAdd(RTText,RTC);
    RTText = StringAdd(RTText,CRLF());
    
    RTText = StringAdd(RTText,"Section4 Key1 ==> ");
    RTText = StringAdd(RTText,RTD);
    RTText = StringAdd(RTText,CRLF());
    
    RTText = StringAdd(RTText,"Section5 Key1 ==> ");
    RTText = StringAdd(RTText,RTE);
    RTText = StringAdd(RTText,CRLF());
    
    RTText = StringAdd(RTText,"Section5 Key2 ==> ");
    RTText = StringAdd(RTText,RTF);
    RTText = StringAdd(RTText,CRLF());
    
    MessageBox(0,RTText,"FileIniRead",0);
    
    
       return 0;
    }
    الملفات المرفقة
يعمل...
X