Zahl aus einer Datei zwei Mal einlesen
-
gehört nicht wirklich zum thema, aber kann windows das nicht schon?
wenn deine töchter nicht ganz auf den kopf gefallen sind, lässt sich das zu leicht umgehen
beim ersten drübergucken sieht es so aus, als ob du die dateien schließt und nie wieder öffnest.
der einfachste weg wäre wohl über
GetTickCount()(->WinAPI) zu gehen - da kann man auch nicht einfach die uhr umstellen. und dann fallen auch die text-dokumente wegbb
-
M. Barcke schrieb:
Sinn des Programmes ist, dass meine Töchter nur noch zwei Stunden am Tag am Pc spielen können.
Dir ist schon klar, dass sie das Konsolenfenster einfach schließen, im Taskmanager den Prozess abschießen oder die Dateien einfach entsprechend verändern können?
Wenn du es selber machen möchtest, dann solltest du die Registry benutzen, statt main() WinMain nehmen und kein Fenster erzeugen, oder einfach AntiVir nehmen. Das kann dies imho auch und läßt sich auch nicht abschießen.
Und ja, ich denke auch, dass du die Dateien nicht wieder öffnest.
-
M. Barcke schrieb:
Hallo Liebes Forum,
ich habe ein Problem mit meinem Code. Bewege mich zum Teil aber auch auf für mich neuem Gebiet. Das Programm ist auch noch lang nicht fertig.
Sinn des Programmes ist, dass meine Töchter nur noch zwei Stunden am Tag am Pc spielen können.
Mein aktuelles Problem ist, dass das getline im drittem IF irgendeinen Quatsch einließt. Kann man getline nur ein mal pro ifstream nutzen? Habe wirklich keine Ahnung mehr woran es liegen könnte.#include <fstream> #include <iostream> #include <string> #include <sstream> #include <cstring> using namespace std; int verdatum(string); ifstream zeit("C:\\Users\\LPrelle\\Desktop\\time.txt", ifstream::in); ifstream akdatum("C:\\Users\\LPrelle\\Desktop\\akdate.txt", ifstream::in); ifstream datum("C:\\Users\\LPrelle\\Desktop\\date.txt", ifstream::in); int main() { int minuten; string stringtime, stringdate; getline(zeit, stringtime); zeit.close(); stringstream ssmin(stringtime); ssmin >> minuten; getline(datum, stringdate); datum.close(); if ( minuten > 120 && verdatum(stringdate) == 0 ) // Herunterfahren erzwingen ; if ( verdatum(stringdate) != 0 ) //In die Datei "0" schreiben und Datum ersetzen in date.txt ; if ( minuten < 120 ) //5 Addieren wenn weniger als 120 Minuten { int aktuellmin; string minstring; getline(zeit, minstring); zeit.close(); stringstream sstream(minstring); sstream >> aktuellmin; cout << "Min: " << aktuellmin; aktuellmin = aktuellmin+5; cout << endl << "Min: " << aktuellmin <<endl; } system("PAUSE"); return 0; } int verdatum (string date) { string string1; getline(akdatum, string1); stringstream sstr(string1); akdatum.close(); const char *chararray = string1.c_str(); const char *chararray1 = date.c_str(); int b= strncmp( chararray, chararray1, 27); return b; }Vielen Dank für eure Hilfe
Liebe Grüße
M. BarckeBelli schrieb:
M. Barcke schrieb:
Hallo Liebes Forum,
ich habe ein Problem mit meinem Code. Bewege mich zum Teil aber auch auf für mich neuem Gebiet. Das Programm ist auch noch lang nicht fertig.
Sinn des Programmes ist, dass meine Töchter nur noch zwei Stunden am Tag am Pc spielen können.
Mein aktuelles Problem ist, dass das getline im drittem IF irgendeinen Quatsch einließt. Kann man getline nur ein mal pro ifstream nutzen? Habe wirklich keine Ahnung mehr woran es liegen könnte.#include <fstream> #include <iostream> #include <string> #include <sstream> #include <cstring> using namespace std; int verdatum(string); ifstream zeit("C:\\Users\\LPrelle\\Desktop\\time.txt", ifstream::in); ifstream akdatum("C:\\Users\\LPrelle\\Desktop\\akdate.txt", ifstream::in); ifstream datum("C:\\Users\\LPrelle\\Desktop\\date.txt", ifstream::in); int main() { int minuten; string stringtime, stringdate; getline(zeit, stringtime); zeit.close(); [...] getline(zeit, minstring); zeit.close();Ich glaube, die Datei wird zwischendurch nicht wieder geöffnet.
Klar. Funktioniert jetzt super! Liegt warscheinlich an mangelndem Hintergrundwissen.
Ich hab noch eine Frage zum schreib in Dateien:
Wie schreibe ich einen Wert in eine Datei? Bzw in meinem Fall, Wert ersetzen oder einfach Datei mit neuem Wert neu schreiben. Bisheriger versuch:ofstream ozeit("C:\\Users\\LPrelle\\Desktop\\time.txt", ofstream::out); ozeit << aktuellmin;Danke
-
naja - fenster schließen dürfte nicht so einfach gehen, wenn er 2 benutzeraccounts hätte - und auf einem das programm laufen lassen würde und der andere keine admin rechte hat und für die töchter ist - dann sollte es auch nicht möglich sein prozesse von anderen benutzern zu killen...
auf die dateien können sie dann auch nicht zugreifen.
was nichts daran ändert, dass es eine nicht so tolle lösung wäre
allg. ist selber schreiben eine schlechte idee bei so was - es sei denn, man will die töchter damit zwingen, sich mit dem thema pc auseinander zu setzen und hofft, dass sie was dabei lernen, wenn sie versuchen, den elterlichen "schutz" auszuhebeln

bb
ofstream ozeit("C:\\Users\\LPrelle\\Desktop\\time.txt", ofstream::out); ozeit << aktuellmin;guckst du hier: http://www.cplusplus.com/reference/iostream/ofstream/ofstream/
(die flags sollten interessant sein)und du soltlest natürlich den lesenden stream auf die datei zuvor schließen, dann schreiben, dann kannst du wieder lesen - das könntest du auch über den selben stream machen, dann müsstest du nicht darauf achten, dass immer geöffnet und geschlossen wird...
-
Dir ist schon klar, dass sie das Konsolenfenster einfach schließen, im Taskmanager den Prozess abschießen oder die Dateien einfach entsprechend verändern können?
Ich hatte irgendwo gelesen, das man auch einfach das Fenster ausblenden kann. Die Dateien mit der Zeit speicher ich natürlich noch wo ganz anders. Meine Töchter sind 13 und 15 und zum Glück nicht so gut am Pc unterwegs.
da kann man auch nicht einfach die uhr umstellen
Wenn die Uhr umgestellt ist, bin ich der Meinung das es meinem Programm nichts anhaben würde. Das Programm wird alle fünf Minuten ausgeführt, so ist zumindest der Plan.
-
Dein Beispiel zum Datei schreiben funktioniert ja so.
Ohne weitere Flags wird die angesprochene Datei immer wieder neu erstellt und evtl. bereits vorhandene Inhalte überschrieben.Du solltest aber nach jedem expliziten oder impliziten Dateiöffnen den Status abfragen, um feststellen zu können, ob das Öffnen überhaupt geklappt hat - evtl. auch nach Lese- Schreiboperationen, dann findest Du solche Fehler auch selbst.
-
unskilled schrieb:
allg. ist selber schreiben eine schlechte idee bei so was - es sei denn, man will die töchter damit zwingen, sich mit dem thema pc auseinander zu setzen und hofft, dass sie was dabei lernen, wenn sie versuchen, den elterlichen "schutz" auszuhebeln

Wieso ist es eine schlechte Idee? Ich wollte schon immer Programmieren lernen, und da kam mir das gerade recht.
Belli schrieb:
Dein Beispiel zum Datei schreiben funktioniert ja so.
Ohne weitere Flags wird die angesprochene Datei immer wieder neu erstellt und evtl. bereits vorhandene Inhalte überschrieben.Das ist ja interressant, bei mir funktioniert es nämlich nicht.
Kann mir einer erklären was Flags sind?
-
M. Barcke schrieb:
da kann man auch nicht einfach die uhr umstellen
Wenn die Uhr umgestellt ist, bin ich der Meinung das es meinem Programm nichts anhaben würde. Das Programm wird alle fünf Minuten ausgeführt, so ist zumindest der Plan.
also brauchst du wieder ein anderes programm, was dein programm aller 5 minuten ausführt... aber ok - da kannst du wenigstens mit sleep arbeiten - da sollte die uhr auch keine rolle spielen, würde ich mal behaupten wollen...
elegant wird es halt noch immer nicht...
wie läuft das denn? deine töchter machen den pc an und nach 2h soll er einfach wieder runterfahren?
oder soll es auch funktionieren, dass sie den pc anmachen, ne stunde spielen und später noch mal an den pc gehen und wieder 1h spielen dürfen?bb
-
unskilled schrieb:
wie läuft das denn? deine töchter machen den pc an und nach 2h soll er einfach wieder runterfahren?
oder soll es auch funktionieren, dass sie den pc anmachen, ne stunde spielen und später noch mal an den pc gehen und wieder 1h spielen dürfen?bb
Genau so hatte ich mir das gedacht.
Ich dachte mit dem "Ausfgabenplaner" unter Windows liesse sich das gut realifiseren, das alle 5 min auszuführen.Der Code von mir geht übrigens doch, habe nicht bemerkt das Dev-C++ unten einen Fehler angezeigt hatte.
-
dann komm ich aber auf nur 2 nötige dateien.
einmal datum
und einmal die schon vergangene zeit.
man könnte so gar das datum als dateiname nehmen - dann könnte man am ende der woche immer gucken, wie lang sie tatsächlich am pc waren und die differenz vll auf die nächste woche verteilen oder so.aufgabenplaner: als trigger habe ich nur täglich gesehen - und bei bestimmten ereigniss habe ich nirgendwo uhrzeit gefunden - allerdings hab ich auch nicht lang gesucht sondern nur nen blick drauf geworfen.
bb
-
[quote="M. Barcke"]
unskilled schrieb:
habe nicht bemerkt das Dev-C++ unten einen Fehler angezeigt hatte.
Wenn Du gerade Programmieren lernen willst, und somit noch Anfänger bist, und deshalb evtl. mit Dev-C++ auch noch nicht so gut umgehen kannst, dann lerne es erst gar nicht und benutz was anderes; Dev-C++ ist veraltet und wird nicht weiter entwickelt.
Empfehlenswert ist zB VisualStudio Express, das gibt's ebenfalls umsonst. Ist zwar sehr umfangreich und mächtig, aber für Windows-Programmierung (ich hab jetzt mal Windows unterstellt) unschlagbar.
-
Also ich kann einen 5-Minuten-Takt einstellen beim Trigger

Es sind eigentlich auch nur zwei Dateien nötig, da ich es aber nicht hinbekommen hatte
system("date | find \"Aktuelles Datum:\"")in einen String zu schreiben, habe ich einfach eine zweite Datum-Datei genommen.
Nette Idee mit dem Dateiennamen und auch der "Wochenübersicht", schreib ich mir mal auf. Ich bin aber erstmal froh, wenn das alles so klappt wie es soll.
Vielen Dank für euer aller Hilfe, Ihr seit echt ein prima Forum
Liebe Grüße
Martin
-
Mir fällt gerade auf, dass das Problem mit system("date") immer noch besteht.
Und zwar hat man die Möglichekeit bei dem Befehl "date" ein neuen Datum einzugeben, dieses erwartet er auch bei :system("date | find \"Aktuelles Datum:\" > C:\\Users\\LPrelle\\Desktop\\akdate.txt");Also muss ich immer Bestätigen damit er das Programm weiter ausführt. Gibt es einen Befehl so etwas zu unterdrücken?
VisualStudio habe ich auch, nur hat mein Pc Probleme mit dem Programm wie es scheint, oft tauchen Grafikfehler auf oder es lässt sich nicht scrollen.
-
wieso find?
du weist doch, wo die datei liegt...
dann bastelst du dir aus dem datum den namen und dann ists ja nur noch das öffnen.
wenn das fehl schlägt (bzw eine leere datei erstellt wird -> das auslesen fehl schlägt), weist du, dass es der erste aufruf war.ich weiß allerdings nicht, in wie fern der programmaufruf aller 5minuten stört - kein plan, wie der aufgabenplaner arbeitet(kann man minimiert starten? sonst würde man jedes mal den fokus verlieren -> beim schreiben schelcht und beim iwas im fullscreen machen erst recht)
hier hast du jedenfalls eine sehr gute C++-Referenz: http://www.cplusplus.com/reference/
bb
-
M. Barcke schrieb:
VisualStudio habe ich auch, nur hat mein Pc Probleme mit dem Programm wie es scheint, oft tauchen Grafikfehler auf oder es lässt sich nicht scrollen.
den fehler haben viele - aber komischerweise erst seit msvc10 - keine ahnung, weshalb...
zu beheben:tools > optionts > environment > general > use hardware graphics acceleration if available
das sollte _nicht_ aktiviert sein, wenn diese fehler auftreten.bb
zum system-rumgewurschtel: bäh - nutz doch die C++ funktionen, die dafür gedacht sind:
http://www.cplusplus.com/reference/clibrary/ctime/
-
wieso find?
du weist doch, wo die datei liegt...Find sucht ja auch nicht nach der Datei, sondern sucht in dem output von dem Befehl "Date" nach der Zeile wo "Aktuelles Datum" steht und schickt dann das ganz an die Text-Datei. Problem ist das beim Befehl eine Eingabe erwartet wird.
Vielleicht jmd noch eine Idee?
-
Klar, es ist empfehlenswert, sich in die C++ - Bibiotheken für die Datei-Ein/Ausgabe einzuarbeiten.
Man kann sich die Sache aber auch einfach machen :
http://msdn.microsoft.com/en-us/library/ms725501%28VS.85%29.aspx
bzw.
http://msdn.microsoft.com/en-us/library/ms724353%28v=VS.85%29.aspx
Noch einfacher wäre dann die Int-Variante (http://msdn.microsoft.com/en-us/library/ms724345%28VS.85%29.aspx).
Aber wie ich schon geschrieben habe, halte ich es für besser, die Werte in der Registry abzulegen.
Und da ein Aufpoppen eines Fensters alle 5 Minuten doch nervig sein kann, auch wenn du es sofort mit ShowWindow(GetConsoleWindow(),SW_HIDE) verstecken kannst, würde ich bei der Entwicklung die Konsole, später jedoch ein "normales" Windowsprogramm ohne Fenster nehmen.
-
Wie unskilled schon schrieb, stell das Datum mit Funktionen der C-Library fest. Solche 'system' - Aufrufe solltest Du Dir im Idealfall sparen.
-
Ich habe mittlerweile das Programm fertiggestellt. Nur eine Sache hindert mich an der Verwendung :
Vicious Falcon schrieb:
ShowWindow(GetConsoleWindow(),SW_HIDE)
Ich bekomme ShowWindow einfach nicht zum laufen. Habe das gefühlte halbe Internet gelesen, aber ich komme einfach nicht zu einer funktionierenden Antwort.
Habe ebenso schon versucht ein WIN32-Projekt, welches keine Konsole hat, zu erstellen - vergeblich.Mögt Ihr mir noch ein weiteres mal Helfen?
Vielen Dank
-
imho: Erfinder->Rad->Neu ... meist kommen damit 7eckige Räder raus ... rollt ja auch ... irgendwie ...
http://windows.microsoft.com/de-DE/windows/discover/kids-and-computers
http://www.kindersicherung-internet.de/
usw