Namen in eine Datei schreiben
-
#include <iterator> #include <fstream> #include <string> #include "boost/filesystem.hpp" int main() { using namespace std; namespace fs = boost::filesystem3; for( fs::directory_iterator it( "AppData\\" ); it!=fs::directory_iterator(); ++it ) { const fs::path absolute_path = it->path(); if( fs::is_directory( absolute_path ) ) { ifstream in("vorlage.nsi"); string vorlage_nsi( (istreambuf_iterator<char>(in)), (istreambuf_iterator<char>()) ); const string search = "VarName"; const unsigned pos = vorlage_nsi.find( search ); const string directory_name = absolute_path.filename().string(); vorlage_nsi.replace( pos, search.length(), directory_name ); ofstream out( "AppData\\"+directory_name+"\\"+directory_name+".nsi" ); out << vorlage_nsi; } } }
-
boah vielen herzlichen dank, ich habs jetzt auch hinbekomme aber nicht so sauber

werde deine lösung übernehmen die gefällt mir besser.
ich verstehe eigentlich alles von dem code bis auf
string vorlage_nsi( (istreambuf_iterator<char>(in)), (istreambuf_iterator<char>()) );was passiert bei istreambuf_iterator genau? ich hab nur englische literatur gefunden und verstehe das nicht so ganz. du erstelst eine string variable "vorlage_nsi" und übergibst ihr den kompletten inhalt von "in". aber warum 2mal?
ich glaube damit kann man viele tolle sachen machen, wenn man das genau versteht.

-
noch ne kleinigkeit, das programm ist dann schon auf rechner ohne installiertem boost,system ausführbar?
-
das mit dem string constructor ist auch nicht 100% klar..

-
###error### schrieb:
das mit dem string constructor ist auch nicht 100% klar..

Es gibt viele Varianten, den kompletten Inhalt einer Datei einzulesen. Viele sind schlecht, nur wenige sind gut. Deine
getline-Variante gehört zu den schlechten. Du willst die komplette Datei einlesen, wieso sich also auf einzelne Zeilen konzentrieren, wieso nicht gleich die komplette Datei ins Auge fassen? Dieistreambuf_iterator-Variante ist nicht nur die beliebteste, sondern auch die effizienteste (nachistream::read). Du kannst damit locker eine 100 MB große Datei binnen Sekunden einlesen. Wieistreambuf_iteratorunter der Haube funktioniert, ist eigentlich egal. Du musst nur wissen, dass damit alle Zeichen eines Streams sehr schnell wo abgespeichert werden können. Um welchen Stream es sich dabei handelt, sagst du, indem du dem Konstruktor ein Stream-Objekt übergibst. Natürlich muss das Iterieren irgendwann ein Ende haben. Ein default-konstruiertesistreambuf_iterator<char>-Objekt (istreambuf_iterator<char>()) bezeichnet deshalb das Ende eines Streams. Im Endeffekt alsostd::string(Stream-Anfang, Stream-Ende).###error### schrieb:
noch ne kleinigkeit, das programm ist dann schon auf rechner ohne installiertem boost,system ausführbar?
Ja.
-
hallo nochmal,
ich habe jetzt ein problem, ich darf das boost system erst mal nicht installieren

habe es jetzt versucht so zu lösen, aber es knallt outstream da er str_vector[i] nicht in const char* umwandeln kann. warum auch immer

wenn ich das auskommentiere knallt er schon beim replace

int main(int _argc,char** _argv){ string m_dir="AppData\\"; unsigned long fs_size=0L; //Gesamte Verzeichnis-Groesse struct _finddata_t c_file; long hFile; string suchdir="*.*";//Alle Datei und Ordner anzeigen suchdir.insert(0,m_dir); string strVersionNr; if( (hFile = _findfirst( suchdir.c_str(), &c_file )) == -1L ) { //Nichts gefunden cout << "Keine Dateien in diesem Verzeichnis!" << endl; ; } else { //vektor erstellen vector <string> str_vector; //verzeichnisse zuerst anzeigen cout << "\n Aktuelles Verzeichnis: " <<m_dir << endl; do{ fs_size+=c_file.size/1024;//groesse berechnen //=>richtige verzeichnisse heraussuchen if (c_file.size==0 && c_file.name[0]!= '.') { // cout << "[" << c_file.name << "]"<<endl; str_vector.push_back(c_file.name); } } while( _findnext( hFile, &c_file ) == 0 ); for (int i = 0; i<str_vector.size(); i++) { ifstream in("vorlage.nsi"); string vorlage_nsi( (istreambuf_iterator<char>(in)), (istreambuf_iterator<char>()) ); const string search = "VarName"; const unsigned pos = vorlage_nsi.find( search ); vorlage_nsi.replace( pos, search.length(), str_vector[i] ); ofstream out( str_vector[i]+".nsi" ); out << vorlage_nsi; } _findclose(hFile); }
-
hallo nochmal,
mir ist da was eingefallne und ich hab das jetzt so abgeändert:
vorlage_nsi.replace( pos, search.length(), str_vector[i] ); str_vector[i] = str_vector[i]+".nsi"; ofstream out( str_vector[i].c_str() );aber beim replace knallt es:
Unbehandelte Ausnahme bei 0x773c15de in nsi_creator.exe: Microsoft C++-Ausnahme: std::out_of_range an Speicherposition 0x0036f564..was könnte da nur das problem sein?

-
D.h., du benutzt irgendwo einen Index, der nicht erlaubt ist.
str_vector[i]kann es wohl nicht sein, wegeni<str_vector.size();. Dann kann es doch eig nurpossein. Aber wirft das einout-of-range. Ich weiß es nicht.
-
hmm ich glaube der hat die datei nicht gefunden. ich versuche mich gerade an meiner ersten version die zwar nicht so schön ist aber funktioniert bis auf
unsigned int pos = vectorlines[i].find("__VarName__");wenn ich pos ausgeben lasse dann findet er immer bei pos. 4294967295 VarName und dann noch ab und zu bei pos 22, was richtig ist.
wenn ich die folgendes mache:
If( vectorlines[i].find("__VarName__") >0 && vectorlines[i].find("__VarName__") < 10000) unsigned int pos = vectorlines[i].find("__VarName__");Das gleiche ist bei deinem Code aber auch

-
###error### schrieb:
wenn ich pos ausgeben lasse dann findet er immer bei pos. 4294967295 VarName und dann noch ab und zu bei pos 22, was richtig ist.
4294967295 ist std::string::npos. Falls du das bekommst, dann enthält der string die gesuchte Zeichenkette nicht. Dann ist wohl der Aufbau deiner vorlage.nsi flasch.

-
haha ne ich habs geschafft den nächsten anfänger fehler zu produzieren
for (int i....){ for (int i.....) }zweimal die gleiche variable ist wohl nicht.

ich hab jetzt ne lösung, die ist zwar nicht schön aber selten und funktioniert...
dennoch werde ich jetzt noch versuchen deine idee umzusetzen, da ich noch ein wenig zeit habe.
-
###error### schrieb:
haha ne ich habs geschafft den nächsten anfänger fehler zu produzieren
for (int i....){ for (int i.....) }zweimal die gleiche variable ist wohl nicht.

An sich schon, nur überdeckt das innere i das Äußere innerhalb der inneren for-Schleife.
-
haha ja, das hat dann nicht gepasst... und hat dann ins leere geschrieben

also ich hab das jetzt hinbekommen, super sache.
aber jetzt stehe ich schon wieder vor einer hürde,
ich weiß nicht nach was ich da suchen soll oder wie das geht.Es werden ja .nsi Dateien erstellt die mit NSIS kompiliert werden. Normal geht man mit der rechten Maustaste auf die Datei und sagt dann mit NSIS kompilieren.
Kann ich das irgendwie in meinem Programm machen. Ich google mir schon die Finger wund nur find ich dazu nix.
Vielen Dank an euch alle ohne euch wäre ich komplett aufgeschmissen

-
ich denke dazu ist die funktion
ShellExecute(NULL, "open", <fully_qualified_path_to_folder>, NULL, NULL, SW_SHOWNORMAL);
geeignet.
aber ich weiß nicht wie ich der funktion die exe und die datei übergeben soll

-
des teil macht mich verrückt
string ToOpenProg = DirContainer[i]; ToOpenProg += string(+".nsi"); ShellExecute(NULL,TEXT("open"), ToOpenProg.c_str() ,TEXT(""),NULL,SW_SHOW);error C2664: 'ShellExecuteW': Konvertierung des Parameters 3 von 'const char *' in 'LPCWSTR' nicht möglich
Das ist doch sicher wieder irgend ein trick den ich nciht kenn

kann ich dem programm eigentlich auch sagen, mit welcher externen anwendung er die datei öffnen soll? ich find in google dazu nix

-
###error### schrieb:
error C2664: 'ShellExecuteW': Konvertierung des Parameters 3 von 'const char *' in 'LPCWSTR' nicht möglich
Darum benutze ich keine WinAPI, diese komichen Typnen da. :p Ich glaube, der will einen
const wchar_t*, also nicht sowas"abc", sondern sowasL"abc"###error### schrieb:
kann ich dem programm eigentlich auch sagen, mit welcher externen anwendung er die datei öffnen soll? ich find in google dazu nix

Rechtklick - öffnen mit - immer das oder jenes?

-
Es geht jetzt mit ShellExecuteA:
ShellExecuteA(NULL,"open", ToOpenProg.c_str() ,"",NULL,SW_SHOW);out schrieb:
###error### schrieb:
kann ich dem programm eigentlich auch sagen, mit welcher externen anwendung er die datei öffnen soll? ich find in google dazu nix

Rechtklick - öffnen mit - immer das oder jenes?

genau das mein ich.
-
###errpr### schrieb:
genau das mein ich.
Wenn ich out nicht komplett falsch vertsanden habe, dann war das schon sein Lösungsvorschlag.
Aber ich glaube ich versteh jetzt gar nichts mehr. Hast du nun das Problem mit Öffnen im externen Programm gelöst oder nicht?