zahl in datei speichern und wieder auslesen

Supa

Erfahrenes Mitglied
hallo... ich will einen kleines rechen programm schreiben, das das ergebniss in eine datei speichert, damit ich dieses bei einem programm neustart wieder zum weiterrechner benutzen kann.

folgender lösungsansatz ist bereits vorhanden:

Code:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   FILE *stream;
   stream = fopen("test.abc", "w+");
   fprintf(stream, "%d", StrToInt(Edit1->Text));
   fclose(stream);
}
bis hier hin das auch wunderbar. ich geb eine zahl im TEdit1 ein und die wird als text in die datei "test.abc" geschrieben.

dann wollte ich die zahl aus der datei wie folgt wieder auslesen:
Code:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
   FILE *stream;
   char test[9];

   stream = fopen("test.abc", "r");
   fread(test, 9, 1, stream);
   Edit2->Text=test;
   fclose(stream);
}

wenn ich jetzt auf den zweiten butten drücke, schreibt er auch die zahl aus der datei in das zweite TEdit2.

nun zum problem: wenn in der datei eine zahl mit 4 oder 8 zeichen, z.b. "1234" oder "12345678" steht, wird mir in Edit2 so ein komisches "zeichen-wirr warr" ("xÍ") mit angehangen. und dann lässt sich der string logischerweise nicht mehr in eine integer zahl umwandeln und ich kann nicht mehr damit rechnen.

also, wäre nett, wenn mir jemand sagen könnte, wie ich dieses "zeichen wirr warr" wieder weg bekomme, bzw. noch besser, wie ich machen kann, das es garnicht erst endsteht.

herrzlichen dank schonmal

mfg Dennis
 
ja, das hab ich bereits mit der zeile:
Code:
_fmode= O_BINARY;
versucht... es ändert sich jedoch nichts.

Edit:
wenn ich mir die erstellte datei in einem texteditor anschaue, sind diese "komischen zeichen" auch nicht da.
ich denke mal, das der fehler sich beim auslesen der datei dazwischen mogelt.
 
Zuletzt bearbeitet:
es ist völlig egal, wieviele zeichen ich auslese! ich könnte auch die länge festellen, und die dann statt der 9 hinschreiben, das ändert aber nichts an der tatsache, das bei 4 und 8 zeichen, immer so ein wirr warr dahinter gesetzt wird.

hast du das mal ausprobiert, oder stützen sich deine vorschläge und ideen nur auf spekulationen? (nicht das das schlimm wäre, schließlich bist du im moment der einzige, der versucht zu helfen)

9 zeichen, weil sich mehr als neun zeichen nicht sicher in Integer umwandeln lassen.
 
Code:
...
   FILE *stream;
   char test[9];

   stream = fopen("test.abc", "r");
   fread(test, 9, 1, stream);
   Edit2->Text=test;
   fclose(stream);
}

Edit2->Text = text

weisst du, was das macht?
Von welchem Typ ist denn Edit2->Text?
char* Edit2->Text; ?
Wenn ja: das stellt den Zeiger auf eine lokale, also nur temporär gültige Addresse ein.
Effekt ist, dass wahrscheinlich beim nächsten Funktionsaufruf einer beliebigen Funktion, der String überschrieben wird.
(Nur nebenbei bemerkt, würde das auch zu einem Speicherleck führen)
Aber wenns std::string oder so ist, will ich ja mal nix sagen...

Ausserdem ist es sehr unschön, fread(..9,1,..) zu verwenden.
Das liest einfach nur bis zu 9 Bytes ein. Das darauffolgende Byte wird dann nicht '\0' gesetzt, ausserdem, deswegen wird ja auch so ein Zeichengewirr angehängt -> weil der String nicht an der richtigen Stelle terminiert wird, wenn du Pech hast, wird er nicht mehr terminiert, bevor er in prozessfremden Speicher gelangt und das führt dann zum Programmabsturz wegen nicht genemigtem Lese-Zugriff. Willst du das umgehen könntest du zB einfach das ganze Array bei Initialisierung '\0' setzen und dafür um 1 länger machen.
...... naja, da gibts weitere Gründe, die dagegen sprechen, es so zu machen (fread(...)), auch wenn sie mir grade nicht einfallen.. ;)

mach doch lieber sowas ähnliches wie:
Code:
int val;
fscanf(stream,"%d",&val); //wenn du schon fprintf benutzt.
IntToStr(Edit2->Text,val); //such dir sowas, oder mach es selber...
 
ja, das mit der terminierung durch "\0" hab ich auch gerade gelesen! ich werd das gleich mal ausprobieren.

das das mit fread(...,9,1...) nicht schön ist, weis ich auch! es soll auch erstmal nur ein test sein, ob das überhaupt funktionieren würde. deshalt hab ich mir da jetzt nicht die mühe gemacht und keine routine zum festellen der länge geschrieben. kommt aber sicherlich noch ;)

naja... und wenn jemand eine andere/bessere idee hat, wie mal eine zahl oder einen AnsiString speichern kann, um sie dann beim erneuten programm aufruf wieder benutzen zu können, dann kann er diese hier gerne posten. ich bin nicht auf fread/fprintf fixiert, das waren nur meine ersten schritte in diese richtung!
bei den programmen die ich bis jetzt geschrieben hab, musste ich nie werte speicher um sie nach einem neustart wieder auszulesen. ich hatte da alles in datenbanken gespeichert.
 
edit: der post, kann gelöscht werden! der doppelpost war ein versehen!
 
Zuletzt bearbeitet:
also, das mit dem iostream in eine datei schreiben funktioniert ja ganz gut. danke für den tipp. das ist auch ne nummer einfacher als mit fprintf ;)
allerdings klappt das mit den auslesen immernoch nicht so richtig!

auslesen könnte man die datei ja dann mit:
Code:
ifstream x("test.txt");
x >> Edit1->Text;
aber das funktioniert irgendwie nicht richtig. der compiler spuckt folgende Fehlermeldung aus:

[C++ Fehler] Unit1.cpp(213): E2094 'operator>>' ist im Typ 'ifstream' für Argumente des Typs 'AnsiString' nicht implementiert

woran liegt das und wie kann ich mir da abhilfe schaffen?
 

Neue Beiträge

Zurück