So, ich schon wieder. mein QuellCode ist folgender: #include <fstream.h> #include <iostream.h> #include <conio.h> #include <string.h> #include <stdlib.h> #include <windows.h> char tor[8]; int i=0; int fahrzeug[8]; void einlesen() { ifstream in("TOR.txt"); while(!in.eof()) { char ch; in>>ch; tor[i]=ch; //cout<<ch; //system("PAUSE"); i++; }; } void umwandeln() { for (i=0;i<8; i++) { fahrzeug[i]=(int)tor[i]-48; //cout<<fahrzeug[i]<<endl; } } int berechnen() { int relais1=fahrzeug[0]*1; int relais2=fahrzeug[1]*2; int relais3=fahrzeug[2]*4; int relais4=fahrzeug[3]*8; int relais5=fahrzeug[4]*16; int relais6=fahrzeug[5]*32; int relais7=fahrzeug[6]*64; int relais8=fahrzeug[7]*128; int summe=relais1+relais2+relais3+relais4+relais5+relais6+relais7+relais8; return(summe); } int main() { int relais; do{ Sleep(1000); einlesen(); umwandeln(); relais=berechnen(); cout<<relais; }while(true); getch(); }; und in der TOR.txt steht im moment 00000001 drinn. Aber die TOR.txt wird von einem anderen Programm laufend verändert. Also nehmen wir an, mein Programm läuft, und gibt im sekundentakt 128 aus... jetzt verändert aber das andere Programm den Inhalt der TOR.txt, und nun steht da 11000001 drinn.. Aber anstatt, dass mein laufendes Programm jetzt 132 ausgibt, gibt es weiter 128 aus. Wieso?
Hi du solltes deine geöffnete Datei auch wieder mal zumachen. In einlesen() ein in.close(); einfügen. BTW: Eine Datei ist eine dankbar schlechte Methode zwei Prozesse kommunizieren zu lassen. Du könntest ja zufällig lesen wenn ein Prozess gerade die Hälfte der Datei geschrieben hat. Matthias
irgendwoher kommt mir das bekannt vor ... das mit relais und toren und fahrzeugen.... speicher das zeug einfach in einer datenbank.. .z.b sqlite ... das ist schön klein und einfach... und wenn du das über dateien machen willst solltest du sie öffnen (exklusiv, sprich nur ein prozess darf lesen/schreiben) und wenn du fertig bist kannst sie wieder freigeben.... wennn die prozesse lesen sollen waren sie einfach bis der lock aufgehoben wurde und locken sie selbst... damit sollte eigentlich kein problem mit doppel zugriffen bestehen... wobei ich eine datenbank vorziehen würde... ist einfach schöner und leichter portierbar... wenn du schon unter windows bist könntest du ja eigentlich auch com implementieren und dann einfach die daten über com austauschen lassen.. das ist zumindest eine sichere implementierung... 73
Vergiss erstmal das ganze Gelaber über Datenbanken. Das ist nun wirklich Quatsch. Vielleicht Pipes oder COM. Allerdings hast Du einen fetten Fehler im Programm, der die Ursache ist, klassischer Anfängerfehler :) Versuch einfach mal, in der Funktion einlesen() das i mit 0 zu initialisieren und staune, wie das Ganze dann funktioniert...
OMG... JA klar inTischBeiss Danke Dirk, für den Tipp... @Matthias: brauch ich das in.close(); nicht nur, wenn ich auch in.open(datei, ios::in | ios::nocreate); (oder wie auch immer) gemacht hab? also ohne gehts auch. Trotzdem danke. @Hans: Ja, kann sehr gut sein, dass du das kennst :D hatte das Forum hier schon wegen anderen Sachen zu meinem Projekt zugemüllt .. Das mit der Datenbank bau ich auch noch; also ich versuch es..
> brauch ich das in.close(); nicht nur, wenn ich auch in.open(datei, > ios::in | ios::nocreate); (oder wie auch immer) gemacht hab? > also ohne gehts auch. Trotzdem danke. Du brauchst in.close() nur in den allerseltensten Fällen. std::ifstream ist schließlich eine Klasse und verfügt daher über einen Destruktor. Dieser Destruktor schließt die Datei in jedem Fall, egal wie sie geöffnet wurde. Der einzige Fall, bei dem man std::ifstream::close() wirklich gebrauchen könnte, wäre (soweit ich weiß) eine ifstream-Variable mit größerem Scope, bei der der Destruktor also erst sehr spät aufgerufen werden würde, die Datei aber aus Perfomance-Gründen nicht so lange geöffnet bleiben soll. Bei deinem Fall wäre ein in.close() daher völlig überflüssig und würde andere Leute, die deinen Code lesen, irritieren.
Hi ich persönlich halte es nicht für verwirrend das close() expliziet auszuführen. Dadurch wird noch viel mehr klar was da grade passiert. Aber du hast natürlich Recht das in C++ im Destruktor die Datei geschlossen wird. Ich bin da wohl zu sehr von Java beeinflußt. Matthias
also, mein Programm funktioniert jetzt.. http://www.free-webspace.biz/RaveKev/Projekt/komplett.cpp dafür braucht man dann noch ne Textdatei, namens TOR.txt, in der 8 Bit geschrieben sind.. (ohne leerstellen oder so.. einfach nur z.B: 10011100)
Schoenen Guten Tag ... Wir sollen in der Schule ein Telefonbuchschreiben ... Welches Abfragt ( Name , Strasse , Hausnummer , Nummer , Ort , PLZ ) Wir sollen das mit Dateiarbeit bewältigen . Ihr muesst euch Vorstelen das alles was der Pc einliest in einer Textdatei steht , man es aber trotzdem per Console ( Windows ) Ausgeben kann und auch ueber die Konsole ( per Abfrage ) einlesen kann ... Koennt ihr Pros mir mal ein paar Tipps geben ? Wie soll ich das machen das , das alles per Console geht ?!
> Wie soll ich das machen das , das alles per Console geht ?!
Schau dir mal std::list an. Damit hast du zumindest schonmal eine
einigermaßen geeignete Datenstruktur.
Überleg dir aber zuerst einmal ein Klassen-Design. Also ob z.B. eine
Klasse "Person" o.ä. Sinn macht, die dann Name, Straße etc.
speichert.
Das Abfragen und Ausgeben der Werte wird das geringste Problem sein;
dank cin/cout sollte das relativ problemlos gehen.
Zum Speichern in einer Datei, falls du keine weitere Bibliothek
verwenden willst (was sich für so ein Telefonbuch anbieten würde, aus
pädagogischen Gründen aber eher negativ wäre), schaust du dir mal
ofstream und ifstream an und überlegst dir ein geeignetes Format.
btw:
Der Header für die Datei-Verarbeitungs-Klassen heißt <fstream> und
nicht <fstream.h>. Entsprechendes gilt für <iostream>, <string> und
<cstdlib> (anstelle <stdlib.h>).
Header mit .h am Ende sind veraltet und sollten in C++ praktisch nicht
mehr verwendet werden (gilt natürlich nur für Standard-Header, dass
<windows.h> immer noch auf .h endet ist klar).
Danke für die Tipps war einiges Dabei was ganz nützlich ist ... Melde mich noma wenn ich soweit bin ... !!!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.