1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

C++ Variablen extern speichern und aufrufen?

Discussion in 'Programmieren' started by finnex, Feb 6, 2008.

Thread Status:
Not open for further replies.
  1. finnex

    finnex Guest

    Hallo,
    ich habe vor einer Weile angefangen C++ mit Visual 2005 zu programmieren. Nurn will ich bestimmte Variablen extern irgendwo Speichern und aufrufen können. Denn wenn ich nun mein Programm schließe sind meine Dateien ja gelöscht... Was gibt es da für einen Befehl um dies zu verwirklichen??

    Mfg finnex
     
  2. Michi0815

    Michi0815 Guest

    allgemeingültige lösung: schreib die variablen in eine .ini oder eine .conf datei. beim programmstart liest du die datei zeile für zeile bzw variable für variable ein.

    windows lösung: schreib die variablen in die registry. beim programmstart etc...
     
  3. finnex

    finnex Guest

    und wie genau geht das?

    Mfg finnex
     
  4. Michi0815

    Michi0815 Guest

    google kaputt?

    Code:
    #include <fstream.h>
        int main()
        {
            char str[2000];
            fstream file_op("c:\\test_file.txt",ios::in);
            while(!file_op.eof())
            {
                  file_op.getline(str,2000);
                  cout <<str;
            }         file_op.close();
            cout <<endl;
    
            return 0;
        }
    
    Code:
    #include <fstream.h>
        int main()
        {
            fstream file_op("c:\\test_file.txt",ios::out);
    
            file_op<<"Test Write to file";
            file_op.close();
            return 0;
        }
     
  5. finnex

    finnex Guest

    hi,
    so etwas ähnliches habe ich auch schon gefunden...
    gibt es auch eine Möglichkeit bestimte stellen von einer Textdatei auszulesen?
    Bsp:
    Ich mache mir ein Adressbuch und habe folgende einträge:
    Name: Max Mustermann
    Adresse: Musterstaße 1

    und einen zweiten Eintrag:

    Name: Marie Mustermann
    Adresse: Musterstaße 1


    Kann ich dann nur den Zweiten Eintag ausgeben????

    Mfg finnex
     
  6. Michi0815

    Michi0815 Guest

    kurze antwort: jain

    bei ein textfiles musst du einen eintrag nach dem anderen auslesen bis du den richtigen erreicht hast, weil die zeilen üblicherweise unterschiedlich lang sind.

    wenn du bestimmte datensätze schnell auslesen willst musst du dir ein dateiformat basteln, in dem jeder eintrag eine genau bestimmte größe hat. dann kannst du per seek zu bestimmten stellen springen. stichwort record file
     
  7. finnex

    finnex Guest

    hallo,
    ich habe mal im internet und in einem buch von mir geschaut und etwas gefunden doch leider verstehe ich dies nicht so richtig. Gibt es auch noch irgendeine andere lösung nicht mit einem Text document ???

    Mfg finnex
     
  8. Michi0815

    Michi0815 Guest

    hab ich doch geschrieben. mach ein record file (zumindest hieß das so wie ich in der schule war ;))

    einfach die einzelnen (gleichartigen) objekte serialisieren und 1:1 ins file schreiben. wenn jedes dieser datensätze (=objekte) z.b. 50 bytes braucht, dann wird der 1. bei byte 0 beginnen, der 2. bei byte 50, der 132. bei byte 6550 etc...

    mit seek kannst du dann unabhängig von der reihenfolge im file datensätze lesen oder schreiben.

    natürlich hast du dabei den nachteil, dass du das datenformat vorher festlegen musst und nacher nicht mehr einfach z.b eine telefonnummer dazuschreiben kannst.

    edit:
    für ein telefon-/adressbuch würde sich trotzdem eher ein csv datenformat anbieten (also ein textfile, in dem jeder datensatz eine zeile belegt und die einzelnen felder durch kommas oder strichpunkte getrennt sind).
    so ein buch wird üblicherweise komplett in einem rutsch eingelesen, im arbeitsspeicher als (doppelt) verkettete liste, hashtable oder binärer baum gespeichert und anschließend wieder in einem rutsch auf die platte geschrieben. in dateien hin- und herspringen dauert eben wesentlich länger als zeigerverbiegen im ram ;)
     
  9. finnex

    finnex Guest

    Hallo,
    ja aber ich verstehe das nicht mit dem record file ich habe nur in einem Buch dies gefunden:
    Code:
    datei.seekg(-10L, ios::end);
    datei.seekg(20L, ios::cur);
    Wie kann ich des einbauen??

    Bis jetzt kann ich nur ganze textdateien einlesen und schreiben:


    Befehl zum lesen:

    Code:
    ifstream in("text.txt");
       while(!in.eof())
       {
          char ch;
          ch=in.get();
          cout<<ch;
       };

    Befehl zum schreiben:

    Code:
    ofstream out("witz.txt");
       out<<"Es kommt ein Mann zum Baecker und sagt: Ich moechte 99 Broetchen."<<endl;
       out<<"Da fragt der Baecker: Duerfen es auch 100 sein?"<<endl;
       out<<"Der Mann antwortet: Nein, wer koennte denn so viele essen?"<<endl;

    Wie kann ich da den oberen befehl einbauen???

    Mfg finnex
     
  10. Michi0815

    Michi0815 Guest

    setze dich mal mit der stdio.h auseinander. da gibt es so praktische funktionen wie fopen, fwrite, fread, fseek etc

    FILE *datei = fopen( "meinfile.bin", "wb" ); // <- zum binären schreiben öffnen
    fwrite(zeiger_auf_datensaetze, datensatz_groesse, anzahl_der_datensaetze, datei);
    fclose(datei);
     
  11. finnex

    finnex Guest

    Hi,
    hätrtest du nicht mal nen beispiel für mich?
    Würde mir sicher sehr weiter helfen.

    ah noch eine frage:
    ich habe ja diesen code "ifstream in("witz.txt");"
    kann ich auch eine variable benutzen um den namen zu bestimmen???
    Weil wenn ich dies compilen will klappt es nicht..

    Mfg Finnex
     
  12. Michi0815

    Michi0815 Guest

    Code:
    #include "stdafx.h"
    #include "stdio.h"
    #include <string>
    
    struct datensatz {
    	char Name[20]; // <- max 19 zeichen!
    	char Adresse[40]; // <- max 39 zeichen!
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	using namespace std;
    	string NameStr, AddrStr;
    	datensatz datensaetze[10];
    
    	NameStr = "Max Mustermann";
    	AddrStr = "Musterstrasse 15, 12345 Musterdorf";
    	NameStr.copy(datensaetze[0].Name, NameStr.length());
    	AddrStr.copy(datensaetze[0].Adresse, AddrStr.length());
    
    	NameStr = "Hans-Otto Müller";
    	AddrStr = "Waldgasse 123, 87321 Eindorf";
    	NameStr.copy(datensaetze[1].Name, NameStr.length());
    	AddrStr.copy(datensaetze[1].Adresse, AddrStr.length());
    
    	// etc
    
    	const char *filename = "meinfile.bin";
    	FILE *datei = fopen(filename , "wb" ); // <- zum binären schreiben öffnen
    	fwrite(datensaetze, sizeof(datensatz), 10, datei);
    	fclose(datei);
    	
    	return 0;
    }
    
     
  13. finnex

    finnex Guest

    hi,
    sorry... aber irgendwie werde ich nicht daraus schlau ...

    Mfg finnex
     
  14. Michi0815

    Michi0815 Guest

    wo ist das (erste) problem?
     
  15. finnex

    finnex Guest

    hi,
    damit kan ich ja jetz nur schreiben...
    wie kann ich jetz z.b den zweiten datensatz alleine öffnen?

    Mfg finnex
     
  16. Michi0815

    Michi0815 Guest

    ich dachte du kannst etwas programmieren ;)

    Code:
    #include "stdafx.h"
    #include "stdio.h"
    #include <string>
    
    struct datensatz {
    	char Name[20];
    	char Adresse[40];
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	using namespace std;
    	string NameStr, AddrStr;
    	datensatz datensaetze[10];
    
    	NameStr = "Max Mustermann";
    	AddrStr = "Musterstrasse 15, 12345 Musterdorf";
    	NameStr.copy(datensaetze[0].Name, NameStr.length());
    	AddrStr.copy(datensaetze[0].Adresse, AddrStr.length());
    
    	NameStr = "Hans-Otto Müller";
    	AddrStr = "Waldgasse 123, 87321 Eindorf";
    	NameStr.copy(datensaetze[1].Name, NameStr.length());
    	AddrStr.copy(datensaetze[1].Adresse, AddrStr.length());
    
    	// etc
    
    	const char *filename = "meinfile.bin";
    	FILE *datei = fopen(filename , "wb" ); // <- zum binären schreiben öffnen
    	fwrite(datensaetze, sizeof(datensatz), 10, datei);
    	fclose(datei);
    	
    	datei = fopen(filename , "rb" ); // <- zum binären lesen öffnen
    	fseek(datei, sizeof(datensatz), SEEK_SET);
    	fread(&datensaetze[7], sizeof(datensatz), 1, datei); // <- datensatz#0 überspringen
    	fclose(datei);
    
    	// Datensatz#7 (der jetzt Datensatz#1 enthält) nutzen
    
    	return 0;
    }
    
    
     
  17. finnex

    finnex Guest

    Hallo,
    ich kann auch ein wenig programmiern blos das habe ich noch nie angeschaut..

    Aber wen ich deinen Code Komplieiren lasse bringt mir Visual C++ 2005 eine Fehlermeldung...

    Code:
    Fehler	1	error C2061: Syntaxfehler: Bezeichner '_TCHAR'	\\pfad der datei...	10
    
    Wieso kennt mein Programm den Befehl nicht???

    Mfg finnex
     
Thread Status:
Not open for further replies.

Share This Page