Hilfe bei Projekt
-
Wo hat denn hier ein "Ninja" geschrieben.
Falls du mich meinst: ich sitze in Japan, also rechne +7 Stunden. Die Zeit ist dann doch ganz normal, hehe.
-
Ja, ich arbeite immer sehr lange (*auf die Uhr schau).
Ich bin schon fast am Ziel meiner Träume. Eine Sache die mich noch stört: ich habe die Datensätze jeweils in einem String gespeichert, wenn ich so einen String ausgebe ist der nicht formatiert, d.h. die Zeilenumbrüche funktionieren nicht. Kann ich irgendetwas machen, damit die orginal Zeilenumbrüche übernommen werden, bzw. selbst welche einfügen? Dafür habe ich noch keinen Befehl gefunden!
Ach ja, und noch ein Problem: mit dem ifstream kann ich nur externe Dateien öffnen um sie dann Zeilenweise zu bearbeiten. Wie bekomme ich es hin, dass ich auch Arrays oder strings auf diese Art und Weise öffnen und Zeilenweise bearbeiten kann?
Lina
-
Zu deinem ersten Problem:
Wenn du mit getline einliest werden die Zeilenumbrüche weggeworfen. Gegenmittel ist ganz einfach nach dem getline ein '\n' in den String einzufügen.
Arrays und Strings haben keine Zeilen... Solltest du meinen, bis ein Zeilenumbruch kommt, dann solltest du einfach mit std::string.find() nach dem '\n' im String suchen und dann mit std::string.substr() die "Zeile" rauskopieren.
-
Ne es geht mir eigentlich darum, wenn ich dann einen kompletten Titelsatz auslese, dass der auf dem Bildschirm keine Zeilenumbrüche mehr hat, und dadurch alles genau hintereinander steht. Das ist extrem unübersichtlich.
Nach jedem getline ein "\n" einfügen funktioniert wie genau? Ich hab versucht einfach etwas ala string=string+"\n", aber das hat nicht funktioniert.
Lina
-
Ach, das funktionniert echt nicht? Hmm, dann entschuldige ich mich.
Kann mir einer erklären warum das nicht funktionniert?
EDIT:
#include <iostream> #include <fstream> #include <string> using namespace std; int main(){ ifstream in("main.cpp"); string s="",buf; while(!in.eof()){ getline(in,buf); s+=buf+'\n'; } cout<<s; cin.get(); return 0; }funktionniert tadellos bei mir.
-
Ah, Kommando zurück! Das geht doch mit dem Befehl, keine Ahnung was ich vorhin falsch gemacht habe, jetzt funktionierts so jedenfalls doch!
Bleibt nur noch das Problem, dass ich das ganze gerne aus nem string oder array per getline einlesen würde, bisher aber nur weiss wie das mit einer externen Datei funktioniert, kann mir da jemand noch einen Tip geben?
-
Per getline funktionniert das soweit ich weisz nicht. Ich würde wie gesagt in dem Fall per find nach einem '\n' im String suchen und dann den teil davor rauskopieren. Kannst das in eine eigene Funktion packen.
EDIT: Vielleicht bieten stringstreams da etwas. Muss ich mal nachsehen, kenne mich damit nicht so gut aus.
EDIT2: scheint zu gehen. Also den ganzen String in einen stringstream einlesen und dann den stream als erstes Argument an getline übergeben. Getestet habe ich es nicht, aber du kannst es ja vielleicht mal probieren.
-
Hmm, das krieg ich grad nicht so ganz hin... so hab ich es versucht:
Edit: ich blöde Kuh, jetzt klappt alles, hatte nur einen kleinen Fehler drin! Vielen Dank!
-
Ok, 2 kleine Fragen hätte ich da noch:
1. Die Anzahl der Zeichen in einer Zeile kann ich wohl mit dem size_type length(line) Befehl bekommen. Kann mir das jemand kurz angewendet zeigen, ich weiss nicht so genau wie ich das einfügen muss, also wo genau ich den Namen des zu untersuchenden string hinschreiben muss, und welche Variable die Länge dann beinhaltet.
2. Umlaute werden nicht richtig ausgegeben. Was kann ich da am besten gegen machen?
Lina
-
Zu 1: std::string.length() oder std::string.size() gibt dir die Länge eines Strings. Wenn der zu untersuchende string s heiszt und du die Länge in l schreiben willst:
size_t l=s.length();2. ist glaube ich komplizierter, ich denke, da muss unicode herhalten, aber ich kenne mich damit nicht sonderlich aus.
Was mir allerdings aufgefallen ist: wenn ich die Sonderzeichen wie ä ö ü in die Konsole eingebe, mein Programm sie einlesen lasse und dann in eine Datei schreibe werden sie auch wieder richtig ausgegeben, wenn ich sie aus der Datei einlese und dann in die Konsole ausgebe. Liesze sich also behelfen wenn man eine solche Datei einmal anlegt und dann für eben solche Sachen benutzt (also einliest in einen String und sich dann eben merkt: ä ist 0, ü ist 1 usw)
Wie es in der Regel gehandhabt wird weisz ich nicht, aber das wird bestimmt noch einer erklären. Hoffe ich mal, hehe.
-
Ok, vielen Dank! Ich bin auf jeden Fall jetzt viel weiter, dennoch habe ich grad noch ein großes Problem: ich würde gerne nach beliebig vielen Kategorien suchen, die dann entweder alle vorkommen müssen, oder es reicht wenn eines der Kategorien gefunden wird.
Ich müsste es also irgendwie hinkriegen, dass je nachdem wieviele Kategorien abgefragt werden sollen, eine neue Variable erstellt werden muss, und dann diese Variablen miteinander vergleicht. Ich sitze da jetzt schon mehrere Tag dran, versuche verschiedene Dinge aus, komme aber nicht wirklich weiter. Hat jemand noch einen Tipp für mich?
Lina
-
Hallo alle zusammen, ich brauche eure Hilfe!
hat jemand ein Beispiel Programm von C++ zur Berechnung des Schwerpunkts auf dem Bild?
-
@Schnitzel: nochmal bitte, irgendwie habe ich nicht ganz verstanden was du jetzt haben willst.
Meinst du vielleicht, dass der user mehrere Kategorien eingibt und du dann diese Kategorien suchen musst, wobei jede Kategorie mehrfach vorkommen kann?
Da würd ich sagen: die zu suchenden Kategorien in einen vector speichern, diesen dann durchlaufen und für jedes Element deinen Kategoriencontainer in einer schleife bis dass nichts mehr gefunden wird mit find durchlaufen. Dabei immer find den gerade gefunden index+1 als startwert angeben.
Falls es was anderes war bitte nochmal erklären.
-
Von Vektoren habe ich bisher gar keine Ahnung, da muss ich mich mal reinlesen.
Das Problem ist folgendes: Der User darf nach beliebig vielen Kategorien suchen, die entweder mit "und" oder "oder" verknüpft sind. Das Programm weiß aber davor nicht, nach wievielen Kategorien der User suchen will und muss deshalb die Variablen erst erstellen, wenn der benutzer die Daten eingibt. Die Überprüfung ob diese Kategorien in einem Eintrag enthalten sind muss ja ebenfalls angepasst werden, so dass man eben alle Variablen möglichst gleichzeitig untersucht.
Ich hoffe das war verständlicher, aber evtl. klappt das sogar mit den Vektoren, ich lese mich da mal rein!
-
Die Aufgabe habe ich abgechrieben.und die war nicht von mir.Danke trozdem.
-
Noch eine Frage: gibt es einen Befehl der abfragt, ob das erste Zeichen eines Strings eine Zahl ist?
-
Hmm, ka obs das gibt, (ich weisz nicht was der Rückgabewert von atoi ist wenn es fehlschlägt) Ich würd mir das selbst basteln, halt einfach ne funktion isint(char c) und dann eben gucken ob es eine der 10 Ziffern ist (per if halt) etwas tipparbeit, aber gibt schlimmeres.
Kann natürlich sein, dass es etwas gibt.
So, ich habe dich jetzt so verstanden:
du hast deine Kategorien in irgendeinen Container eingelesen und abgeseichert, richtig? Und jetzt sagt der User gib mir bitte mal Kategorie 512, 413 und 723 und dann muss dein Programm das suchen.
Sollte das korrekt sein ist std::vector (siehe www.cppreference.com) genau das richtige. Ein vector ist ein Datencontainer wie eben ein array, blosz performanter. Dort speicherst du die Kategorien ab, die der User eingibt.
Jetzt schaust du in deinem andern Container nach, in dem du die Kategorien gespeichert hast (dafür würde ich btw, wenn ich das jetzt richtig verstanden habe, was du machen willst, ein std::set oder std::multiset nehmen. Das suchen in diesem Container geht viel schneller) und suchst darin zuerst nach dem erstem Eintrag deines vectors, dann nach dem 2. usw bis zum letzten halt.
Ansonsten kannst du dich auch mal auf shinja_shinryuu im Skype melden. Mich würde es nämlch zu eigenen Übungszwecken interessieren.