Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » IniFile einlesen und teilen!

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
09.07.2005, 15:46 Uhr
Schwalbe



Hallo!

Bin ganz neu hier im Forum, und lerne auch erst ca 1 woche lang C++.
Mache seit dem 01.07.05 eine Ausbildung zum Fachinformatiker - Anwendungsentwicklung, und das macht mir soviel Spass, das ich mir jetzt sogar mein kleines Projekt mal per Mail nach Hause geschickt habe und da ein wenig dran basteln wollte :-)

Hier mal ein bisschen Code:


C++:
int BuildCsvFile::SchreibeCsv(Variablen &copybuffer, DWORD &bufferZaehler)
{
    copybuffer.filename = "C:\\IniTest\\1.csv";
    char *pCopyBuffer = copybuffer.copybuffer;
    vector<string> copyBufferString;

    ofstream schreibecsv(copybuffer.filename.c_str());

    
    for (int i=0; i < bufferZaehler; i++)
      {
        
        if (copybuffer.copybuffer[i]==0)
          {
              copyBufferString.push_back(pCopyBuffer);
              pCopyBuffer +=strlen(pCopyBuffer)+1;
          }

      }
    
    for (int i=0; i < copyBufferString.size(); i++)
      {
            schreibecsv << copyBufferString[i] + "\n";
      }



    cout << "Inhalt von " << copybuffer.inifilepath << " in " << copybuffer.filename << " gespeichert ";
    schreibecsv.close();
    
    return 0;
}



Die Ini Datei wird an anderer Stelle mit GetPrivateProfileSection eingelesen. Die erste If Anweisung in der for Schleife sucht nach den terminierenden Nullen, die 2te If Anweisung schreibt diese dann in eine Datei.

Nun ist es gewünscht, dass sowohl die rechte als auch die linke Seite der Ini Datei in eine einzelne Datei gespeichert werden soll, also dass was Rechts vom = Zeichen steht soll in eine eigene Datei, und dass was Links vom = Zeichen steht auch.

Müsste doch im Prinzip ganz einfach sein oder? Sobald er auf ein = trifft, müsste er den string irgendwie an der Stelle abhacken oder?

Das Problem ist jetzt, dass ich hier zuhause sitz, die ganzen Bücher sind auf der Arbeit, und bin wie gesagt erst seid knapp ner Woche dabei. Einiges von dem Code versteh ich selbst halt noch nicht ganz (mit meinem Ausbilder zusammen entworfen)

Eventuell könnt ihr mir ja nen kleinen Denkanstoss geben, das würd mich sehr freuen
Mir macht die ganze Sache nämlich sehr viel Spass. Danke schonmal im Vorraus, hoffe bin jetzt nicht zu noobig



-Eine Schwalbe macht noch keinen Sommer-
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.07.2005, 16:13 Uhr
(un)wissender
Niveauwart


Hm, ehrlich gesagt verstehe ich nicht was du da machst. Was ist denn "Variablen" für ein Typ?

Ansonsten so vorgehen.
1. Datei öffnen (mit std::ifstream)
2. Zeilenweise auslesen mit std::getline(std::ifstream, std::string)
3. Die Zeilen (std::string) in einem std::vector speichern.
4. Zeilen zerlegen (std::string::substr und std::string::find) helfen da.
5. Zerlegte Zeilen, also Bezeichner und Werte, können jetzt wieder gespeichert weden, bspw. in verschiedenen Dateien.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.07.2005, 16:29 Uhr
Schwalbe



Hi!
Hier ist nochmal eine etwas vereinfachte version:


C++:

#include <windows.h>
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main()
{
    const int GROESSE = 1620;
    char copybuffer[GROESSE];
    char *pCopyBuffer = copybuffer;
    vector<string> copyBufferString;
    char FileName[GROESSE] = ("C:\\IniTest\\SysTest.txt");
    ofstream oeffnen(FileName, ios::out);
    
      DWORD bufferZaehler = GetPrivateProfileSection("Settings",copybuffer,GROESSE,"C:\\Initest\\avrack.ini");    
      cout << bufferZaehler  << "\n";


      for (int i=0; i < bufferZaehler; i++)
      {
          if (copybuffer[i]==0)
          {
              copyBufferString.push_back(pCopyBuffer);
              pCopyBuffer +=strlen(pCopyBuffer)+1;
          }

          
      }
    
      for (int i=0; i < copyBufferString.size(); i++)
      {
              cout << copyBufferString[i] + "\n";
              oeffnen << copyBufferString[i] + "\n";
      }

     oeffnen.close;  
     return 0;


}





kannst Du damit was anfangen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.07.2005, 17:00 Uhr
(un)wissender
Niveauwart


Nein, nur soviel: Da steht Unsinn.
Liste mal Punkt für Punkt in Prosa auf, was das Ding tun soll.

Also erstens würde ich mal ifstream nehmen, da du ja erstmal lesen und nicht schreiben willst, richtig? (o = out, i = in, out kommst später).
Dann vergiss mal den ganzen window.h-Kram, und die char-Sachen. Die brauchst du nicht.

Code für ersten Schritt:
Einlesen und speichern (zur Überprüfung ausgeben)


C++:
#include <algorithm>
#include <iterator>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>

int main()
{
    std::ifstream in("test.txt");
    std::vector <std::string> buffer;
    
    std::string line;
    while(std::getline(in, line))
    {
        buffer.push_back(line);
    }
    
    std::copy(buffer.begin(), buffer.end(),
        std::ostream_iterator<std::string>(std::cout, "\n"));  
}



test.txt (gleiches Verzeichnis wie die auszuführende Datei):


Code:
hallo=wahr
drei=2
fuenf=toll


--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.07.2005, 17:36 Uhr
(un)wissender
Niveauwart


Namen und Werte trennen:


C++:
#include <algorithm>
#include <iterator>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <cctype>

int main()
{
    std::ifstream in("test.txt");
    std::vector <std::string> buffer;
    
    std::string line;
    while(std::getline(in, line))
    {
        line.erase(
            remove_if(line.begin(), line.end(), std::ptr_fun(isspace)),
            line.end()); //keinen whitespace...
      
         buffer.push_back(line);
    }
    
    //buffer ausgeben
    std::cout << "Buffer\n";
    std::copy(buffer.begin(), buffer.end(),
        std::ostream_iterator<std::string>(std::cout, "\n"));  
            
    std::vector <std::string> names, values;
    
    typedef std::vector<std::string>::const_iterator constVecIter;
    
    constVecIter endBuffer = buffer.end();
    for(constVecIter i = buffer.begin(); i != endBuffer; ++i)
    {
        std::size_t offset = i->find('=');
        
        if(std::string::npos == offset)
        {
            std::cout << "Error, = nicht gefunden!";
            return 0;
        }    
        
        names.push_back(i->substr(0, offset));
        values.push_back(i->substr(offset + 1)); // +1 weil wir = nicht wollen
    }
    
    //names aussgeben  
    std::cout << "\nNamen\n";
    std::copy(names.begin(), names.end(),
        std::ostream_iterator<std::string>(std::cout, "\n"));
        
    //values aussgeben
    std::cout << "\nWerte\n";
    std::copy(values.begin(), values.end(),
        std::ostream_iterator<std::string>(std::cout, "\n"));
}



fehlt noch die Speicherung...
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
09.07.2005, 17:40 Uhr
(un)wissender
Niveauwart


Alles komplett (zumindest wie ich es verstanden habe...)


C++:
#include <functional>
#include <algorithm>
#include <iterator>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <cctype>

int main()
{
    std::ifstream in("test.txt");
    std::vector <std::string> buffer;
    
    std::string line;
    while(std::getline(in, line))
    {
        line.erase(
            remove_if(line.begin(), line.end(), std::ptr_fun(isspace)),
            line.end()); //keinen whitespace...
      
         buffer.push_back(line);
    }
    
    //buffer ausgeben
    std::cout << "Buffer\n";
    std::copy(buffer.begin(), buffer.end(),
        std::ostream_iterator<std::string>(std::cout, "\n"));  
            
    std::vector <std::string> names, values;
    
    typedef std::vector<std::string>::const_iterator constVecIter;
    
    constVecIter endBuffer = buffer.end();
    for(constVecIter i = buffer.begin(); i != endBuffer; ++i)
    {
        std::size_t offset = i->find('=');
        
        if(std::string::npos == offset)
        {
            std::cout << "Error, = nicht gefunden!";
            return 0;
        }    
        
        names.push_back(i->substr(0, offset));
        values.push_back(i->substr(offset + 1)); // +1 weil wir = nicht wollen
    }
    
    //names aussgeben  
    std::cout << "\nNamen\n";
    std::copy(names.begin(), names.end(),
        std::ostream_iterator<std::string>(std::cout, "\n"));
        
    //values aussgeben
    std::cout << "\nWerte\n";
    std::copy(values.begin(), values.end(),
        std::ostream_iterator<std::string>(std::cout, "\n"));
    
    //Speichern  
    std::ofstream namesOut("names.txt"), valuesOut("values.txt");
    
    std::copy(names.begin(), names.end(),
        std::ostream_iterator<std::string>(namesOut, "\n"));
        
    std::copy(values.begin(), values.end(),
        std::ostream_iterator<std::string>(valuesOut, "\n"));
}


--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
09.07.2005, 17:40 Uhr
Schwalbe



nett, danke!
das funzt ja auch prima!
wobei ich die bedingung in der while schleife net so ganz checke
aber nett
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
09.07.2005, 18:03 Uhr
(un)wissender
Niveauwart


std::getline gibt den Stream zurück (in diesem Fall in vom Typ std::ifstream). Dieser verfügt über einen operator void*. Dieser void*-Pointer wird ausgewertet (von der Schleife). Ist er kleiner eins (meistens null), so beendet die Schleife, sonst nicht. Der operator void* von std::ifstream verhält sich so, das er im Fall von einem Fehler oder dem Erreichen des Endes der Datei einen Wert kleiner eins zurückgibt.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
09.07.2005, 18:25 Uhr
Schwalbe



das war ja mal nen netter gut verständlicher und sehr ausführlicher nachhilfe unterricht.

Da kann ich nichts weiter sagen als big thx!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
09.07.2005, 19:01 Uhr
(un)wissender
Niveauwart


Jo, dafür ist das Forum ja da.


Bearbeitung:

Der Rückgabewert von istream::operator void* muss natürlich genau null sein, damit die Schleife abbricht, sorry.


--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 09.07.2005 um 19:07 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: