Nullzeichen in String ignorieren
-
Hallo zusammen,habe mal wieder voll das Problem.
Ich lese mehrere Dateien ein und verarbeite sie nacheinander. Bis jetzt funktionierte auch alles , bis heute eine Datei auftauchte die anstatt der Leerzeichen nun mit mal Nullzeichen enthält. Prog. hängt sich beim Lesen an dieser Stelle dann auf, weil es nicht weiter ließt.infile >> buff; while ( !infile.eof() ) ....Code..... if (Memo2->Lines->Strings[string_counts] == "")// Nullzeichen erkannt infile >> buff; // Weiterlesen
Wenn ich jetzt debugge komme ich bis zum Nullzeichen, aber buff wird nicht mit dem nächsten Zeichen oder String gefüllt.
Wie kann ich erreichen, dass egal wieviele Nullzeichen auftreten, weitergelesen wird, also die Nullzeichen einfach ignorieren?Danke für jede Antwort.
-
Realtime schrieb:
Wie kann ich erreichen, dass egal wieviele Nullzeichen auftreten, weitergelesen wird
Datei vorher binär öffnen und Nullzeichen durch Leerzeichen ersetzen.
-
Danke für die schnelle Antwort
Jansen schrieb:
Datei vorher binär öffnen und Nullzeichen durch Leerzeichen ersetzen.
Dann müßte ich ja alles über den Haufen werfen. Ich mache es nämlich mit ifstream.
ifstream infile(s.c_str()); // Öffnen infile >> buff; while ( !infile.eof() ) {int z = 0; Memo2->Lines->Add(buff); // Datei in Memo2 einlesen // alle Daten aus Datei auslesen und zuordnen // [Version] suchen if (Memo2->Lines->Strings[string_counts] == "[VERSION]") z=1; if (Memo2->Lines->Strings[string_counts] == "") infile >> buff; switch (z){ case 1:{// Anzahl VERSION speichern anz_version++; Label_Version[anz_version] = string_counts; //speichert den Ort von Version string_counts++; break; } default: string_counts++; break; } infile >> buff; // Weiterlesen }
HAst du einen tip wie das am schnellsten geht?
Danke
-
Wieso? fstream unterstützt doch auch binäre Ströme?
-junix
-
ja, ich habe mich nochmal belesen. Ich werde dann jetzt mal fstream verwenden.
Danke.
-
Du kannst auch weiter ifstream verwenden. fstream ist nur die "Zusammenfügung" von ifstream und ofstream.
-junix
-
junix schrieb:
Du kannst auch weiter ifstream verwenden. fstream ist nur die "Zusammenfügung" von ifstream und ofstream.
-junix
ok, die Datei mit ifstream binär zu öffnen, ist ja klar.
Aber ich hänge irgendwie in der Zeile wo ich die Nullzeichen mit Leerzeichen beschreiben soll.ifstream infile(s.c_str(), ios:binary); // Öffnen binär infile >> buff; while ( !infile.eof() ) .... if (Memo2->Lines->Strings[string_counts] == "")// Nullzeichen erkannt ... ???? infile >> buff; // Weiterlesen
Kannst Du mir mal auf die Sprünge helfen?
Danke
-
Jo, aber für mehr als auf die Sprünge helfen habich grad nicht genug Zeit. Folgendes: wenn dud ie Daten Binär ausliest, dann musst du die Strings solange binär behandeln, bis die leerzeichen eingefügt sind. Das heisst, du darfst keine Stringfunktionen benutzen und der >> Operator (der eh schrott ist) fällt auch flach. benutz die normalen Read-funktionen
Aber nur mal so aus Neugierde: was gibt das eigentlich wenns fertig ist? ein INiFile das binärdaten speichern kann?
-junix
-
Vielleicht hilft Dir das hier weiter:
#include <iostream> #include <algorithm> #include <iterator> #include <fstream> #include <string> using namespace std; int main(int argc,char * argv[]) { ifstream file("t:\\1.dmp",ios::binary); if(!file) return 20; size_t pos; file.seekg(0,ios::end); pos = file.tellg(); file.seekg(0,ios::beg); istreambuf_iterator<char> begin(file); istreambuf_iterator<char> end; string binaryData; binaryData.reserve(pos); binaryData.resize(pos); copy(begin,end,binaryData.begin()); replace(binaryData.begin(),binaryData.end(),'\0',' '); copy(binaryData.begin(),binaryData.end(),ostream_iterator<char>(cout)); return 0; }
Ahso mit binaryData.data() kommst Du an die rohdaten. (Es wird aber kein \0 am ende angefügt)
-
junix schrieb:
Aber nur mal so aus Neugierde: was gibt das eigentlich wenns fertig ist? ein INiFile das binärdaten speichern kann?
-junix
Ist vielleicht kompliz. zu erklären, aber ich versuche es mal
Es soll dazu dienen, dass eine techn. Maschine für jede Kalibrieung ein Art logfile erzeugt. (Textformat) Diese sollen alle automatisch eingelesen werden und untereinander verglichen werden. Jede Datei kann verschiedene viele Kalibrierungsdaten enthalten. Diese Dateien haben min und max Werte und einen gemessenen Wert, der Aufschluß über die Genauigkeit gibt, woraus man sich dann gleich ein Bild machen kann. Mein Kollege hatte früher immer alle Dateien von Hand geöffnet und die Werte in eine Exeltab. geschrieben. Ich will einfach nur diesen mühseligen Schritt umgehen.