binär speichern - finde fehler einfach net
-
hi!
ich war gerade dabei ein Programm zu schreiben das mir eine Liste aus Strings speichert
Ich will bewusst keine TStringList verwendenes lief ganz gut und plötzlich wurde garnichts mehr nach dem lesen aus der Datei angezeigt
habe also nach und nach Zeilen entfernt in der Hoffnung den Fehler zu finden...
das hier ist was dabei rausgekommen ist:
aber ich sehe einfach den Fehler nicht!!
Sitze schon nen Stunde dran und kom mir verdammt blöd vor...//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include <stdlib.h> #include <stdio.h> #include <iostream> #include "Unit1.h" using namespace std; #include <fstream> //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; int longest(TStringList *a) { int max=0; for(int b=0; b<a->Count;b++) if(a->Strings[b].Length() > max) max = a->Strings[b].Length(); return max; } //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { const int length = 12; const int anzahl = 10; fstream File("List2.dat", ios::out|ios::binary); if (File.is_open()) // Wenn Datei geöffnet ist { File.write((const char*)&length, sizeof(length)); // 1. Länge speichern File.write((const char*)&anzahl, sizeof(anzahl)); // 1. Anzahl speichern File.close(); // Datei schließen } } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { fstream File2("List.dat", ios::in|ios::binary); if (File2.is_open()) { int Size; File2.read((char*)&Size, sizeof(Size)); //Länge lesen int number; File2.read((char*)&number, sizeof(number)); //Anzahl lesen ListBox1->Items->Add(Size); //Länge ausgeben ListBox1->Items->Add(number); //Anzahl ausgeben } File2.close(); } //---------------------------------------------------------------------------Könnt ihr mir helfen??
Schonmal vielen Dank!!!!
MfG Straightflush
-
"habe also nach und nach Zeilen entfernt in der Hoffnung den Fehler zu finden..."
- ist auch 'ne Möglichkeit, die Nutzung des Debuggers jedoch die bessere!
-
danke für den Tipp
aber was soll ich machen wenn der keine Meldung ausspuckt?welche option soll ich da überhaupt nehmen?
Ausdrücke überwachen?kenn mich halt leider garnet aus mit dem ding
-
Hallo
bei FormCreate -> WriteFile "List2.dat"
bei ButtonClick -> ReadFile "List.dat"da ist doch was oberfaul - oder sehe ich das falsch
Mfg
Klaus
-
und ich reg mich da ewig auf!!!!!!!!Sorry das ich euch belästigt habe!
Nochmal vielen Dank!
-
darf ich euch nochmal stören?
Ich hab jetzt versucht ein char binär zu speichern,
der inhalt des char wird aus einem string gewonnen, dieser hat nur 7stellen,
das char array aber hat 9, soll auch so seinhabe ich jetzt abgespeichert und will wieder öffnen bekomme ich die Meldung: "Zugriffsverletzung bei Adresse[...] in Modul rtl60.bpl. Lesen von Adresse [...]
Speicher ich nur den Zeiger ab??
entferne ich das "&"ändert sich zwar der Inhalt der Datei und der gespeicherte "String" ist lesbar, das Problem beim auslesen ändert sich aber nicht...Kann mir einer von euch Profis nochmal helfen?
So schreibe ich in die Datei
TStringList *List = new TStringList; List->LoadFromFile("list.txt"); const int length = longest(List); const int anzahl = List->Count; fstream File("List2.dat", ios::out|ios::binary); if (File.is_open()) // Wenn Datei geöffnet ist { File.write((const char*)&length, sizeof(length)); // 1. Länge speichern File.write((const char*)&anzahl, sizeof(anzahl)); // 1. Anzahl speichern char *buffer1 = new char(length); buffer1 = NULL; List->Strings[0].SetLength(length); buffer1 = List->Strings[0].c_str(); File.write((const char*)buffer1, length); File.close(); // Datei schließen }und so lese ich daraus:
fstream File2("List2.dat", ios::in|ios::binary); if (File2.is_open()) { int Size; File2.read((char*)&Size, sizeof(Size)); //Länge lesen int number; File2.read((char*)&number, sizeof(number)); //Anzahl lesen ListBox1->Items->Add(Size); //Länge ausgeben ListBox1->Items->Add(number); //Anzahl ausgeben char *buffer2 = new char(Size); File2.read((char*)&buffer2, Size); String str = buffer2; ListBox1->Items->Add(str); } File2.close();Straightflush
-
keiner eine Idee/heißen Tipp/Beispiel?
-
Hi ich verstehe nicht wieso du ein *char noch extra in ein (char

verwandeln möchtest (es ist doch schon ein Zeiger)Z.B:
File2.read((char*)&buffer2, Size);
.
.
File2.read(buffer2, Size);
-
Ich glaub ich hab oben gerade Mist geschrieben.... dein Code ist an der Stelle richtig
char *buffer2 = new char(Size+1); // +1und das am Schluss
delete [] ch;
-
Straightflush schrieb:
danke für den Tipp
aber was soll ich machen wenn der keine Meldung ausspuckt?Debuggger spucken keine Meldungen aus sondern sind Handwerkszeuge welche die Option eröffnen den Programmablauf zu überprüfen.
-
morgaehn
ich wuerde es ungefaehr so loesen:
StreamHelper.h
#ifndef StreamHelperH #define StreamHelperH #include <iostream> #include <system.hpp> // wegen AnsiString <- weiß nur net ob das jetz wirklich stimmmt template <class T> void BinaryWrite(std::ostream &out, T val) { out.write(reinterpret_cast<const char*>(&val), sizeof(val)); } template <class T> void BinaryRead(std::istream &in, T &in) { in.read(reinterpret_cast<char*>(&val), sizeof(val)); } template<> void BinaryWrite(std::ostream &out, const AnsiString &str) { BinaryWrite(out, str.Length()); out.write(str.c_str(), str.Length()); } template<> void BinaryRead(std::istream &in, AnsiString &str) { int t_len; // muss gleich gross sein wie sizeof(AnsiString.Length()) BinaryRead(in, t_len); if(!t_len) return; char *buffer = new char[t_len]; in.read(buffer, t_len); str = AnsiString(buffer, t_len); delete[] buffer; } #endifin datei schreiben:
TStringList *List = new TStringList; List->LoadFromFile("list.txt"); std::ofstream datei("liste2.txt", std::ios::binary); BinaryWrite(datei, List->Count()); for(int i = 0;i < List->Count();++i) { WriteBinary(datei, List[i]); } datei.close();aus datei lesen
TStringList my_list; std::ifstream datei("liste2.txt", std::ios::binary); int count; BinaryRead(datei, count); while(count--) { AnsiString temp; BinaryRead(datei, temp); my_list.Add(temp); } datei.close();der source ist ungetestet. nur mal so aus dem kopf geschrieben
Meep Meep