In Datei scheiben klappt nicht
-
Hallo, ich habe bereits so ziemlich alles erdenkliche probiert, aber warum gibt mir das Programm bei folgendem Code anstatt "Halloooo" nur "Hall" aus?
#include <iostream> #include <fstream> int main () { const char *sout = "Halloooo"; char *dest = new char [strlen (sout)]; std::ofstream out ("test.txt", std::ios::binary); out.write (sout, sizeof (sout)); out.close (); std::ifstream in ("test.txt", std::ios::binary); in.read (dest, sizeof (sout)); std::cout << dest; // Da wird nur Hall ausgegeben... std::cin.get (); }Danke!
-
out.write (sout, sizeof (sout));sizeof liefert dir nur die größe des des char Pointers. Nicht die länge des Strings, die du brauchst. Also:
out.write (sout, strlen(sout));
-
sizeof()=>strlen()außedem forderst Du zuwenig Speicher an: C-Strings sind nullterminiert, d.h. Du musst noch ein zusätzliches Zeichen anfordern.
Und drittens schmeiß die C-Strings weg und verwende std::string.
-
Okay danke, schon ist mir geholfen.
Konrad Rudolph schrieb:
Und drittens schmeiß die C-Strings weg und verwende std::string.
Kann ich nicht, da ich mit PODs und somit elementaren Datentypen arbeiten muss.
-
CodeOriginator schrieb:
Konrad Rudolph schrieb:
Und drittens schmeiß die C-Strings weg und verwende std::string.
Kann ich nicht, da ich mit PODs und somit elementaren Datentypen arbeiten muss.
Warum das?!
-
Aus dem Grund:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-196447-and-postdays-is-0-and-postorder-is-asc-and-start-is-0.html

-
#include <iostream> #include <fstream> int main () { const char* write_string = "Halloooo"; std::ofstream out ("test.txt", std::ios::binary); if (!out) return 1; std::size_t length(std::strlen(write_string) + 1); out.write(reinterpret_cast<const char*>(&length), sizeof(std::size_t)); out.write(write_string, sizeof(char) * length); out.close(); std::cout << "Write: " << write_string << std::endl; std::ifstream in("test.txt", std::ios::binary); if (!in) return 1; in.read(reinterpret_cast<char*>(&length), sizeof(std::size_t)); char* read_string = new char[length]; in.read(read_string, sizeof(char) * length); std::cout << "Read: " << read_string << std::endl; // Da wird nur Hall ausgegeben... std::cin.get (); }
-
Danke (D)evil... Jetzt bin ich aber depremiert, weil ich es selber nicht geschafft habe

-
CodeOriginator schrieb:
Aus dem Grund:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-196447-and-postdays-is-0-and-postorder-is-asc-and-start-is-0.html

Was hat das damit zu tun? Die Quintessenz des anderen Threads war *nicht* „benutz nur POD-Typen“ sondern „Überlad << und >> für Deine Struktur.“
-
Konrad Rudolph schrieb:
Was hat das damit zu tun? Die Quintessenz des anderen Threads war *nicht* „benutz nur POD-Typen“ sondern „Überlad << und >> für Deine Struktur.“
Oder auch beides
Nur dass die Operatorüberladung nicht zwingend notwendig, sondern eine Designfrage ist.