www.mikrocontroller.net

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


Autor: RaveKev (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: RaveKev (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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..

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: RaveKev (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Pascal (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?!

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Pascal (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Tipps war einiges Dabei was ganz nützlich ist ... Melde
mich noma wenn ich soweit bin ... !!!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.