Forum: PC-Programmierung C++ DateiArbeit wird nicht aktualisiert


von RaveKev (Gast)


Lesenswert?

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?

von Matthias (Gast)


Lesenswert?

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

von Hans (Gast)


Lesenswert?

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

von Dirk (Gast)


Lesenswert?

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...

von RaveKev (Gast)


Lesenswert?

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..

von Chris (Gast)


Lesenswert?

> 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.

von Matthias (Gast)


Lesenswert?

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

von RaveKev (Gast)


Lesenswert?

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)

von Pascal (Gast)


Lesenswert?

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 ?!

von Chris (Gast)


Lesenswert?

> 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).

von Pascal (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.