Zahlen speichern und aufrufen

N

Nejox

Hallo,

ich schreibe gerade ein C++ Programm und benötige nun ein bisschen Hilfe. Und zwar will ich Zahlen abspeichern und wieder aufrufen können an denen ein Text angehangen ist, z.B. ich drücke die 1 und es wird die Zahl 100 und die aktuelle Zeit gespeichert, ich warte 2 min drücke wieder die 1 es wird diesmal die Zahl 101 und die aktuelle Zeit gespeichert und so weiter. Jetzt will ich aber auch z.B. die Zahl 101 mit der Zeit wieder aufrufen können aber wie stelle ich das an? Ich will somit ca. 80 Zahlen abspeichern können an denen man einen Text anhängen kann.

Hoffe ihr könnt mir helfen.
 
Ok.Ich bin zwar selber noch kein Profi aber ich hoffe,dass ich es trotzdem erklären kann.
Das mit dem Zählen ist ja grundsätzlich nicht so schwierig.
Eine einfache Forschleife sollte da genügen.
Code:
for(int Zaehler=100;Zaehler<180;Zaehler++)
{
    cout<<Zaehler;
}
soweit so gut.
Nun zu der Zeit...
Ich weiss jetzt nicht ob du damit die Urzeit willst oder die Laufzeit des Programms.
Aber da in den meisten Fällen die Laufzeit mehr Sinn macht erkläre ich dir diese.
Wenn du Windows.h includest steht dir die Funktion
GetTickCount() zur Verfügung.
Sie Liefert dir die Zeit in Milisekunden seit dem Start von Windows soweit ich weiss.
Du musst also eine erste Messung machen wenn du das Programm startest und dann deine 80 anderen.
Immer wenn du dann eine der 80 Messungen gemacht hast musst du die erste Zeit abziehen und dann /1000 rechnen und erhälst somit die Sekunden.
Das sieht dann etwa so aus.
Code:
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
    int StartMessung;
    int Messung;
    int Eingabe;
    StartMessung=(GetTickCount());

for(int Zaehler=100;Zaehler<180;Zaehler++)
{
    cin>>Eingabe;
    cout<<endl;
    Messung=((GetTickCount()-StartMessung)/1000);
    cout<<Zaehler<<endl;
    cout<<Messung<<endl;
}



}
Nun kannst du drücken und die Zahl und die Zeit werden dir Angezeigt.
Zum Speichern musst du fstream includen
dann kannst du mit
Code:
ofstream Output("MeineDatei.md", ios::binary); //eine Datei erstellen (musst halt den namen für jede anpassen sonst überschreibst du diese).
und mit Output.write((char*) &Zaehler,sizeof(Zaehler));//Hier wird der Zähler hineingeschrieben
Output.close();//Datei schliessen
zum beispiel den Zähler Hineinschreiben.

um Diese Datei dann zu öffnen musst du folgendes schreiben
Code:
ifstream Input ("MeineDatei.md",ios::binary);
Input.read((char*)&Zaehler,sizeof(Zaehler));//In diesem Falle wird jetzt der Inhalt der Datei in die Variable Zaehler geschrieben
Input.close();

So.
Ich hoffe ich konnte helfen.
mfg
 
Willst du es persistent speichern, also auf der Festplatte, so dass man das Programm schließen kann und beim nächsten Aufruf sind die Daten noch vorhanden, oder nur während des Programmablaufs? In dem Fall würde ich einfache Arrays/Vektoren empfehlen.
Ansonsten zur Speicherung auf der Festplatte ist SQLite zu empfehlen, da dies die Verwaltung der Daten erleichtert.
 
Ich schließ mich der Meinung meines Vorredners an.
Hab ein altes Projekt rausgekramt und 2-3 Sachen geändert:
main.h
C++:
#include <time.h>
#include <conio.h>
#include <vector>
#include <iostream>
#include <windows.h>
#include <fstream>
using namespace std;

void saveFile(vector<long int> *in);
void loadFile();
vector<long int> globalStorage;
long int getCurTime();
void ausgabe();

main.cpp
C++:
#include "main.h"

int main(){
    cout<<"Druecken Sie die 1 um die Messwerte zu speichern und die 2 um die Messung zu beenden!\n";
    int input=0;
    //globalStorage=vector<double,double>;
    while(input!=50){
        input=(int)getch();
        if(input!=NULL) {
            switch(input){
              case 49://ASCII Zahl vom Buchstaben 1
                    globalStorage.push_back(getCurTime());
                    cout<<globalStorage.size()<<": "<<getCurTime()<<" gespeichert\n";
                  break;
              case 50:
                      cout<<"Messung beendet\n";
                  break;
              default:
                    cout<<input<<"\n";
                      cout<<"Unbekannte Eingabe\n";
                  break;
            }
        }
    }
    ausgabe();
    cout<<"\n\nDaten in Datei speichern? 1=ja\n";
    if((int)getch()==49){
        cout<<"Es werden "<<globalStorage.size()<<" Zeiten gespeichert\\n";
        saveFile(&globalStorage);
        globalStorage.clear(); //globalStorage leeren
        loadFile();
        cout<<"Es wurden "<<globalStorage.size()<<" Zeiten eingelesen\n";
        ausgabe();
    }
    globalStorage.clear();
    getch();
    return 0;
}
void saveFile(vector<long int> *in){
    ofstream ofFile;
    ofFile.open ("data2.txt", ios::out | ios::binary);
    vector<long int>::iterator ite;
    for (ite = in->begin(); ite != in->end(); ite++)
        ofFile << (*ite) << endl;
    ofFile.close();
}
void loadFile(){
    ifstream inFile;
    inFile.open ("data2.txt", ios::in | ios::binary);
    vector<long int>::iterator ite;
    long int buf;
    while (inFile) {
        inFile >> buf;
          globalStorage.push_back(buf);
    }
    globalStorage.pop_back();//da immer eine leere Zeile am Ende eingelesen wird diese wieder löschen
    inFile.close();
}
void ausgabe(){
    int i=0;
    cout<<"\n_______\n"<<globalStorage.size()<<" Daten werden ausgegeben:\n\n";
    while(i<globalStorage.size()){
        cout<<(i+1)<<": "<<globalStorage.at(i)<<"\n";
        i++;
    }
}
long int getCurTime(){
    time_t sekunden;
    sekunden = time (NULL);//seit 1.1.1970
    return (long int)sekunden;
}

Falls Fragen aufkommen einfach posten.
 
Zuletzt bearbeitet:
Ich danke euch erstma für die schnellen antworten. Und zur Frage mit der Sicherung. Hier wäre es von Vorteil wenn die Daten nicht verlohren gehen würden wenn das Programm geschlossen wurde. Daher wäre eine Sicherung auf der Festplatte warscheinlich die beste Lösung.
 
Hallo SCIPIO-AEMILIANUS,
ich habe dein Programm mal getestet und finde die Umsetzung sehr gut, aber wie kann ich es machen das ich jetz die eingaben einzeln aufrufen kann? Es wird ja alles in eine Datai gespeichert. Wie man die gesamte Datei aufrufen kann weis ich.

Ich gebe mal ein Beispiel an:

Ich drücke jetzt 15 mal die 1 in gewissen Zeitabständen, speicher dann alles ab und will nun die 7 eingabe wieder einzeln aufrufen und diese zeit abfragen, wie stell ich das an.

Mfg Nejox
 
Danke SCIPIO-AEMILIANUS dein Programm konnte mir schon weiterhelfen. Aber nun steh ich vor einen neuen Problem. Um das zu erklären nen ich einfach mal die aufgabenstellung und poste das programm was ich bisher geschrieben habe.
Die aufgabestellung ist die realisierung einer Parkhauseinfahrt mit ausgabe der Parkdauer und des Preises. Hierbei soll alles vererbt werden. (find ich persönlich schwachsinnig weil es komplizierter und unübersichtlicher wird aber naja)

So ich habe es so weit hinbekommen das das Datum gespeichert wird und man kann es auch wieder aufrufen.(später soll dann bei der ausgabe die verstrichen zeit, also wie lange man im parkhaus war, und der Preis ausgegeben werden) Aber wenn ich nun die Parkscheinnummer aufrufe z.b. die 5 wird die vorherige nummer aufgerufen also die 4. Hoffe du kannst mir helfen.

Sry wegen den wenigen Kommentaren im Programm falls da fragen aufkommen versuche ich sie zu beantworten

**********************************************************************************************

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <conio.h>
#include <vector>
#include <windows.h>
#include <fstream>

using namespace std;

void saveFile(vector<long int> *in);
void loadFile();
vector<long int> globalStorage;

class parkschein
{
protected:
int ankunftsz();
int abfahrtsz();
public:
void zeiteingabe();
void dauerausgabe();
};

class parkschein_einfach:public parkschein
{
private:
int zeitpreis;
public:
void preisausgabe();
void preissumme();
void speicher();
parkschein_einfach();
};

class parkschein_dauer:public parkschein
{
private:
int name;
int monatsbeitrag;
int gueltigkeit;
public:
void gültigkeitsausgabe();
};

class parkschein_firma:public parkschein
{
private:
int name;
int personummer;
int arbeitszeit;
};

void main()
{
parkschein p;
parkschein_einfach pe;

cout<<"Willkommen?\n";
cout<<"\n(1)Parkschein anfordern";
cout<<"\n(2)Parkschein einloesen ---------->";

int input=0; //globalStorage=vector<double,double>;
while(input!=50)
{
input=(int)getch();
if(input!=NULL)
{
switch(input)
{
case 49://ASCII Zahl vom Buchstaben 1
p.zeiteingabe();
break;
case 50:
p.dauerausgabe();
break;
default:
cout<<input<<"\n";
cout<<"Unbekannte Eingabe\n";
break;
}
}
}
pe.speicher(); //aufruf der speiherfunktion in parkschein_einfach::speicher
globalStorage.clear();
}

void parkschein::zeiteingabe()
{

time_t aclock;
tm *newtime;
time( &aclock );

newtime = localtime(&aclock);
globalStorage.push_back(aclock);

cout<<"\nAnzahl: "<<aclock<<endl; //ausgabe der sekunden
cout<<"\nTag: "<<newtime->tm_mday<<endl; //umwandlung der sekunden
cout<<"Monat: "<<newtime->tm_mon+1<<endl;
cout<<"Jahr: "<<newtime->tm_year+1900<<endl;
cout<<"Stunde: "<<newtime->tm_hour<<endl;
cout<<"Minute: "<<newtime->tm_min<<endl;
cout<<"Sekunde: "<<newtime->tm_sec<<endl;

cout<<endl;
cout<<"Parkscheinummer: "<<globalStorage.size()<<endl; //ausgabe der parkscheinnummer
cout<<"\n----------------------------------\n";
}

void parkschein::dauerausgabe()
{
cout<<"Parkscheinnummer: "; //eingabe der Parkscheinnummer und laden der datei zum aufruf
ifstream inFile;
inFile.open ("Parkschein.txt", ios::in | ios::binary);
vector<long int>::iterator ite;
long int buf;
while (inFile)
{
inFile >> buf;
globalStorage.push_back(buf);
}
globalStorage.pop_back();//da immer eine leere Zeile am Ende eingelesen wird diese wieder löschen
inFile.close();

int i=0;
cin>>i;
cout<<"\n_______\nParkdauer: "<<globalStorage.at(i)<<"\n\n"; //Ausagabe des Vektorzeigers
}

void parkschein_einfach::preisausgabe()
{

}

void parkschein_einfach::preissumme()
{

}

void parkschein_einfach::speicher()
{
vector<long int> *in;
ofstream ofFile;
ofFile.open ("Parkschein.txt", ios::out | ios::binary);
vector<long int>::iterator ite;
for (ite = in->begin();
ite != in->end(); ite++)
ofFile << (*ite) << endl;
ofFile.close();
}

void parkschein_dauer::gültigkeitsausgabe()
{

}

parkschein_einfach::parkschein_einfach()
{

}
 
Pack mal bitte deinen Code in [ CPP][/ CPP] tags. Dann kann mans besser lesen.

Hab jetzt grad kein Compiler da um groß auf Fehler-Suche zugehen. Mein Programm hat soweit ich weiß, das eigentlich immer in der richtigen Reihenfolge und Position ausgegeben aus der geladenen Datei. Meinst du vielleicht nicht, dass du das 4te Element anfragts und das 5te ausgegeben wird? Das liegt dann daran, dass beim Vector das erste Element die 0 ist und das zweite halt die 1.
Ergo, wenn du also die 3te Zeit abfragen willst musst du at(2) nehmen.

Falls es das nicht ist, kann ichs mir heut abend nochmal angucken.
 
Zurück