<?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[vector &amp;lt;struct&amp;gt; in Datei schreiben und einlesen]]></title><description><![CDATA[<p>Ich habe versucht folgendes zu programmieren. In einer Headerdatei Header.h habe ich folgendes struct definiert:</p>
<pre><code class="language-cpp">struct Struct
	{
	    Struct( string e_, string d_, string k_, bool m_ )
	        : Param1( e_ ), Param2( d_ ), Param3( k_), Param4( m_)
	    {}
		string Param1;
		string Param2;
		string Param3;
		bool Param4;

	    // Struktur mit operatoren zum Lesen und Schreiben derselben ausstatten
	    friend std::ostream&amp; operator&lt;&lt;( std::ostream&amp; out, const Struct&amp; s )
	    {
	        return out &lt;&lt; s.Param1 &lt;&lt; &quot;|&quot; &lt;&lt; s.Param1 &lt;&lt; &quot;|&quot; &lt;&lt; s.Param1 &lt;&lt; &quot;|&quot; &lt;&lt; s.Param4; 
	    }
	    friend std::istream&amp; operator&gt;&gt;( std::istream&amp; in, Struct&amp; s )
	    {
	    	getline(in, s.Param1, '|');
	    	getline(in, s.Param2, '|');
	    	getline(in, s.Param3, '|');
	    	in &gt;&gt; s.Param4;
	        return in;
	    }
	};
</code></pre>
<p>und außerdem habe ich in Header.h folgendes definiert.</p>
<pre><code class="language-cpp">Vector &lt;Struct&gt; vs;
</code></pre>
<p>In der main.cpp lege ich einen vector &lt;Struct&gt; vs an und fülle einen Vektor v wie folgt: Ausserhalb der main definiere ich</p>
<pre><code class="language-cpp">Header v;
</code></pre>
<p>Dann schreibe ich in der main:</p>
<pre><code class="language-cpp">int abbruch = 1;
	int s = 0;
	while ( abbruch != 0) {

		string Param1;
		string Param2;
		string Param3;

		cout &lt;&lt; &quot;Geben Sie Param1 ein:&quot; &lt;&lt;endl;
		getline(cin, Param1);
		cout &lt;&lt;&quot;\nGeben sie Param2 ein:&quot; &lt;&lt;endl;
		getline(cin, Param2);
		cout &lt;&lt; &quot;\nGeben Sie Param3 ein:&quot; &lt;&lt; endl;
		getline(cin, Param3);
		v.vs.push_back(Header::Struct (Param1, Param2, Param3, 0));

		cout &lt;&lt; &quot;\n\nFalls Sie keine weiteren Daten eingeben wollen, dann drücken Sie '0'.&quot; &lt;&lt;endl;
		cout &lt;&lt; &quot;Für weitere Eingaben drücken sie '1'.&quot; &lt;&lt;endl;
		s = cinint(0, 1);
		if ( s == 0)
			abbruch = 0;		
	}
</code></pre>
<p>Die Funktion cinint ist in der main.cpp wie folgt definiert:</p>
<pre><code class="language-cpp">int cinint(int minint, int maxint){
    int wahl = 0;
    while ( ( !(cin &gt;&gt; wahl) || !( wahl &gt;= minint &amp;&amp; wahl &lt;= maxint) ) ) {
    	cout &lt;&lt; &quot;\n Sie müssen eine Zahl von &quot; &lt;&lt; minint &lt;&lt; &quot; bis &quot; &lt;&lt; maxint &lt;&lt; &quot; eingeben!&quot; &lt;&lt;endl;
        // falsche Eingabe
        std::cin.clear();
        std::cin.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(),'\n');
    }
    return wahl;
}
</code></pre>
<p>Ich möchte v in eine Datei schreiben und wieder auslesen. Dazu habe ich in Header.cpp folgende Funktionen definiert:</p>
<pre><code class="language-cpp">void Header::toFile(const char* filename) {
        ofstream file( filename );
        file &lt;&lt; vs.size() &lt;&lt; endl; // Anzahl schreiben ist eine gute Sache
        copy( vs.begin(), vs.end(), ostream_iterator&lt; Sruct &gt;( file, &quot;\n&quot; ) );
	}
</code></pre>
<p>und</p>
<pre><code class="language-cpp">void Header::fromFile(const char* filename)
	{
		ifstream fileIn;
		fileIn.open( filename);

		if( !fileIn )
			cout &lt;&lt; &quot;Could not open the input file!&quot; &lt;&lt;endl;
		else
		{				
			size_t n;
			fileIn &gt;&gt; n; // Anzahl lesen
			cout &lt;&lt; &quot;Anzahl der zu ladenden Elemente = &quot; &lt;&lt; n &lt;&lt; endl;

			for ( int i = 0; i &lt; n; ++i)
			{
				string dummy1;
				string dummy2;
				string dummy3;
				bool  dummy4;			

				fileIn &gt;&gt; dummy1 &gt;&gt; dummy2 &gt;&gt; dummy3 &gt;&gt; dummy4;
				vs.push_back(Header::Struct (dummy1 , dummy2, dummy3, dummy4));
			}
		}	
	}
</code></pre>
<p>Das Schreinen in eine Datei funktioniert: so erhalte ich z.B. die Datei filename.txt</p>
<p>2<br />
das ist|genauso wie|es sein soll|0<br />
leider ist| es doch nicht|ganz richtig|0</p>
<p>Ich versuche nun in der main.cpp aus der Datei filename.txt zu lesen, indem ich folgende Funktion geschrieben habe:</p>
<pre><code class="language-cpp">void Datensatzladen(Header &amp;vos)
{
	char* filename = new char[1000];	
	cout &lt;&lt; &quot;Bitte geben Sie einen Dateinamen der Form 'filename.txt' ein!&quot; &lt;&lt; endl;	
	cout &lt;&lt; &quot;\n Dateiname ? &quot;;
	cin &gt;&gt; filename;	
	ifstream fileIn;

	vos.fromFile(filename);

	delete[] filename;	
	cout &lt;&lt; &quot;\nLaden der Daten beendet! Es wurden &quot; &lt;&lt; vos.vs.size() &lt;&lt; &quot; Datensätze geladen.\n&quot; &lt;&lt; endl;
}
</code></pre>
<p>Leider funktioniert das einlesen nicht. Als Trennzeichen wird nicht | verwendet sondern, das erste Leerzeichen, d.h. die Datensätze werden beim ersten Leerzeichen getrennt und nicht wie gewünscht beim |.</p>
<p>Alternativ hatte ich folgendes versucht:</p>
<p>In der main habe ich die while Schleife wie folgt geändert:</p>
<pre><code class="language-cpp">while ( abbruch != 0) {
                char* Param1 = new char[1000];
                char* Param2 = new char[1000];
                char* Param3 = new char[1000];
                cout &lt;&lt; &quot;Geben Sie Param1 ein:&quot; &lt;&lt;endl;
                cin &gt;&gt; Param1;
                cout &lt;&lt;&quot;\nGeben Sie Param2 ein:&quot; &lt;&lt;endl;
                cin &gt;&gt; Param2;
                cout &lt;&lt; &quot;\nGeben Sie Param3 ein:&quot; &lt;&lt; endl;
                cin &gt;&gt; Param3;
                v.vs.push_back(Header::Struct (Param1, Param2, Param3, 0));
                cout &lt;&lt; &quot;\n\nFalls Sie keine weiteren Daten eingeben wollen, dann drücken Sie '0'.&quot; &lt;&lt;endl;
                cout &lt;&lt; &quot;Für weitere Eingaben drücken sie '1'.&quot; &lt;&lt;endl;
                s = cinint(0, 1);
                if ( s == 0)
                        abbruch = 0;
        }
</code></pre>
<p>In der Header.h habe ich alle string durch char* ersetzt und in der Header.cpp habe ich</p>
<pre><code class="language-cpp">char* dummy1 = new char[1000];
                                char* dummy2 = new char[1000];
                                char* dummy3 = new char[1000];
</code></pre>
<p>definiert.<br />
Leider kann ich auch so die Datensätze nicht aus der Datei einlesen<br />
Ich habe folgende Fragen:<br />
1. Wie kann ich meinen vector &lt;Struct&gt; aus der Datei einlesen?<br />
2. Wieso funktionieren meine beiden Ansätze nicht?<br />
3. Später möchte ich einzelne Elemente meines vector &lt;struct&gt; ersetzen, also in der Form v.vs[1].Param2 = „so ist es“;<br />
Kann ich das so einfach machen oder ist meine Struct und Vector &lt;Struct&gt; vs; dafür schlecht definiert?<br />
Für Antworten wäre ich sehr dankbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/304238/vector-lt-struct-gt-in-datei-schreiben-und-einlesen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 09 Aug 2026 21:02:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/304238.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 01 Jun 2012 16:22:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to vector &amp;lt;struct&amp;gt; in Datei schreiben und einlesen on Fri, 01 Jun 2012 16:22:50 GMT]]></title><description><![CDATA[<p>Ich habe versucht folgendes zu programmieren. In einer Headerdatei Header.h habe ich folgendes struct definiert:</p>
<pre><code class="language-cpp">struct Struct
	{
	    Struct( string e_, string d_, string k_, bool m_ )
	        : Param1( e_ ), Param2( d_ ), Param3( k_), Param4( m_)
	    {}
		string Param1;
		string Param2;
		string Param3;
		bool Param4;

	    // Struktur mit operatoren zum Lesen und Schreiben derselben ausstatten
	    friend std::ostream&amp; operator&lt;&lt;( std::ostream&amp; out, const Struct&amp; s )
	    {
	        return out &lt;&lt; s.Param1 &lt;&lt; &quot;|&quot; &lt;&lt; s.Param1 &lt;&lt; &quot;|&quot; &lt;&lt; s.Param1 &lt;&lt; &quot;|&quot; &lt;&lt; s.Param4; 
	    }
	    friend std::istream&amp; operator&gt;&gt;( std::istream&amp; in, Struct&amp; s )
	    {
	    	getline(in, s.Param1, '|');
	    	getline(in, s.Param2, '|');
	    	getline(in, s.Param3, '|');
	    	in &gt;&gt; s.Param4;
	        return in;
	    }
	};
</code></pre>
<p>und außerdem habe ich in Header.h folgendes definiert.</p>
<pre><code class="language-cpp">Vector &lt;Struct&gt; vs;
</code></pre>
<p>In der main.cpp lege ich einen vector &lt;Struct&gt; vs an und fülle einen Vektor v wie folgt: Ausserhalb der main definiere ich</p>
<pre><code class="language-cpp">Header v;
</code></pre>
<p>Dann schreibe ich in der main:</p>
<pre><code class="language-cpp">int abbruch = 1;
	int s = 0;
	while ( abbruch != 0) {

		string Param1;
		string Param2;
		string Param3;

		cout &lt;&lt; &quot;Geben Sie Param1 ein:&quot; &lt;&lt;endl;
		getline(cin, Param1);
		cout &lt;&lt;&quot;\nGeben sie Param2 ein:&quot; &lt;&lt;endl;
		getline(cin, Param2);
		cout &lt;&lt; &quot;\nGeben Sie Param3 ein:&quot; &lt;&lt; endl;
		getline(cin, Param3);
		v.vs.push_back(Header::Struct (Param1, Param2, Param3, 0));

		cout &lt;&lt; &quot;\n\nFalls Sie keine weiteren Daten eingeben wollen, dann drücken Sie '0'.&quot; &lt;&lt;endl;
		cout &lt;&lt; &quot;Für weitere Eingaben drücken sie '1'.&quot; &lt;&lt;endl;
		s = cinint(0, 1);
		if ( s == 0)
			abbruch = 0;		
	}
</code></pre>
<p>Die Funktion cinint ist in der main.cpp wie folgt definiert:</p>
<pre><code class="language-cpp">int cinint(int minint, int maxint){
    int wahl = 0;
    while ( ( !(cin &gt;&gt; wahl) || !( wahl &gt;= minint &amp;&amp; wahl &lt;= maxint) ) ) {
    	cout &lt;&lt; &quot;\n Sie müssen eine Zahl von &quot; &lt;&lt; minint &lt;&lt; &quot; bis &quot; &lt;&lt; maxint &lt;&lt; &quot; eingeben!&quot; &lt;&lt;endl;
        // falsche Eingabe
        std::cin.clear();
        std::cin.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(),'\n');
    }
    return wahl;
}
</code></pre>
<p>Ich möchte v in eine Datei schreiben und wieder auslesen. Dazu habe ich in Header.cpp folgende Funktionen definiert:</p>
<pre><code class="language-cpp">void Header::toFile(const char* filename) {
        ofstream file( filename );
        file &lt;&lt; vs.size() &lt;&lt; endl; // Anzahl schreiben ist eine gute Sache
        copy( vs.begin(), vs.end(), ostream_iterator&lt; Sruct &gt;( file, &quot;\n&quot; ) );
	}
</code></pre>
<p>und</p>
<pre><code class="language-cpp">void Header::fromFile(const char* filename)
	{
		ifstream fileIn;
		fileIn.open( filename);

		if( !fileIn )
			cout &lt;&lt; &quot;Could not open the input file!&quot; &lt;&lt;endl;
		else
		{				
			size_t n;
			fileIn &gt;&gt; n; // Anzahl lesen
			cout &lt;&lt; &quot;Anzahl der zu ladenden Elemente = &quot; &lt;&lt; n &lt;&lt; endl;

			for ( int i = 0; i &lt; n; ++i)
			{
				string dummy1;
				string dummy2;
				string dummy3;
				bool  dummy4;			

				fileIn &gt;&gt; dummy1 &gt;&gt; dummy2 &gt;&gt; dummy3 &gt;&gt; dummy4;
				vs.push_back(Header::Struct (dummy1 , dummy2, dummy3, dummy4));
			}
		}	
	}
</code></pre>
<p>Das Schreinen in eine Datei funktioniert: so erhalte ich z.B. die Datei filename.txt</p>
<p>2<br />
das ist|genauso wie|es sein soll|0<br />
leider ist| es doch nicht|ganz richtig|0</p>
<p>Ich versuche nun in der main.cpp aus der Datei filename.txt zu lesen, indem ich folgende Funktion geschrieben habe:</p>
<pre><code class="language-cpp">void Datensatzladen(Header &amp;vos)
{
	char* filename = new char[1000];	
	cout &lt;&lt; &quot;Bitte geben Sie einen Dateinamen der Form 'filename.txt' ein!&quot; &lt;&lt; endl;	
	cout &lt;&lt; &quot;\n Dateiname ? &quot;;
	cin &gt;&gt; filename;	
	ifstream fileIn;

	vos.fromFile(filename);

	delete[] filename;	
	cout &lt;&lt; &quot;\nLaden der Daten beendet! Es wurden &quot; &lt;&lt; vos.vs.size() &lt;&lt; &quot; Datensätze geladen.\n&quot; &lt;&lt; endl;
}
</code></pre>
<p>Leider funktioniert das einlesen nicht. Als Trennzeichen wird nicht | verwendet sondern, das erste Leerzeichen, d.h. die Datensätze werden beim ersten Leerzeichen getrennt und nicht wie gewünscht beim |.</p>
<p>Alternativ hatte ich folgendes versucht:</p>
<p>In der main habe ich die while Schleife wie folgt geändert:</p>
<pre><code class="language-cpp">while ( abbruch != 0) {
                char* Param1 = new char[1000];
                char* Param2 = new char[1000];
                char* Param3 = new char[1000];
                cout &lt;&lt; &quot;Geben Sie Param1 ein:&quot; &lt;&lt;endl;
                cin &gt;&gt; Param1;
                cout &lt;&lt;&quot;\nGeben Sie Param2 ein:&quot; &lt;&lt;endl;
                cin &gt;&gt; Param2;
                cout &lt;&lt; &quot;\nGeben Sie Param3 ein:&quot; &lt;&lt; endl;
                cin &gt;&gt; Param3;
                v.vs.push_back(Header::Struct (Param1, Param2, Param3, 0));
                cout &lt;&lt; &quot;\n\nFalls Sie keine weiteren Daten eingeben wollen, dann drücken Sie '0'.&quot; &lt;&lt;endl;
                cout &lt;&lt; &quot;Für weitere Eingaben drücken sie '1'.&quot; &lt;&lt;endl;
                s = cinint(0, 1);
                if ( s == 0)
                        abbruch = 0;
        }
</code></pre>
<p>In der Header.h habe ich alle string durch char* ersetzt und in der Header.cpp habe ich</p>
<pre><code class="language-cpp">char* dummy1 = new char[1000];
                                char* dummy2 = new char[1000];
                                char* dummy3 = new char[1000];
</code></pre>
<p>definiert.<br />
Leider kann ich auch so die Datensätze nicht aus der Datei einlesen<br />
Ich habe folgende Fragen:<br />
1. Wie kann ich meinen vector &lt;Struct&gt; aus der Datei einlesen?<br />
2. Wieso funktionieren meine beiden Ansätze nicht?<br />
3. Später möchte ich einzelne Elemente meines vector &lt;struct&gt; ersetzen, also in der Form v.vs[1].Param2 = „so ist es“;<br />
Kann ich das so einfach machen oder ist meine Struct und Vector &lt;Struct&gt; vs; dafür schlecht definiert?<br />
Für Antworten wäre ich sehr dankbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2218207</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2218207</guid><dc:creator><![CDATA[Harry313]]></dc:creator><pubDate>Fri, 01 Jun 2012 16:22:50 GMT</pubDate></item><item><title><![CDATA[Reply to vector &amp;lt;struct&amp;gt; in Datei schreiben und einlesen on Fri, 01 Jun 2012 16:31:22 GMT]]></title><description><![CDATA[<p><strong>Das ist ja komisch. Die Codeformatierung funktioniert bei deinem Beitrag nicht, aber wenn ich den gleichen Beitrag schreibe, geht's. Damit die Leute sich nicht beschweren, hier dein Beitrag noch einmal in lesbar:</strong></p>
<p>Ich habe versucht folgendes zu programmieren. In einer Headerdatei Header.h habe ich folgendes struct definiert:</p>
<pre><code class="language-cpp">struct Struct
	{
	    Struct( string e_, string d_, string k_, bool m_ )
	        : Param1( e_ ), Param2( d_ ), Param3( k_), Param4( m_)
	    {}
		string Param1;
		string Param2;
		string Param3;
		bool Param4;

	    // Struktur mit operatoren zum Lesen und Schreiben derselben ausstatten
	    friend std::ostream&amp; operator&lt;&lt;( std::ostream&amp; out, const Struct&amp; s )
	    {
	        return out &lt;&lt; s.Param1 &lt;&lt; &quot;|&quot; &lt;&lt; s.Param1 &lt;&lt; &quot;|&quot; &lt;&lt; s.Param1 &lt;&lt; &quot;|&quot; &lt;&lt; s.Param4; 
	    }
	    friend std::istream&amp; operator&gt;&gt;( std::istream&amp; in, Struct&amp; s )
	    {
	    	getline(in, s.Param1, '|');
	    	getline(in, s.Param2, '|');
	    	getline(in, s.Param3, '|');
	    	in &gt;&gt; s.Param4;
	        return in;
	    }
	};
</code></pre>
<p>und außerdem habe ich in Header.h folgendes definiert.</p>
<pre><code class="language-cpp">Vector &lt;Struct&gt; vs;
</code></pre>
<p>In der main.cpp lege ich einen vector &lt;Struct&gt; vs an und fülle einen Vektor v wie folgt: Ausserhalb der main definiere ich</p>
<pre><code class="language-cpp">Header v;
</code></pre>
<p>Dann schreibe ich in der main:</p>
<pre><code class="language-cpp">int abbruch = 1;
	int s = 0;
	while ( abbruch != 0) {

		string Param1;
		string Param2;
		string Param3;

		cout &lt;&lt; &quot;Geben Sie Param1 ein:&quot; &lt;&lt;endl;
		getline(cin, Param1);
		cout &lt;&lt;&quot;\nGeben sie Param2 ein:&quot; &lt;&lt;endl;
		getline(cin, Param2);
		cout &lt;&lt; &quot;\nGeben Sie Param3 ein:&quot; &lt;&lt; endl;
		getline(cin, Param3);
		v.vs.push_back(Header::Struct (Param1, Param2, Param3, 0));

		cout &lt;&lt; &quot;\n\nFalls Sie keine weiteren Daten eingeben wollen, dann drücken Sie '0'.&quot; &lt;&lt;endl;
		cout &lt;&lt; &quot;Für weitere Eingaben drücken sie '1'.&quot; &lt;&lt;endl;
		s = cinint(0, 1);
		if ( s == 0)
			abbruch = 0;		
	}
</code></pre>
<p>Die Funktion cinint ist in der main.cpp wie folgt definiert:</p>
<pre><code class="language-cpp">int cinint(int minint, int maxint){
    int wahl = 0;
    while ( ( !(cin &gt;&gt; wahl) || !( wahl &gt;= minint &amp;&amp; wahl &lt;= maxint) ) ) {
    	cout &lt;&lt; &quot;\n Sie müssen eine Zahl von &quot; &lt;&lt; minint &lt;&lt; &quot; bis &quot; &lt;&lt; maxint &lt;&lt; &quot; eingeben!&quot; &lt;&lt;endl;
        // falsche Eingabe
        std::cin.clear();
        std::cin.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(),'\n');
    }
    return wahl;
}
</code></pre>
<p>Ich möchte v in eine Datei schreiben und wieder auslesen. Dazu habe ich in Header.cpp folgende Funktionen definiert:</p>
<pre><code class="language-cpp">void Header::toFile(const char* filename) {
        ofstream file( filename );
        file &lt;&lt; vs.size() &lt;&lt; endl; // Anzahl schreiben ist eine gute Sache
        copy( vs.begin(), vs.end(), ostream_iterator&lt; Sruct &gt;( file, &quot;\n&quot; ) );
	}
</code></pre>
<p>und</p>
<pre><code class="language-cpp">void Header::fromFile(const char* filename)
	{
		ifstream fileIn;
		fileIn.open( filename);

		if( !fileIn )
			cout &lt;&lt; &quot;Could not open the input file!&quot; &lt;&lt;endl;
		else
		{				
			size_t n;
			fileIn &gt;&gt; n; // Anzahl lesen
			cout &lt;&lt; &quot;Anzahl der zu ladenden Elemente = &quot; &lt;&lt; n &lt;&lt; endl;

			for ( int i = 0; i &lt; n; ++i)
			{
				string dummy1;
				string dummy2;
				string dummy3;
				bool  dummy4;			

				fileIn &gt;&gt; dummy1 &gt;&gt; dummy2 &gt;&gt; dummy3 &gt;&gt; dummy4;
				vs.push_back(Header::Struct (dummy1 , dummy2, dummy3, dummy4));
			}
		}	
	}
</code></pre>
<p>Das Schreinen in eine Datei funktioniert: so erhalte ich z.B. die Datei filename.txt</p>
<p>2<br />
das ist|genauso wie|es sein soll|0<br />
leider ist| es doch nicht|ganz richtig|0</p>
<p>Ich versuche nun in der main.cpp aus der Datei filename.txt zu lesen, indem ich folgende Funktion geschrieben habe:</p>
<pre><code class="language-cpp">void Datensatzladen(Header &amp;vos)
{
	char* filename = new char[1000];	
	cout &lt;&lt; &quot;Bitte geben Sie einen Dateinamen der Form 'filename.txt' ein!&quot; &lt;&lt; endl;	
	cout &lt;&lt; &quot;\n Dateiname ? &quot;;
	cin &gt;&gt; filename;	
	ifstream fileIn;

	vos.fromFile(filename);

	delete[] filename;	
	cout &lt;&lt; &quot;\nLaden der Daten beendet! Es wurden &quot; &lt;&lt; vos.vs.size() &lt;&lt; &quot; Datensätze geladen.\n&quot; &lt;&lt; endl;
}
</code></pre>
<p>Leider funktioniert das einlesen nicht. Als Trennzeichen wird nicht | verwendet sondern, das erste Leerzeichen, d.h. die Datensätze werden beim ersten Leerzeichen getrennt und nicht wie gewünscht beim |.</p>
<p>Alternativ hatte ich folgendes versucht:</p>
<p>In der main habe ich die while Schleife wie folgt geändert:</p>
<pre><code class="language-cpp">while ( abbruch != 0) {
                char* Param1 = new char[1000];
                char* Param2 = new char[1000];
                char* Param3 = new char[1000];
                cout &lt;&lt; &quot;Geben Sie Param1 ein:&quot; &lt;&lt;endl;
                cin &gt;&gt; Param1;
                cout &lt;&lt;&quot;\nGeben Sie Param2 ein:&quot; &lt;&lt;endl;
                cin &gt;&gt; Param2;
                cout &lt;&lt; &quot;\nGeben Sie Param3 ein:&quot; &lt;&lt; endl;
                cin &gt;&gt; Param3;
                v.vs.push_back(Header::Struct (Param1, Param2, Param3, 0));
                cout &lt;&lt; &quot;\n\nFalls Sie keine weiteren Daten eingeben wollen, dann drücken Sie '0'.&quot; &lt;&lt;endl;
                cout &lt;&lt; &quot;Für weitere Eingaben drücken sie '1'.&quot; &lt;&lt;endl;
                s = cinint(0, 1);
                if ( s == 0)
                        abbruch = 0;
        }
</code></pre>
<p>In der Header.h habe ich alle string durch char* ersetzt und in der Header.cpp habe ich</p>
<pre><code class="language-cpp">char* dummy1 = new char[1000];
                                char* dummy2 = new char[1000];
                                char* dummy3 = new char[1000];
</code></pre>
<p>definiert.<br />
Leider kann ich auch so die Datensätze nicht aus der Datei einlesen<br />
Ich habe folgende Fragen:<br />
1. Wie kann ich meinen vector &lt;Struct&gt; aus der Datei einlesen?<br />
2. Wieso funktionieren meine beiden Ansätze nicht?<br />
3. Später möchte ich einzelne Elemente meines vector &lt;struct&gt; ersetzen, also in der Form v.vs[1].Param2 = „so ist es“;<br />
Kann ich das so einfach machen oder ist meine Struct und Vector &lt;Struct&gt; vs; dafür schlecht definiert?<br />
Für Antworten wäre ich sehr dankbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2218213</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2218213</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 01 Jun 2012 16:31:22 GMT</pubDate></item><item><title><![CDATA[Reply to vector &amp;lt;struct&amp;gt; in Datei schreiben und einlesen on Fri, 01 Jun 2012 16:44:00 GMT]]></title><description><![CDATA[<p>Harry313 schrieb:</p>
<blockquote>
<p>und außerdem habe ich in Header.h folgendes definiert.</p>
<pre><code class="language-cpp">Vector &lt;Struct&gt; vs;
</code></pre>
</blockquote>
<p>Gar nicht gut. Definitionen haben in Headern nichts verloren. Wird der Header in zwei Übersetzungseinheiten eingebunden, dann hast du vs doppelt.</p>
<blockquote>
<pre><code class="language-cpp">void Header::fromFile(const char* filename)
	{
		ifstream fileIn;
		fileIn.open( filename);
				
		if( !fileIn )
			cout &lt;&lt; &quot;Could not open the input file!&quot; &lt;&lt;endl;
		else
		{				
			size_t n;
			fileIn &gt;&gt; n; // Anzahl lesen
			cout &lt;&lt; &quot;Anzahl der zu ladenden Elemente = &quot; &lt;&lt; n &lt;&lt; endl;
		
			for ( int i = 0; i &lt; n; ++i)
			{
				string dummy1;
				string dummy2;
				string dummy3;
				bool  dummy4;			

				
				
				fileIn &gt;&gt; dummy1 &gt;&gt; dummy2 &gt;&gt; dummy3 &gt;&gt; dummy4;
				vs.push_back(Header::Struct (dummy1 , dummy2, dummy3, dummy4));
			}
		}	
	}
</code></pre>
</blockquote>
<p>STOPP! Hier benutzt du nicht deinen oben definierten Leseoperator, sondern schreibst unnötigerweise eine falsche, neue Lesefunktion mit <code>operator&gt;&gt;(istream&amp;, string&amp;)</code> . Der trennt nicht bei '|', sondern bei Whitespace.</p>
<blockquote>
<pre><code class="language-cpp">void Datensatzladen(Header &amp;vos)
{
	char* filename = new char[1000];	
	cout &lt;&lt; &quot;Bitte geben Sie einen Dateinamen der Form 'filename.txt' ein!&quot; &lt;&lt; endl;	
	cout &lt;&lt; &quot;\n Dateiname ? &quot;;
	cin &gt;&gt; filename;	
	ifstream fileIn;

	vos.fromFile(filename);
	
	delete[] filename;	
	cout &lt;&lt; &quot;\nLaden der Daten beendet! Es wurden &quot; &lt;&lt; vos.vs.size() &lt;&lt; &quot; Datensätze geladen.\n&quot; &lt;&lt; endl;
}
</code></pre>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> Du kennst doch string. Was soll das?</p>
<blockquote>
<pre><code class="language-cpp">while ( abbruch != 0) {
                char* Param1 = new char[1000];
                char* Param2 = new char[1000];
                char* Param3 = new char[1000];
                cout &lt;&lt; &quot;Geben Sie Param1 ein:&quot; &lt;&lt;endl;
                cin &gt;&gt; Param1;
                cout &lt;&lt;&quot;\nGeben Sie Param2 ein:&quot; &lt;&lt;endl;
                cin &gt;&gt; Param2;
                cout &lt;&lt; &quot;\nGeben Sie Param3 ein:&quot; &lt;&lt; endl;
                cin &gt;&gt; Param3;
                v.vs.push_back(Header::Struct (Param1, Param2, Param3, 0));
                cout &lt;&lt; &quot;\n\nFalls Sie keine weiteren Daten eingeben wollen, dann drücken Sie '0'.&quot; &lt;&lt;endl;
                cout &lt;&lt; &quot;Für weitere Eingaben drücken sie '1'.&quot; &lt;&lt;endl;
                s = cinint(0, 1);
                if ( s == 0)
                        abbruch = 0;
        }
</code></pre>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> Du kennst doch string. was soll das?</p>
<blockquote>
<p>In der Header.h habe ich alle string durch char* ersetzt und in der Header.cpp habe ich</p>
<pre><code class="language-cpp">char* dummy1 = new char[1000];
                                char* dummy2 = new char[1000];
                                char* dummy3 = new char[1000];
</code></pre>
<p>definiert.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> Du kennst doch string. Was soll das?</p>
<blockquote>
<p>Leider kann ich auch so die Datensätze nicht aus der Datei einlesen<br />
Ich habe folgende Fragen:<br />
1. Wie kann ich meinen vector &lt;Struct&gt; aus der Datei einlesen?</p>
</blockquote>
<p>Dein Leseoperator sah auf den ersten Blick durchaus richtig aus. Falls nicht, emelde dich nochmal.</p>
<blockquote>
<p>2. Wieso funktionieren meine beiden Ansätze nicht?</p>
</blockquote>
<p>Weil du deinen richtigen Operator gar nicht benutzt hast.</p>
<blockquote>
<p>3. Später möchte ich einzelne Elemente meines vector &lt;struct&gt; ersetzen, also in der Form v.vs[1].Param2 = „so ist es“;<br />
Kann ich das so einfach machen oder ist meine Struct und Vector &lt;Struct&gt; vs; dafür schlecht definiert?</p>
</blockquote>
<p>Klar, warum nicht? Dazu brauchst du dann einen entsprechenden (nicht-expliziten) Konstruktor (oder eher zwei, wenn du nicht nur Zeichenkettenliterale, sondern auch strings zulassen möchtest), der dir die Zeichenkette zerlegt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2218218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2218218</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 01 Jun 2012 16:44:00 GMT</pubDate></item><item><title><![CDATA[Reply to vector &amp;lt;struct&amp;gt; in Datei schreiben und einlesen on Sat, 02 Jun 2012 16:32:55 GMT]]></title><description><![CDATA[<p>Ja, es ist so einfach. Manchmal sieht man den Wald vor lauter Bäumen nicht. So einfach ist es:</p>
<p>void Header::fromFile(const char* filename)<br />
{<br />
ifstream fileIn;<br />
fileIn.open( filename);</p>
<p>if( !fileIn )<br />
cout &lt;&lt; &quot;Could not open the input file!&quot; &lt;&lt;endl;<br />
else<br />
{<br />
size_t n;<br />
fileIn &gt;&gt; n; // Anzahl lesen<br />
cout &lt;&lt; &quot;Anzahl der zu ladenden Elemente = &quot; &lt;&lt; n &lt;&lt; endl;</p>
<p>for ( int i = 0; i &lt; n; ++i)<br />
{<br />
Header::Struct dummy(&quot;&quot;, &quot;&quot;, &quot;&quot;, 0);<br />
fileIn &gt;&gt; dummy;<br />
vs.push_back(Header::Struct (dummy.Param1 , dummy.Param2, dummy:Param3, dummy.Param4));<br />
}<br />
}<br />
}</p>
<p>Danke für die Hilfe. Manchmal sieht ein objektives Auge viel mehr. <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="😉"
    /> <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2218554</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2218554</guid><dc:creator><![CDATA[Harry313]]></dc:creator><pubDate>Sat, 02 Jun 2012 16:32:55 GMT</pubDate></item></channel></rss>