[Frage]Tabelle erstellen
-
Guten Tag!
Ich bin Neuling in C++...ich habe bisher alles über ein buch gelernt und nun möchte ich praktisch anfangen:D Habe einige Erfahrung mit Webbasierten Programmiersprachen und Delphi, aber eben kaum welche mit C++. Möchte folgendes realisieren (ohne GUI):
Es soll ein Text hineinkopiert werden und dieser soll dann in eine Tabelle eingefügt werden....Das Speichern und Eingeben ist nicht das Problem, sondern wie gebe ich es formatiert als Tabelle aus und wie muss ich die Enddatei benenen? Kann man da ein .txt File ausgeben, wo das ganze einer Tabelle ähnelt? Wie formatiere ich den Text in eienr Tabelle...das ganze habe ich als PHP-Script bereits geschrieben, möchte es nun jedoch als Programm umsetzen.Könnt ihr mir Tipps oder Anhaltspunkte geben, wonach ich mich da erkundigen muss (Befehle etc.)?
-
Eine Möglichkeit wäre es, deine Daten in HTML-Format auszugeben (d.h. du schreibst dir deine Tabelle mit <table>, <tr> und <td> Tags selber zusammen). Alternativ bleibt noch CSV-Format (die Werte werden durch Komma/Semikolon/... getrennt aufgeschrieben) oder reine Testformatierung mit fester Spaltenbreite.
-
Guten Tag! War gerade duschen und wollte das schreiben, da ich mich mit HTML etc. auskenne und jeder das Dateiformat öffnen kann...code ich die Ausgabe als .html:D
So also Ein- und Ausgabe klappt dann...Das einzige was ich benötige ist, dass, wenn ein Text eingegeben wird, dass der nach folgendem Muster gesplittet wird (in Arrays?): Wort1, Wort2, also das die Wörter herausgenommen werden, um sie später in die Tabelle einfügen zu können.
-
Wissenscoder schrieb:
Das einzige was ich benötige ist, dass, wenn ein Text eingegeben wird, dass der nach folgendem Muster gesplittet wird (in Arrays?): Wort1, Wort2, also das die Wörter herausgenommen werden, um sie später in die Tabelle einfügen zu können.
nutze std::string, dann ist das Auslesen von Wörtern kein Problem:
std::string wort1, wort2; // benötigt #include <string> cin >> wort1 >> wort2; // liest zwei Wörter von cinWar Deine Eingabe
Hallo Welt
dann ist wort1="Hallo" und wort2="Welt".
Gruß
Werner
-
guten tag! ja ok danke erst einmal, aber das wird nicht klappen bzw. ist zu aufwenig, da es undefiniert viele wörter sind...es sind sehr viele:D geht das ganze auch mit nem Array, wo ich die Wörter drin speichere? wie sieht das dann aus?
Habe dann noch eine weitere Frage: Wie kann ich in der Konsole etwas durch Copy&Paste einfügen? Kann man da etwas programmieren für oder gibt es da schon etwas?
-
Dann kannst du die Daten auch in einen vector einlesen:
string line,part; vector<string> values; getline(cin,line); int index=0,nindex=0; while(index!=string::npos) { nindex=line.find_first_of(" \t",index); part=line.substr(index,nindex-index); values.push_back(part); index=nindex+1; }
-
Wissenscoder schrieb:
guten tag! ja ok danke erst einmal, aber das wird nicht klappen bzw. ist zu aufwenig, da es undefiniert viele wörter sind...es sind sehr viele:D geht das ganze auch mit nem Array, wo ich die Wörter drin speichere? wie sieht das dann aus?
geht auch mit vielen Wörtern, aber falls Du cin nutzt kommst Du dann um ein getline nicht herum, damit das Zeilenende erkannt wird. Das kann etwa so aussehen:
#include <iostream> #include <string> #include <vector> #include <sstream> int main() { using namespace std; for( string line; cout << "Viele Woerter: ", getline( cin, line ); ) { istringstream buf( line ); vector< string > woerter( (istream_iterator< string >( buf )), istream_iterator< string >() ); // .. mache was mit 'woerter' cout << "Es wurden " << woerter.size() << " Woerter gelesen" << endl; } return 0; }Wissenscoder schrieb:
Habe dann noch eine weitere Frage: Wie kann ich in der Konsole etwas durch Copy&Paste einfügen? Kann man da etwas programmieren für oder gibt es da schon etwas?
Unter welchen Betriebssystem arbeitest Du?
Bei Windows:
Cursor setzen -> rechte Maustaste auf oberen Fensterrand -> Bearbeiten -> EinfügenGruß
Werner
-
ok vielen dank euch allen...werde mir das mit dem code anschauen...melde mich dann wieder bei fragen!
@Werner Salomon: Danke habs gefunden;)
-
Werner Salomon schrieb:
Wissenscoder schrieb:
guten tag! ja ok danke erst einmal, aber das wird nicht klappen bzw. ist zu aufwenig, da es undefiniert viele wörter sind...es sind sehr viele:D geht das ganze auch mit nem Array, wo ich die Wörter drin speichere? wie sieht das dann aus?
geht auch mit vielen Wörtern, aber falls Du cin nutzt kommst Du dann um ein getline nicht herum, damit das Zeilenende erkannt wird. Das kann etwa so aussehen:
#include <iostream> #include <string> #include <vector> #include <sstream> int main() { using namespace std; for( string line; cout << "Viele Woerter: ", getline( cin, line ); ) { istringstream buf( line ); vector< string > woerter( (istream_iterator< string >( buf )), istream_iterator< string >() ); // .. mache was mit 'woerter' cout << "Es wurden " << woerter.size() << " Woerter gelesen" << endl; } return 0; }Wissenscoder schrieb:
Habe dann noch eine weitere Frage: Wie kann ich in der Konsole etwas durch Copy&Paste einfügen? Kann man da etwas programmieren für oder gibt es da schon etwas?
Unter welchen Betriebssystem arbeitest Du?
Bei Windows:
Cursor setzen -> rechte Maustaste auf oberen Fensterrand -> Bearbeiten -> EinfügenGruß
WernerTut mir leid, aber kann mir einer vllt. noch erklären, was du so ungefähr gemacht wird...kenne noch ned alle befehle:D
-
Hier noch mal eine stark aufgedröselte und kommentierte Version:
#include <iostream> #include <string> #include <vector> #include <sstream> // istringstream #include <iterator> // istream_iterator int main() { using namespace std; do { // -- Schleifen-Kopf string line; cout << "Viele Woerter: "; getline( cin, line ); // Hole die ganze Zeile von der Standardeingabe if( cin.fail() ) // Falls es ein Problem gibt (hier normal nie) break; // .. dann unterbreche die Schleife // hier wird der string 'line' in einen stringstream gefüllt, um ihn // später wieder herauszulesen. Im Gegensatz zu cin, kann man jetzt gegen End-Of-Line lesen. istringstream buf( line ); // Der istream_iterator liest bei jedem ++ einen Wert von dem Stream ein, der ihm übergeben // wurde. Im Standard steht: // istream_iterator<T>& operator++(); // Effekt: *in_stream >> value // // Außerdem nutzt man folgenden Konstruktor von vector: // template< typename Iterator > // vector::vector( Iterator von, Iterator bis ); // der den vector mit dem Inhalt des Intervalls [von..bis) füllt. // das 'bis' - also Ende - wird erreicht, sobald ein Lesefehler auftritt // (d.h. Lesen gegen End-Of-File) vector< string > woerter( (istream_iterator< string >( buf )), istream_iterator< string >() ); // .. mache was mit 'woerter' cout << "Es wurden " << woerter.size() << " Woerter gelesen" << endl; } while(true); // Endlosschleife return 0; }Frag' bitte noch konkret nach, was Du genau nicht verstanden hast.
Gruß
Werner
-
guten tag!
Ok danke...habs noch ned ganz probiert...an dieser stelle hackte er immer:vector< string > woerter( (istream_iterator< string >( buf )), istream_iterator< string >() );und konnte leider nix mit istream_iterator anfangen, dass kannte ich noch nicht;) aber dafür übe ich ja:D
-
guten Tag!
Ok es war nicht ganz einfach, aber ich habe nun einiges verstanden. vielen dank bisdahin.
Zwei kleine Fragen habe ich jedoch:
1.) Wie lasse ich nun z.B. jedes gespeicherte Wort anzeigen?
2.) Wie mache kann ich es ändern, dass er bei den Wörtern das Komma noch mit zu dem Leerzeichen als Trenner nimmt?
-
Kann mir da keiner helfen?
-
Wissenscoder schrieb:
Kann mir da keiner helfen?
doch sicher ...
Wissenscoder schrieb:
1.) Wie lasse ich nun z.B. jedes gespeicherte Wort anzeigen?
z.B. so:
copy( woerter.begin(), woerter.end(), ostream_iterator< string >( cout, "\n" ) );wobei man noch zusätzlich die Includes
#include <iterator> #include <algorithm>benötigt.
Wissenscoder schrieb:
2.) Wie mache kann ich es ändern, dass er bei den Wörtern das Komma noch mit zu dem Leerzeichen als Trenner nimmt?
das ist schon schwieriger; im Nachlauf z.B. so: man schreibe sich eine kleine Funktion für das Beseitigen aller Kommas aus einem String.
// -- beseitigt alle ',' aus einem Wort void remove_comma( std::string& wort ) { for( std::string::size_type i; ( i = wort.find( ',' ) ) != std::string::npos; ) wort.erase( i, 1 ); }und rufe es für alle Wörter im vector 'woerter' auf.
for_each( woerter.begin(), woerter.end(), &remove_comma );das hat den Nachteil, dass hinter dem Komma immer ein Leerzeichen stehen muss.
ein wenig sicherer und eleganter wäre es, dies gleich beim Einlesen über einen sogenannten Manipulator zulösen. Ist aber aufwendiger.
Gruß
Werner
-
veln vielen dank:D probiere das morgen mal