Stringstream macht nicht, was es soll
-
Ich wünsche einen guten Abend erstmal.
Ich bin mir nicht sicher, ob meine Anwendung auch unter windows läuft. Ich vermute, man kann se nur mit dem mingw compiler unter windows compilen. Aber das ist mal nebensache. Es geht ja nicht direkt um mein Programm, sondern um stringstreams, welche dort vorkommen. Die konvertierung von einem File stream zu einem string funktioniert nicht. Wenn ich den string anschließend ausgebe mittels cout, wird mir der Quellcodename ausgegeben...
Ich frage mich sehr, wie das geht. Naja, hier ist es mal:#include <dirent.h> #include <iostream> #include <fstream> #include <sstream> #include <string> using namespace std; int main() { string convstring; stringstream convert; char path[] = "./"; DIR *workdir; struct dirent *datei; workdir = opendir(path); while (datei = readdir(workdir)) { DIR *subdir; if(subdir = opendir(datei->d_name)) { closedir(subdir); } else { //cout << "Datei: " << datei->d_name << " In Arbeit" <<endl; ifstream file(datei->d_name); if(file.is_open() !=true) { cout << "Fehler beim öffnen! (haben Sie die Datei noch zufällig geöffnet o.Ä.?)"<< endl; } convert << datei->d_name; convert >> convstring; cout << convstring <<endl; file.close(); } } closedir(workdir); }zwecks dirent.h funktioniert der Visual C++ compiler nicht. Falls ich dennoch das falsche Forum gewählt habe, möge ein Team Member bitte dieses Thema in das richtige Forum verschieben.
Mit freundlichen Grüßen
taipierEdit: Aaaach verd...
Ich bitte um Entschuldigung, ich bin noch nicht lange bei C++, deswegen noch an ANSI C gewohnt. Möchte es ein Team Member verschieben?
-
wieso postest du deine C++ Probleme im ANSI C Unterforum?

-
Dieser Thread wurde von Moderator/in Nobuo T aus dem Forum ANSI C in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
taipier schrieb:
Wenn ich den string anschließend ausgebe mittels cout, wird mir der Quellcodename ausgegeben...
convert << datei->d_name; convert >> convstring;Du gibst ja auch den Dateinamen in den Stringstream rein. Was soll dort anderes wieder rauskommen?
convert << file.rdbuf(); // man kann den Streambuffer direkt in einen Stream kopieren, das kopiert alle dahinterliegenden Daten bis end-of-file/-stream convstring = convert.str(); // convert >> convstring würde beim ersten Whitespace aufhören zu lesen. str() liefert den kompletten String
-
Zur Frage Windows-Anwendung? Klar gehen dort auch streams, gehören schliesslich zum C++-Compiler.
-
Ich danke sehr für die Antworten. Die "." und ".." hab ich ja durch das Erkennen von Verzeichnissen rausgemacht. Wieso is jetz meine Ausgabe nicht richtig?
#include <dirent.h> #include <iostream> #include <fstream> #include <sstream> #include <string> using namespace std; int main() { string stealerstring, convertstring; stringstream convert; char path[] = "./"; DIR *workdir; struct dirent *datei; workdir = opendir(path); while (datei = readdir(workdir)) { DIR *subdir; if(subdir = opendir(datei->d_name)) { closedir(subdir); } else { //cout << "Datei: " << datei->d_name << " In Arbeit" <<endl; ifstream stealerfile(datei->d_name); if(stealerfile.is_open() !=true || datei->d_name == "main.o" || datei->d_name == "main") { cout << "Fehler beim öffnen! (haben Sie die Datei noch zufällig geöffnet o.Ä.?)"<< endl; } convert << stealerfile.rdbuf(); convert >> stealerstring; stealerstring = convert.str(); cout << stealerstring <<endl; stealerfile.close(); } } closedir(workdir); }Hiermit geh ich nach und nach jede Datei durch und gib se in stdout aus. Doch i-was stimmt da nicht. Die Ausgabe ist im Terminal keinesfalls richtig und mittels umleiten ./main > ausgab und anschließend gedit ausgabe sagt er mir, ich würde die falsche Codierung wählen. Deshalb denke ich, dass dort binäre Teile enthalten sind...
Was mache ich noch falsch? Achja, das mit der kompatibilität zu windows meinte ich, weil jemand das mit Visual C++ nicht compilen konnte. Weiß ja net, wie's mit mingw aussieht.
-
taipier schrieb:
zwecks dirent.h funktioniert der Visual C++ compiler nicht.
Der Compiler funktioniert. Was nicht funktioniert sind Fehlermeldungen wie "funktioniert nicht".
Okay Scherz beiseite: Wenn der MSVC dirent.h nicht schluckt, dann liegts entweder daran, dass dort etwas nicht standardkonform ist, was andere Compiler aber akzeptieren, oder dass in dirent.h einer der wenigen Punkte vorkommt, wo der MSVC kein Standard-C++ versteht (z.B. muss man ihm die Bedeutung von "and", "or" etc. meines Wissens erst durch einen eigenen Header beibringen).Was die grundsätzliche Windows-kompatibilität deiner Anwendung angeht: kommt auf dirent.h an. Soweit ich das aus dem Quellcode entnehmen kann, bietet der Header Funktionalität zum surfen in Verzeichnisbäumen. Dazu muss normalerweise auf die API des jeweiligen Betriebssstems zugegriffen werden, so dass dirent.h vermutlihc nicht per sé für alle Betriebssysteme geeignet ist. Du solltest aber der entsprechenden Dokumentation entnehmen können, ob Windows zu den unterstützten Plattformen gehört. (Wenns unter windows mit mingw kompiliert ist das wahrscheinlich der Fall).
Noch ein paar Kleinigkeiten zum Codestil:
- In C++ ist es nicht obligatorisch, Variablen am Anfang eines Blocks bzw einer Funktion zu deklarieren. Du kannst (und solltest der Übersicht halber) convert und convstring ruhig erst dort deklarieren, wo du sie auch brauchst.
- wenn datei->d_name ein C-String ist (char* oder const char*), dann brauhcst du den Umweg über den Stringstream nicht gehen sondern kannst gleich den String damit initialisieren.
- Umlaute gehören nicht zum Standard-Zeichenrepertoire von C++, das kann also bei machen Compilern zu Fehlern führen.
-
Das datei->d_name ein C-String ist, war mir klar. Doch ich will den Inhalt ausgebe. Oke, das mit den Variable kommt noch aus Gewohnheit. Und um die Umlaute kümmer ich mich immer zum Schluss. Da geh ich dann mit einem anderen Programm drüber und ersetz alle Umlaute in Hex codes. Danke für deine Ansprache über Kompatibilität, doch http://www.codeguru.com/forum/showthread.php?s=&threadid=272943 Google zeigte mir, dass es wirklich an MSVC liegt, wie ich vermutete. Doch meine Probleme sind noch nicht gelöst.
-
Mit "die Ausgabe ist nicht richtig" und "i-was stimmt nicht" gibst du nicht gerade viele Anhaltspunkte. Schön wäre zum Beispiel zu wissen, was du als Ausgabe erwartest und was du bekommst. Und was genau nicht stimmt.
Das mit der binär codierten Ausgabe kann natürlich sein. Wenn du binäre Dateien einliest und in einen Stringstream schiebst kann vieles passieren. folgendes ist allerdings definitiv nicht besonders sinnvoll:
convert >> stealerstring; stealerstring = convert.str();Damit liest du zuerst in deinen String etwas aus dem stringstream ein, nämlich das erste "Wort", also alles bis zum ersten Zeichen das was Whitespace interpretiert wird (da kann in ner binären Datei einiges drin sein). Danach schiebst du in den selben String den Rest des stream-Inhalts, ohne das "Wort" von vorher irgendwie zu verwenden.
-
Entschuldigung, dass ich mich nicht ausreichend ausgedrückt habe. Ich meinte natürlich hier
Das datei->d_name ein C-String ist, war mir klar. Doch ich will den Inhalt ausgebe.
, dass ich von allen Dateien im aktuellen Verzeichnis den Inhalt auf einmal ausgeben will.
-
taipier schrieb:
dass ich von allen Dateien im aktuellen Verzeichnis den Inhalt auf einmal ausgeben will.
Das haben wir uns schon fast gedacht.

(Tipp: Versuchs mal ohne das convert >> stealerstring. Und wenn es dann immernoch nicht klappt sag uns endlich WAS Du erwartest und WAS Du stattdessen bekommst)