Daten an Datei anhängen (mit Klasse CFile)



  • hallo!

    ich weiss, dass das ne doofe Frage ist...

    Aber weiss einer von euch zufällig wie man Daten an eine Datei anhängt?
    Bzw. wie man während die datei geöffnet ist häppchen-weise die daten zwischen
    den \n ausliest, um sie dann in nen struct zu speichern.
    Ich musste bis jetzt immer die komplette Datei in nen CString einlesen, bzw. nen
    gewaltig langen CString in die Datei rückspeichern, aber früher oder später kracht
    es da gewaltig.
    Ich habe die Klasse CFile benutzt und mein Projekt ist ein SDI.

    weiss jemand von euch Rat?



  • Hi,

    für das Zeilenweise-Auslesen der Datei kannst du scanfs (reines c) oder CStdioFile::ReadString (von CFile abgeleitet) verwenden.

    Datei an Datei hängen
    Einfach eine Datei im Schreibmodus öffnen, Zeiger mit SeekToEnd an das Dateiende setzten und deine Daten mit CFile::Write hineinschreiben, dann mit CFile::Write hineinschreiben dann mit CFile::Write hineinschreiben, bis du keine Lust mehr hast.

    Grüße Rapha



  • Hi Rapha!
    Dank dir wieder einmal.
    ich werde es versuchen.
    Sag mal, kann man mit CStdioFile::ReadString beliebig lange Strings einlesen oder
    gelten da die gleichen Speicherverhältnisse wie zum speichern in nen CString?



  • CStdioFile::ReadString liest einfach eine Zeile ein (d.h. bis zum '\n').
    Soetwas hast du doch gesucht, oder?



  • genau sowas hab ich gesucht.
    und dann ist der pointer auch automatisch auf dem nächsten string?
    mann, das wäre zu schön.
    aber vielleicht, warum ich das brauche:
    ich hab ne datenbank die bis 200 personen fassen soll.
    die einträge innerhalb der datei sehen so aus:
    Vorname(15 Stellen)
    Name(15 Stellen)
    PK-Nr. (7 Stellen)
    alle einträge sollen stringweise eingelesen werden (Vorname, dann Name, dann PK)
    und sogleich in ein struct zum gebrauch innerhalb des programms gespeichert.



  • Super, funzt prima!
    Viiiiiielen Dank für den Tipp 😃 😃 👍 👍



  • Bummsfallera schrieb:

    und dann ist der pointer auch automatisch auf dem nächsten string?

    Wenn du den Filepointer meinst, dann liegst du goldrichtig 👍

    Allerdings würde ich dir bei einer derartigen Datenbank empfehlen die Daten im Binärmodus zu speichern:
    etwa so:

    typedef struct person
    {
    char cVorname[15];
    char cName[15];
    char PKNr[7];
    } Person;
    

    Dann kannst du folgendermaßen in die Datei schreiben:

    CFile fFile;
    /* hier fFile.Open(...) */
    Person Personen[50];
    /* die 50 Personen mit Daten füllen*/
    
    for(int i=0; i < 50; i++)
    {
      // person in Datei schreiben:
      fFile.Write(Personen[i], sizeof[Person]);
    }
    

    So kannst du die Personen lesen (angenommen es sind 50 Personen in der Datei (du musst natürlich eine EOF Überprüfung einbauen, damit du genau weißt, wieviele Datensätze in der Datenbank existieren (damit du nicht über das Dateiende hinausliest)

    CFile fFile;
    /* hier fFile.Open(...) */
    
    Person Personen[50];
    for(int i=0; i < 50; i++)
    {
      // person in Datei schreiben:
      fFile.Read(Personen[i], sizeof[Person]);
    }
    

    Wenn du jetzt z.B. den 34. Datensatz auslesen willst, machst du folgendes:
    - Dateizeiger auf den Anfang der Datei setzten
    - Dateizeiger um folgende Bytes verschieben (n=34): ((n-1) * sizeof(Person))
    - Dann einfach mit folgendem Code die Person einlesen:

    Person tmpPers;
    fFile.Read(&tmpPers, sizeof[Person]);
    

    Diese Methode hat einige Vorteile (z.B. kannst du ganz schnell die größe einer Potentiellen Datenbankdatei errechnen: (Anzahl der Einträge)*(sizeof(Person))

    Grüße Rapha



  • da hast du dir aber mühe gemacht....
    hehe, sieht schon fast aus wie bei mir (ich hab in nem test-projekt ein
    wenig rumgespielt):

    void CDateitestView::OnButton3() 
    {
    	// TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
    	CString filenam = "C:\\Dokumente und Einstellungen\\Graf Koks\\Desktop\\dateitest\\datei.txt";
    	CStdioFile pFile;
    	CString string;
    	pFile.Open(filenam, CFile::modeRead , NULL );
    	int i=0;
    
    	struct perso
    	{
    		CString Name;
    		CString Vorname;
    		CString PK;
    	}posmemory[100];
    
    	pFile.ReadString(string);	
    	while(string.GetLength()>0)
    	{
    		posmemory[i].Name=string;
    		pFile.ReadString(string);
    
    		posmemory[i].Vorname=string;
    		pFile.ReadString(string);
    
    		posmemory[i].PK=string;
    		pFile.ReadString(string);
    
    		i++;
    	}
    	pFile.Close();
    
    	for(int j=0; j<i; j++)
    	{
    		AfxMessageBox(posmemory[j].Name + "\n" + posmemory[j].Vorname + "\n" + posmemory[j].PK);
    	}
    /*	
    	pFile.Open(filenam, CFile::modeWrite, NULL);
    	pFile.SeekToEnd();
    	pFile.WriteString("test\n");
    */
    }
    

    scheint zu gehn, aber deinen code werd ich mir v.a. beim auslesen ncoh ein
    wenig zu gemüte führen...
    Aber nochmals -> Fettes Merci, du bist der Beste.. 🕶



  • Hi,

    der einzige Unterschied zwischen meinem Code und deinem ist, dass ich die Datei im Binären Modus öffne (oh sorry, hab ich wohl nicht deutlich erwähnt) und direkt den Speicher in die Datei kopiere (CFile::Write) bzw von der Datei lese (CFile::Read). Deshalb auch die vielen sizeof 😃

    Musst dich nur noch entscheiden, ob du die Datei binär oder im Textmodus haben willst.

    Freut mich, dass ich dir helfen konnte.

    Grüße Rapha
    ps. Gute Nacht



  • ja, penn gut.
    bis nächstes mal 😃 😃 😃 😃


Anmelden zum Antworten