[erledigt] wie an String Dateiendung anhängen
-
Hallo
Ich habe das Problem, das ich versuche mit + an einen String eine Dateiendung anzuhängen, diese dann jedoch am Anfang landet. Es folgt die Klasse und die eingelesene Datei.
main.cpp:
#include <cstdlib> #include <iostream> #include <fstream> #include <string> #include "FileAction.h" #include "Lektion.h" #include "Language.h" #include <vector> int main(int argc, char** argv) { Language lec("/home/heckenschere/Vokabeln/Franc2"); /* Erstellen einer Instanz der Klasse Language */ return 0; }Language.h:
class Language { public: Language(std::string path); std::vector<Lektion> leks; //std::vector für verschiedene Lektionen private: };Language.cpp :
#include "Language.h" Language::Language(std::string path) { std::vector<std::string> lecArray= FileAction::fileToVector(path + "/Lektionen.dat"); //Erstellen eines std::vectors mit einem zeilenweisen Dateiinhalt leks.resize(lecArray.size()-1); //Vergrössern des std::vectors leks auf benötigte grösse for(int i=1; i<lecArray.size(); i++){ std::string stan= path+"/"+lecArray[i]+".dat"; //Erstellen des Dateinamens std::cout<<stan<<std::endl; //Ausgabe } }Lektionen.dat:
Speak it 2000-File Lecon_02_01 Lecon_02_02Ausgabe:
.date/heckenschere/Vokabeln/Franc2/Lecon_02_01
/home/heckenschere/Vokabeln/Franc2/Lecon_02_02.datSeltsamerweise hängt er beim ersten String das .dat an den Anfang. Wie kann ich dafür sorgen, dass es auch am Ende landet?
Für alle Helfer: Danke im voraus.
Freundliche Grüsse
deckungsgradkontro
-
Ich kann den Fehler in den gezeigten Teilen nicht finden. Aber das sieht mir teilweise recht wild aus, nicht nur von der Einrückung her. Dir scheint zum Beispiel nicht klar zu sein, dass das erste Element eines vectors den Index 0 hat.
Wenn ich deinen gezeigten Code zu etwas Compilierbarem ergänze:
#include <iostream> #include <string> #include <vector> class Language { public: Language(std::string path); private: }; Language::Language(std::string path) { std::vector<std::string> lecArray= {"ABC", "DEF", "IJK"}; for(int i=1; i<lecArray.size(); i++){ std::string stan= path+"/"+lecArray[i]+".dat"; //Erstellen des Dateinamens std::cout<<stan<<std::endl; //Ausgabe } } int main(int argc, char** argv) { Language lec("/home/heckenschere/Vokabeln/Franc2"); /* Erstellen einer Instanz der Klasse Language */ return 0; }Dann kommt auch das raus, was ich von diesem Code erwarten würde:
/home/heckenschere/Vokabeln/Franc2/DEF.dat /home/heckenschere/Vokabeln/Franc2/IJK.datDer Fehler liegt vermutlich in den nicht gezeigten Teilen, als erster Verdacht würde ich mal sagen, dass fileToVector irgendwas komisches macht. Denk auch an die Leerzeilen in deiner Datei.
-
Ich werde noch die restlichen Teile posten:
FileAction.h:
#include <string> #include <fstream> #include <iostream> #include <vector> class FileAction { public: FileAction(); static std::vector<std::string> fileToVector(std::string path); private: };FileAction.cpp :
#include "FileAction.h" FileAction::FileAction() { } std::vector<std::string> FileAction::fileToVector(std::string path){ std::ifstream file; std::vector<std::string> returner; std::string text; file.open(path, std::ios::in); while(!file.eof()) { text = ' '; getline(file, text); returner.push_back(text); } file.seekg(0); return returner; }normale Variante von Language.cpp (mit neuen Ausgaben)
std::vector<std::string> lecArray= FileAction::fileToVector(path + "/Lektionen.dat"); //Erstellen eines std::vectors mit einem zeilenweisen Dateiinhalt //std::vector<std::string> lecArray = {"Halloechen", "Jetzt", "Ende"}; for(int i=0; i<lecArray.size(); i++){ //Ausgabe zur Klarheit std::cout<<"¬"<<lecArray[i]<<"|"<<std::endl; } leks.resize(lecArray.size()-1); //Vergrössern des std::vectors leks auf benötigte grösse for(int i=1; i<lecArray.size(); i++){ std::string stan= path+"/"+lecArray[i]+".dat"; //Erstellen des Dateinamens std::cout<<stan<<std::endl; //Ausgabe }Ausgabe:
|Speak it 2000-File
|Lecon_02_01
¬Lecon_02_02|
.date/heckenschere/Vokabeln/Franc2/Lecon_02_01
/home/heckenschere/Vokabeln/Franc2/Lecon_02_02.databgeänderte Variante von Language.cpp (mit anderem Vector)
std::vector<std::string> lecArray = {"Halloechen", "Jetzt", "Ende"}; for(int i=0; i<lecArray.size(); i++){ std::cout<<"¬"<<lecArray[i]<<"|"<<std::endl; } leks.resize(lecArray.size()-1); //Vergrössern des std::vectors leks auf benötigte grösse for(int i=1; i<lecArray.size(); i++){ std::string stan= path+"/"+lecArray[i]+".dat"; //Erstellen des Dateinamens std::cout<<stan<<std::endl; //Ausgabe }Ausgabe:
¬Halloechen|
¬Jetzt|
¬Ende|
/home/heckenschere/Vokabeln/Franc2/Jetzt.dat
/home/heckenschere/Vokabeln/Franc2/Ende.datMit der Aenderung ist es korrekt.
Ich fange bei 1 mit zaehlen an, weil die erste Zeile (index 0) nichts sinnvolles enthält.
Vielleicht kann man jetzt das Problem sehen?
Es wäre sehr zuvorkommend, wenn mir jemand helfen würde.
Vielen Dank
-
Hehe, dein Dateieinlesen ist lustig. Woher kommt bloß immer dieser Anfängerfehler mit dem eof? Steht das in irgendeinem schlechten Lehrbuch so drin?
Aber außer dass es am Ende eine Leerzeile zu viel liest und einige unnötige Sachen macht, ist es nicht direkt falsch in dem Sinne, dass es den Fehler erklärt.
Bei mir tritt er auch nicht auf (ich habe noch das resize entfernt, da ich die Klasse Lektionen nicht habe, hat dies eventuell irgendwelche Nebeneffekte?):
¬Speak it 2000-File| ¬| ¬Lecon_02_01| ¬| ¬Lecon_02_02| ¬| .//.dat .//Lecon_02_01.dat .//.dat .//Lecon_02_02.dat .//.datDie ganze Ausgabe ist bei dir total durcheinander. Beachte die Stellung der '¬' und '|' bei dir und bei mir. Aber ich bin mit meinem Latein am Ende. Ich kann den Fehler nicht nachvollziehen. Und man kann's auch nicht wirklich auf einen kaputten Compiler schieben, deiner kann offensichtlich C++11 und sollte daher einigermaßen modern sein (welcher ist es denn?). Vielleicht irgendeine kaputte Konsole? Oder enthältst du uns noch was irgendetwas vor?
Das einzige was mir noch einfällt ist, das Ding mal durch einen Debugger zu schicken und zu gucken, wann welche Variablen welche Werte haben. Eigentlich tust du das schon mit deinen Ausgaben, aber irgendwas stimmt mit denen nicht. Wo ist zum Beispiel das führende '¬'? Hast du vielleicht irgendwelche unsichtbaren Escapesequenzen in deiner Datei die den Bildschirm oder einzelne Zeilen löschen? Erstell die Datei vielleicht noch einmal neu mit irgendeinem Beispieltext. Und zwar selber ein paar Testzeilen tippen, kein Copy&Paste der alten Datei. Oder guck die alte Datei mal mit einem Hex-Editor an.
-
¬Speak-It 2000-File|
¬Lecon_02_01|
¬Lecon_02_01|
/home/heckenschere/Vokabeln/Franc2/Lecon_02_01.dat
/home/heckenschere/Vokabeln/Franc2/Lecon_02_01.datEr spuckte es mir richtig aus, nachdem ich die Datei neu geschrieben hatte.
Vielleicht liegt daran, dass die alte ursprünglich in ISO-8859-1 war, das Programm aber, glaube ich, in UTF-8, wie die neue Datei.Vielen Dank für die Hilfe.
-
Für alle die es zu diesem Thema interessiert.
Die restlichen Dateien habe ich mit folgenden Befehl umgewandelt( wegen Umlauten)(unter Ubuntu 11.04)
cd <Ordner> recode utf-8..iso-8859-1 *.datNur so als Hinweis.