P
Ja so ist es ja auch.
Ein Leerzeichen ist wenn du so willst nichts anderes wie ein Buchstabe oder eine Zahl. Die ganzen string funktionen wie strlen, strcmp, strcpy gehen immer von Null-terminierten chars aus. Philosphie anderer Programmiersprachen früher war, dass am Anfang die Größe des Strings stand und darauf die Zeichen kamen.
Es hat sich halt so eingebürgert, dass man entweder die Länge eh schon weiß oder es eben nicht auf die Länge drauf ankommt. Also ein strcpy liest immer ein Zeichen, kopiert es. Wenn es 0 war fertig, ansonsten nächstes Zeichen lesen. Uninteressant wie lang der string ist.
Bei Dateien kannst du alle Zeichen abspeichern, auch 0 Bytes. Denn das Filesystem arbeitet mit Längen. Wenn du aber aus C++ ein write aufrufst mit Angabe des chars, muss dieser Null-terminiert sein, oder du gibst die gewünschte Länge mit an und es wird in die Datei die gesamte Länge geschrieben.
Überleg mal was die Ausgaben hier wohl sein werden:
cout << sizeof("Hallo")<<endl;
cout << strlen("Hallo")<<endl;
Hier eine Lösung:
template <class X> void dateischreiber (X datensatz, size_t size, int zeigerPosition) {
fstream songstream ("Song.txt",ios::out|ios::in);
songstream.seekp (zeigerPosition, ios::beg);
if (songstream.good()) {
songstream.write(&datensatz, size);
} else {
cerr << "Bibliothek beschädigt oder nicht auffindbar! \n";
system("PAUSE");
}
songstream.close();
}
char hallo[100] = "Hallo"; // Hallo\0\0\0\0\0\0...
char x[100] = "x"; // x\0\0\0\0\0\0...
dateischreiber(hallo, sizeof(hallo), 0); // schreibt 100 Zeichen
dateischreiber(x, sizeof(hallo), 0); // schreibt auch 100 Zeichen
// File: x\0\0\0\0\0\0\0...
dateischreiber(hallo, sizeof(hallo), 0); // schreibt 100 Zeichen
dateischreiber(x, strlen(hallo), 0); // schreibt 1 Zeichen
// File: xallo\0\0\0\0\0\0...
Der << Operator wurde ungefähr so überschrieben:
ostream &operator<<(ostream &stream, const char *string)
{
stream.write(string, strlen(string));
return stream;
}