<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Formfragen zu eigens impelementierter Klasse]]></title><description><![CDATA[<p>Hi <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Ich bin noch ziemlicher Anfänger in C++ und hab einige Fragen zu einer Klasse, die ich implementiert habe, um Dateien byteweise zu schreiben und auszulesen. Ich bedanke mich nochmal bei denen, die mir schon in anderen Threads bei einzelnen Sachen behilflich waren.</p>
<p>Ich würde es nett finden, wenn das mal jemand überfliegen könnte. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<pre><code class="language-cpp">#include &lt;fstream&gt;
#include &lt;string&gt;
using namespace std;

class CFilestream {
public:
	CFilestream(wchar_t *filename, char type);
	~CFilestream();

	void write(short value);
	void write(int value);
	void write(float value);
	void write(char *value);

	short readShort();
	int readInt();
	float readFloat();
	string readString();
	// char *readString();

	void closeFile();
private:
	ifstream ifile;
	ofstream ofile;

	char type;
};

CFilestream::CFilestream(wchar_t *filename, char t) {

	type = t;

	if (type == 'r') {
		ifile.open(filename, ios::binary);
		ifile &gt;&gt; std::noskipws;
	} else if (type == 'w')
		ofile.open(filename, ios::binary);
	else
		ifile.open(filename, ios::binary);

}

void CFilestream::closeFile() {

	if (type == 'r')
		ifile.close();
	else if (type == 'w')
		ofile.close();
	else
		ifile.close();

}

void CFilestream::write(short value) {

	short a[2];

	a[1] = value &amp; 0xFF;
	a[0] = value&gt;&gt;8 &amp; 0xFF;

	ofile &lt;&lt; unsigned char(a[0]) &lt;&lt; unsigned char(a[1]);

}

void CFilestream::write(int value) {

	short a[4];

	a[3] = value &amp; 0xFF;
	a[2] = value&gt;&gt;8 &amp; 0xFF;
	a[1] = value&gt;&gt;16 &amp; 0xFF;
	a[0] = value&gt;&gt;24 &amp; 0xFF;

	ofile &lt;&lt; unsigned char(a[0]) &lt;&lt; unsigned char(a[1]) &lt;&lt; unsigned char(a[2]) &lt;&lt; unsigned char(a[3]);

}

void CFilestream::write(char *value) {

	short len = strlen(value);
	write(len);
	unsigned char c;

	for (short i = 0; i &lt; len; i++) {
		c = value[i];
		ofile &lt;&lt; c;
	}

}

int CFilestream::readInt() {

	unsigned char c1,c2,c3,c4;

	ifile &gt;&gt; c1 &gt;&gt; c2 &gt;&gt; c3 &gt;&gt; c4;

	return c1*256*256*256 + c2*256*256 + c3*256 + c4;

}

short CFilestream::readShort() {

	unsigned char c1,c2;

	ifile &gt;&gt; c1 &gt;&gt; c2;

	return c1*256 + c2;

}

// char *CFilestream::readString() {
string CFilestream::readString() {

	string value=&quot;&quot;;
	//char *value;
	value=&quot;&quot;;

	unsigned char c;
	short len = readShort();

	for (short i = 0; i &lt; len+2; i++) {
		ifile &gt;&gt; c;
		value += c;
	}

	return value;

}
</code></pre>
<p>Nun meine Fragen dazu:</p>
<p>1. Was haltet ihr Allgemein vom Codestil? Ist das OK so oder sollte ich mir in C++ einen anderen Stil angewöhnen?</p>
<p>2. Wie man sieht, ist die Methode write() überladen, um short's, int's und strings in die Datei zu schreiben. Bei short's und int's werden die Variablen in ihre Bytes zerlegt und als char's in das file geschrieben. Schreibt man einen String in die Datei, wird zuerst dessen Länge geschrieben und dann die einzelnen Zeichen.<br />
write(float value) würde ich auch noch gerne implementieren. Aber bevor ich das angehen wollte, kam mir der Einfall, dass die Variablentypen ja nicht auf jeder Architektur die gleiche Größe haben. Ich könnte natürlich mit sizeof() die Größen bestimmen. Aber wenn ich die Dateien auf einer anderen Architektur wieder auslesen möchte, weiß ich ja nicht, wie lang ein int/short/float in der Datei ist.</p>
<p>3. Ich weiß noch nicht, wie ich es anstellen soll, aus einzelnen Bytes einen float-Wert zu rekonstruieren. Ich könnte mir denken, dass das ganz einfach geht. Bloß ich weiß leider nicht, wie.</p>
<p>4. Die Methode readString() gibt den Typ string zurück. Dies möchte ich jedoch vermeiden. Da wäre mir der Typ char* am liebsten.</p>
<p>So, das wars erstmal von meiner Seite. Ich wäre euch sehr dankbar, wenn ihr euch das mal kurz anschauen könntet. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/246997/formfragen-zu-eigens-impelementierter-klasse</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 20:07:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/246997.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 04 Aug 2009 18:22:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Formfragen zu eigens impelementierter Klasse on Tue, 04 Aug 2009 18:22:13 GMT]]></title><description><![CDATA[<p>Hi <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Ich bin noch ziemlicher Anfänger in C++ und hab einige Fragen zu einer Klasse, die ich implementiert habe, um Dateien byteweise zu schreiben und auszulesen. Ich bedanke mich nochmal bei denen, die mir schon in anderen Threads bei einzelnen Sachen behilflich waren.</p>
<p>Ich würde es nett finden, wenn das mal jemand überfliegen könnte. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<pre><code class="language-cpp">#include &lt;fstream&gt;
#include &lt;string&gt;
using namespace std;

class CFilestream {
public:
	CFilestream(wchar_t *filename, char type);
	~CFilestream();

	void write(short value);
	void write(int value);
	void write(float value);
	void write(char *value);

	short readShort();
	int readInt();
	float readFloat();
	string readString();
	// char *readString();

	void closeFile();
private:
	ifstream ifile;
	ofstream ofile;

	char type;
};

CFilestream::CFilestream(wchar_t *filename, char t) {

	type = t;

	if (type == 'r') {
		ifile.open(filename, ios::binary);
		ifile &gt;&gt; std::noskipws;
	} else if (type == 'w')
		ofile.open(filename, ios::binary);
	else
		ifile.open(filename, ios::binary);

}

void CFilestream::closeFile() {

	if (type == 'r')
		ifile.close();
	else if (type == 'w')
		ofile.close();
	else
		ifile.close();

}

void CFilestream::write(short value) {

	short a[2];

	a[1] = value &amp; 0xFF;
	a[0] = value&gt;&gt;8 &amp; 0xFF;

	ofile &lt;&lt; unsigned char(a[0]) &lt;&lt; unsigned char(a[1]);

}

void CFilestream::write(int value) {

	short a[4];

	a[3] = value &amp; 0xFF;
	a[2] = value&gt;&gt;8 &amp; 0xFF;
	a[1] = value&gt;&gt;16 &amp; 0xFF;
	a[0] = value&gt;&gt;24 &amp; 0xFF;

	ofile &lt;&lt; unsigned char(a[0]) &lt;&lt; unsigned char(a[1]) &lt;&lt; unsigned char(a[2]) &lt;&lt; unsigned char(a[3]);

}

void CFilestream::write(char *value) {

	short len = strlen(value);
	write(len);
	unsigned char c;

	for (short i = 0; i &lt; len; i++) {
		c = value[i];
		ofile &lt;&lt; c;
	}

}

int CFilestream::readInt() {

	unsigned char c1,c2,c3,c4;

	ifile &gt;&gt; c1 &gt;&gt; c2 &gt;&gt; c3 &gt;&gt; c4;

	return c1*256*256*256 + c2*256*256 + c3*256 + c4;

}

short CFilestream::readShort() {

	unsigned char c1,c2;

	ifile &gt;&gt; c1 &gt;&gt; c2;

	return c1*256 + c2;

}

// char *CFilestream::readString() {
string CFilestream::readString() {

	string value=&quot;&quot;;
	//char *value;
	value=&quot;&quot;;

	unsigned char c;
	short len = readShort();

	for (short i = 0; i &lt; len+2; i++) {
		ifile &gt;&gt; c;
		value += c;
	}

	return value;

}
</code></pre>
<p>Nun meine Fragen dazu:</p>
<p>1. Was haltet ihr Allgemein vom Codestil? Ist das OK so oder sollte ich mir in C++ einen anderen Stil angewöhnen?</p>
<p>2. Wie man sieht, ist die Methode write() überladen, um short's, int's und strings in die Datei zu schreiben. Bei short's und int's werden die Variablen in ihre Bytes zerlegt und als char's in das file geschrieben. Schreibt man einen String in die Datei, wird zuerst dessen Länge geschrieben und dann die einzelnen Zeichen.<br />
write(float value) würde ich auch noch gerne implementieren. Aber bevor ich das angehen wollte, kam mir der Einfall, dass die Variablentypen ja nicht auf jeder Architektur die gleiche Größe haben. Ich könnte natürlich mit sizeof() die Größen bestimmen. Aber wenn ich die Dateien auf einer anderen Architektur wieder auslesen möchte, weiß ich ja nicht, wie lang ein int/short/float in der Datei ist.</p>
<p>3. Ich weiß noch nicht, wie ich es anstellen soll, aus einzelnen Bytes einen float-Wert zu rekonstruieren. Ich könnte mir denken, dass das ganz einfach geht. Bloß ich weiß leider nicht, wie.</p>
<p>4. Die Methode readString() gibt den Typ string zurück. Dies möchte ich jedoch vermeiden. Da wäre mir der Typ char* am liebsten.</p>
<p>So, das wars erstmal von meiner Seite. Ich wäre euch sehr dankbar, wenn ihr euch das mal kurz anschauen könntet. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755273</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755273</guid><dc:creator><![CDATA[th3AddY]]></dc:creator><pubDate>Tue, 04 Aug 2009 18:22:13 GMT</pubDate></item><item><title><![CDATA[Reply to Formfragen zu eigens impelementierter Klasse on Tue, 04 Aug 2009 18:59:20 GMT]]></title><description><![CDATA[<p>Die &lt;&lt; und &gt;&gt; Operatoren auf Streams sind für formatierten Text. Was Du aber willst ist das binäre Lesen und Schreiben. Dafür gibt es dann noch get, read, put, write.</p>
<p>Ich würde auch keine extra Klasse dafür schreiben. Wozu? Du kannst Dir noch diverse Ein/Ausgabe-Funktionen basteln, die ein ostream bzw istream per Referenz entgegennehmen und die Binärdaten per read/write lesen bzw schreiben.</p>
<p>Warum Du immer short-Arrays anlegst und dann doch zu unsigned char castest ist mir ein Rätsel.</p>
<p>Das blöde ist allerdings, dass read/write char* entgegennimmt und man aber besser unsigned char für's Umrechnen benutzt. Da weiß ich auch nicht, wie man das am besten löst.</p>
<p>Achte auch darauf, dass die Wertebereiche der Typen nicht standardisiert wurden. Die Details sind Implementierungs-spezifisch. Siehe <a href="http://home.att.net/~jackklein/c/inttypes.html" rel="nofollow">int types</a>.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755305</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755305</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Tue, 04 Aug 2009 18:59:20 GMT</pubDate></item></channel></rss>