Nur jedes zweite Zeichen aus einem File...
-
Ok,vielen Dank!:)
Ich dachte halt, es gäbe ein etwas elegantere Lösung, weil ich ja theoretisch im Vorfeld nicht wissen kann, wie groß das benötigte Feld ist.
-
Ich weiß nicht zwar nicht was Eleganz in C++ bedeutet,
aber man könnte auch anstelle eines Feldes mit statischer Größe,
ein zeiger auf eine char variable benutzen... damit kann man auch [] benutzen und so^^
-
noch besser wäre wohl ein vector<char>.
-
Eleganz in C++ bedeutet vermutlich Kapselung, generische Programmierung und raffinierter Einsatz der STL.

-
Braunstein schrieb:
noch besser wäre wohl ein vector<char>.
und schneller wäre es,wenn man die 'länge' der datei misst und ein char-feld mit halber größe der länge dieser datei erstellt
vector ist für sowas doch overkill,eleganz hin oder her
-
Um mal meine Vorredner aufzugreifen, man kann aus den beiden einzelnen Schritten, einlesen der Daten und anschließendes filtern, einen einzigen machen, das sähe dann zum Beispiel so aus:
int main() { int laenge; ifstream datei; datei.open("Text.txt", ios:: binary); // Länge der Textdatei ermitteln datei.seekg (0, ios::end); laenge = datei.tellg(); datei.seekg (0, ios::beg); char zeichen[laenge/2]; for(int i=0;i<laenge;++i) { datei.get(zeichen[i]); //Einlesen eines Zeichens vom stream und speichern in zeichen datei.get(); //Einlesen eines weiteren Zeichens, aber wird nicht gespeichert }Mhhh wollte eigentlich mit seekg() ein Zeichen überspringen, das hat aber irgendwie nicht so geklappt wie ich es mir gedacht hatte.
-
Quellcode schrieb:
char* tmp = .... // einlesenfunktion int size = sizeof(tmp) / sizeof(char); // ich glaub string hat eigenen size Operator char *tmp2; for (int i=0; i<size; i+=2) { tmp2[i] = tmp[i]; }damit du nicht anfängst, so zu programmieren: das funktioniert nicht. sizeof liefert dir hier die größe von tmp, tmp ist ein char*, d.h.
sizeof(tmp) == sizeof(char*), idR "4",sizeof(char)liefert dir immer "1". der wahrscheinlichste (auf dem system, das du verwendest) inhalt von size ist also 4.
übrigens reicht weiter unten dann tmp[j] = '\0'.Nebukat schrieb:
// Länge der Textdatei ermitteln datei.seekg (0, ios::end); laenge = datei.tellg(); datei.seekg (0, ios::beg); char zeichen[laenge/2];das wird auch nicht funktionieren, weil laenge/2 erst zur laufzeit berechnet werden kann und in C++ arrays, deren größe erst dann feststeht, mit new[] angefordert werden müssen (und dann mit delete[] freigegeben).
warum nicht einen container, z.b.
std::string?int main() { ifstream fin("test"); string text; for (char tmp = fin.get(); fin; fin >> tmp) { if (fin >> tmp) text.push_back(tmp); } cout << text << endl; }
-
ifstream datei; datei.open("Text.txt", ios:: binary); // Länge der Textdatei ermitteln datei.seekg (0, ios::end); vector<char> vData(datei.tellg();/2); datei.seekg (0, ios::beg); for(;datei ;datei.get()) datei.get(vData[i]); //Einlesen jedes zweiten zeichen
-
ich will auch meinen Senf dazu geben

std::ifstream file( "file.txt", std::ios::ate ); int size = file.tellg(); file.seekg(0, std::ios::beg); char * content = new char[size]; file.read( content, size ); char * halfcontent = new char[ size / 2 ]; for( int i = 0; i < size; i+= 2 ) { halfcontent[ i / 2 ] = content[ i ]; } delete [] content; std::cout << halfcontent << std::flush; delete [] halfcontent;
-
bitte löschen war versehentlich ein doppelpost
-
Habs hingekriegt, vielen Dank an alle!:)
-
Erhard Henkes schrieb:
Eleganz in C++ bedeutet vermutlich Kapselung, generische Programmierung und raffinierter Einsatz der STL.

#include <fstream> #include <iterator> template< typename T, typename In > struct IncTwice : std::iterator< std::input_iterator_tag, T > { explicit IncTwice( In p ) : m_p( p ) {} IncTwice& operator++() { ++m_p; ++m_p; // zwei mal inkrementieren return *this; } T operator*() const { return *m_p; } bool operator!=( const IncTwice& b ) const { return m_p != b.m_p; } private: In m_p; }; template< typename T, typename In > IncTwice< T, In > incTwice( In out ) { return IncTwice< T, In >( out ); } int main() { using namespace std; ifstream quelle( "input.txt" ); ofstream ziel( "output.txt" ); copy( incTwice< char >( istreambuf_iterator< char >( quelle ) ), incTwice< char >( istreambuf_iterator< char >() ), ostreambuf_iterator< char >( ziel ) ); return 0; }