CString statt einen char[] benutzen?



  • Hi Forum,
    wie kann mann statt eines C-Arrays ein CString benutzen, das konkrete Beispiel:
    ich lese aus *.ini Datei aus und schreibe auch in diese....hier beim auslesen der gesammten Section:

    // mit C-Array:
    char acBuffer[1024];
    GetPrivateProfileSection(infoBuf,acBuffer, 1024,pathtoinifile);
    
    // soll mit CString csBuffer funktionieren
    CString csBuffer;
    GetPrivateProfileSection(infoBuf,csBuffer.GetBuffer(1024),1024,pathtoinifile);
    // wie kann ich jetzt den CString auf die Key's überprüfen, lesen, anzeigen usw.?  :confused:
    

    Danke
    mfg
    Mirsad



  • Was willst du wissen?



  • Hallo dEUs,
    das jetzige Projekt ist so das es viel in eine ini Datei schreibt und auch aus der selben lesen muß(Programm einstellungen usw.), jedes mal wenn ich einen Wert aus der ini lese speichere ich den in ein char-array, dieser muß auch dann genug lang sein um alles aufzunehmen, dann sind die einzelnen keys mit einem \0 von einander getrennt, so wie im Beispiel unten:

    // Die ganze Section aus der ini Datei lesen, wenn die Section so aussieht:
    /*
    [sectionname]
    KeyName1=KeyValueString 
    KeyName2=KeyValueString
    usw.
    max ist
    KeyName40=KeyValueString
    jetzt lese ich die Section mit:
    */
    GetPrivateProfileSection(sectionName,charArrayZumSpeichernDerSection,pfadZuIniDatei);
    // jetzt steht die ganze Section in einem char-array, wenn ich da eine 
    // CString Variable nehme dann wird nur der erste Key gespeichert z.B.
    
    CString cStringZumSpeichernDerSection;
    GetPrivateProfileSection(sectionName,cStringZumSpeichernDerSection,pfadZuIniDatei);
    
    // jezt steht in der CString nur der erste Key:
    // KeyName1=KeyValueString
    

    Das ist der genaue Dateiaufbau:

    // Der Sectionname ist der Name des PC's auf dem die Anwendung läuft..
    // Die Section
    [PcName]
    1=C:\Programme\Eigene Dateien
    2=C:\Programme\ProgrammOrdner
    3=C:\Programme\ProgrammOrdner\Projekte
    // usw.. maximum an keys ist 40, mehr als 40 key's können nicht gespeichert werden
    CString zielVariable;
    GetPrivateProfileSection(PcName,zielVariable,pfadZuIniDatei);
    // jetzt hat die zielVariable nur den ersten Key 1 gespeichert, wo sind die anderen... :confused:
    

    Wenn ich jetzt die Section auslese, dann speichert die CString Variable nur den ersten gelesenen Key und seinen Wert
    also speichere ich jetzt alles in ein char-array, noch zu sagen, wenn ich die Section lese, dann sind alle Keys mit einem '\0' von einander getrennt, daher(glaube ich 🙄 ) das CString speichert bis das erste '\0' auftaucht und den Rest abschneidet..

    gruß
    mirsad



  • Hallo!

    Dass eine CString-Variable als 2.Parameter bei GetPrivateProfileSection dazu führt, dass die Keys und Werte nur bis zum ersten 0-Character in der CString-Variable landen, liegt wohl daran, dass der zweite Parameter vom Typ
    LPTSTR ist und die Typkonvertierung von LPTSTR nach CString alle Zeichen bis zum ersten 0-Zeichen in CString übernimmt.

    Bevor Du nach

    GetPrivateProfileSection(infoBuf,csBuffer.GetBuffer(1024),1024,pathtoinifile);
    

    mit csBuffer weiter arbeitest, musst Du übrigens

    csBuffer.ReleaseBuffer
    

    aufrufen.
    Für nähere Erklärungen, siehe MSDN:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/vclrfcsimplestringtgetbuffer.asp

    Nun ist es möglich, mit verschiedenen Methoden der Klasse CString csBuffer zu bearbeiten.
    Sei z.B. csBuffer=="1.Key=bla \0 2.Key=blabla" dann könnte man die einzelnen Key-Werte folgendermaßen aus csBuffer extrahieren und am Bildschirm anzeigen:

    CString strKeyName=L"1.Key";//oder "2.Key"
      int iPos=csBuffer.Find(strKeyName)+strKeyName.GetLength();
      CString strKeyWert=L"";
      for(int i=iPos+1; i<csBuffer.GetLength(); i++)
      {
        if(csBuffer[i]==' ')
          break;
        strKeyWert+=csBuffer[i];
      }
      ::AfxMessageBox(strKeyWert);
    

    Gruß, Lothar.



  • Hallo Lothar,
    danke für deine Hilfe, das mit dem ReleaseBuffer() war nicht drin! 😕
    werde jetzt das ganze ausprobieren und wenn es klappt dann stell ich alles auf CStrings um!
    Gruß
    Mirsad



  • hi,
    klappt nicht, immer noch das selbe, :(, der Link ist sehr gut, nur das die include die ich dafür brauche in der .Net enthalten sind und nicht in meiner MFC, jedenfalls sagt der Kompiler das er die Header Dateien icht finden kann !? 😞
    lg
    mirsad


Anmelden zum Antworten