Das Lesen und schreiben von Binär-Datei in C++
Ich brauche, um eine Datei mit "name" ist ein string -array von char - und "Daten", die Byte-array -array von char in C++, aber das erste problem, das ich konfrontiert ist, wie zu trennen die "Namen" aus den "Daten"? newline-Zeichen arbeiten konnte in diesem Fall (unter der Annahme, dass ich nicht "\n" im Namen), aber ich konnte Sonderzeichen in den "data" - Teil, also es gibt keine Möglichkeit zu wissen, Wann es endet, also ich bin putting einen int-Wert in die Datei, bevor die Daten, die die Größe des "Daten"!
Ich habe versucht, dies mit den code wie folgt:
if((fp = fopen("file.bin","wb")) == NULL)
{
return false;
}
char buffer[] = "first data\n";
fwrite( buffer ,1,sizeof(buffer),fp );
int number[1];
number[0]=10;
fwrite( number ,1,1, fp );
char data[] = "1234567890";
fwrite( data , 1, number[0], fp );
fclose(fp);
aber ich wusste nicht, ob die "int" - Teil war richtig, also habe ich versucht, viele andere codes, einschließlich dieser:
char buffer[] = "first data\n";
fwrite( buffer ,1,sizeof(buffer),fp );
int size=10;
fwrite( &size ,sizeof size,1, fp );
char data[] = "1234567890";
fwrite( data , 1, number[0], fp );
Sehe ich 4 "NULL" - Zeichen in der Datei, wenn ich es öffnen statt zu sehen, eine ganze Zahl. Ist das normal?
Das andere problem, das ich bin vor ist zu Lesen, dass wieder aus der Datei! Der code, den ich versuchte zu Lesen, hat überhaupt nicht funktioniert 🙁 ich habe es versucht mit "fread", aber ich bin mir nicht sicher, ob ich es verwenden soll "fseek" mit, oder es einfach Lesen, die anderen Zeichen nach.
Dachte ich an die Verwendung einer Klasse wie folgt und dann schreiben und Lesen Sie es zurück:
class Sign
{
public:
char* name;
int size;
char* data;
};
aber das war nicht eine einfache Sache, die in C++ !!
Ich habe auch versucht, die folgenden:
void saveData(char* filename) {
fstream filestr;
int n;
n=10;
char* data= "1234567890";
filestr.open (filename, fstream::out | fstream::binary);
for (int j = 0; j<5 ; j++)
{
filestr << n;
for (int i = 0; i < n; i++) {
filestr << data[i];
}
}
filestr.close();
}
void readData(char* filename) {
fstream filestr;
int n =0;
filestr.open (filename, fstream::in | fstream::binary);
int m =0;
//while(!filestr.eof())
while(m<5)
{
filestr >> n;
char *data = new char[n];
for (int i = 0; i < n; i++) {
filestr >> data[i];
}
printf("data is %s\n",data);
m++;
}
filestr.close();
}
Aber das Lesen hat nicht funktioniert entweder.
Auf zu Lesen, ich bin immer seltsame Zeichen.
Bisher der code, der bei mir funktioniert ist:
void saveData(char* filename) {
fstream filestr;
char * name = "first data\n";
int n;
n=10;
char* data= "asdfghjkl;";
filestr.open (filename, fstream::out | fstream::binary);
for (int j = 0; j<5 ; j++)
{
filestr << name;
filestr << strlen(data);
filestr << data;
}
filestr.close();
}
void readData(char* filename) {
fstream filestr;
int n =0;
filestr.open (filename, fstream::in | fstream::binary);
while(!filestr.eof())
{
string name;
getline(filestr,name,'\n');
printf("name is %s\n",name.c_str());
filestr >> n;
char *data = new char[n];
for (int i = 0; i < n; i++) {
filestr >> data[i];
}
printf("n is%d\ndata is %s\n",n,data);
}
filestr.close();
}
aber die Probleme im Lesen sind:
1- (ich glaube nicht, dass es ein echtes problem) es gibt andere Zeichen in das neben den eigentlichen Daten.
2 - auf readData
Funktion bekomme ich die Ausgabe 6 mal (in der letzten Zeit bekomme ich jedes Feld als leeres Feld), während ich geschrieben habe, nur 5 mal! Weiß jemand warum das so ist? ist die mit while(!filestr.eof())
??
Danke für die Hilfe
InformationsquelleAutor Reem | 2010-05-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ersten, die Ihr schreiben /Lesen in binärem format sollte funktionieren wie diese (hier
read_num
enthalten würde10
nach dieser Lektüre-Sequenz).Auch zu erwähnen, diese Art des Schreibens ist nicht der C++ - Weg, aber ist das C Weg. C++ Art von Datei-Operationen bedeutet streams, siehe das folgende Beispiel:
InformationsquelleAutor Costantino Rupert
Gut, ein paar Probleme mit dem code:
Die Funktion ist definiert als:
So, Sie senden die Informationen, die im Puffer, sagen, es hat eine Größe von 1, und die Anzahl der sizeof(buffer). Das funktioniert vielleicht für einige Dinge, aber ist in der Regel nur rückwärts. Versuchen Sie es mit:
Dass beide Charakter-Breite unabhängig und hat keine Konstanten Werte an, die Sie sich sorgen machen müssen (es funktioniert im Prinzip für beliebige Zeichenfolge).
Andere kleinere Sache, in:
Haben Sie eine einzelne ganze Zahl, so müssen Sie nur nutzen:
Wenn Sie in Fehler mit
fwrite
nach der änderung ist es, mit diesem Aufruf:Jener schreiben wird der Wert von einem integer in der Datei.
Nachdem Sie fix, bis, zu sehen, ob Ihr code funktioniert. Es wird sicherlich leichter zu beheben, mit denen Anrufe korrigiert. 🙂
Auch, wenn Sie planen, über die Verwendung Feldlängen (geschrieben als int-Werte in der Datei), die Sie gehen zu wollen, um set-up eine Art von system zum Lesen der Länge, dann werden die Daten, und Sie sollten wahrscheinlich eine Länge für jedes Feld. Die Verwendung einer Klasse ist definitiv der einfachste Weg, damit umzugehen.
Edit:
Sie möchten möglicherweise verwenden Sie eine Struktur und Funktion statt einer Klasse, oder verwenden Sie eine Klasse mit Methoden. Ist es nicht eigentlich egal, beide sind ziemlich einfach. Struct/func:
Strlen(Puffer) wird die Anzahl der Zeichen in den Puffer (z.B. "aaa" zurück 3). Sizeof(buffer) wird wieder die Anzahl der bytes im Puffer. Wenn Sie mit Unicode ein Zeichen werden zwei bytes, so ist der Unterschied signifikant wird. Wie für die ganze Zahl, es sei denn, Sie haben eine riesige Zahl, erwarten, dass ein oder zwei Nullen. In der Datei, die Zahl 32 zu schreiben, wäre wie 0x00 0x00 0x00 0x20.
InformationsquelleAutor ssube