2016-09-26 2 views
1

Hier ist mein Problem: Ich möchte den FileName erweitern, den der Benutzer das Programm im SaveFileDialog mit einer Indexnummer gibt. Ich bekomme den vollständigen Pfad aus dem Dialog und suche '.' drin.Holen Sie sich FileName aus SaveDialog und ändern Sie es dynamisch C++

System::String^ str = saveFileDialog1->FileName; 
    pin_ptr<const wchar_t> wch = PtrToStringChars(str); 
    size_t convertedChars = 0; 
    size_t sizeInBytes = ((str->Length + 1) * 2); 
    errno_t err = 0; 
    char *FileName = (char*)malloc(sizeInBytes); 
    err = wcstombs_s(&convertedChars, 
     FileName, sizeInBytes, 
     wch, sizeInBytes); 
for (size_t i = 0; i < sizeof((*FileName)); i++) 
    { 

     if (FileName [i]=='.') 
     { 



     } 
} 

und an diesem Punkt habe ich verschiedene Dinge versucht, die Datei mit dem bearbeiten:

insert(i-1, ("_%i",i)); 

Nichts, was ich versucht habe, funktioniert, wie ich es will.

Ich möchte verschiedene Bilder einer Kamera speichern und mit diesem Index ist es einfacher für den Benutzer, das gewünschte Bild zu finden.

Vielen Dank im Voraus!

Knut

+0

Ich verstehe nicht, was Sie eigentlich erreichen wollen. Können Sie den vollständigen Anwendungsfall aus der Sicht des Benutzers beschreiben? – Firzen

+0

Der Benutzer kann auswählen, wie viele Bilder das Programm aufnehmen soll. Dann nimmt das Programm automatisch die Bilder mit verschiedenen Einstellungen der Kamera auf. Ich möchte einen Teil der Einstellung im Dateinamen finden. Dann ist es einfacher, das Bild zu finden. Die Zahl am Ende des Dateinamens zu erhöhen, ist nur zum Ausprobieren, wie es funktionieren könnte. –

+0

Der Benutzer gibt mir zum Beispiel den Pfad c: \ Benutzer \ Dokument \ Dateiname.txt. Was ich tun möchte ist, dass mein Programm ein neues Bild als Dateiname_1 speichert und die Nummer für jedes neue Bild erhöht. –

Antwort

0

So müssen Sie im Grunde Dateinamen seiner rohen Namen und die Erweiterung spalten, und dann diese Teile mit einem gewissen Index zu verbinden. Sie können diese Funktion verwenden:

string get_indexed_name(string filename, string index) 
{ 
    size_t lastindex = filename.find_last_of(".");  // get position of dot 
    string rawname = filename.substr(0, lastindex); // get string contents before dot 
    string extension = filename.substr(lastindex + 1); // get string contents after dot 

    return rawname + index + "." + extension;   // return indexed name 
} 

Auf diese Weise werden vordefinierte Standardfunktionen verwendet. Wenn Sie es selbst machen wollen (und lernen), versuchen Sie, die Funktionen find_last_of und substr zu implementieren. Dann können Sie Ihre eigene Implementierung verwenden.

Wenn es etwas Kompilation Problem ist, sollten Sie Ihren Quellcode mit diesen Zeilen zu starten:

#include <iostream> 
using namespace std; 
+0

genau, wenn Sie Ihre Antwort geschrieben haben Ich bekomme es von mir selbst: D. Danke für diese Lösung und für Ihre Fragen, die mich selbst eine Lösung finden lassen. –

+0

Ich bin froh, dass Sie es selbst lösen konnten. Herzliche Glückwünsche! – Firzen

0

Hier ist meine Lösung:

System::String^ str = saveFileDialog1->FileName; 


    std::string sFilePath = msclr::interop::marshal_as<std::string>(str); 
    std::string fileExtension=msclr::interop::marshal_as<std::string>(str); 
    size_t pos= sFilePath.find('.', 1); 
    sFilePath = sFilePath.substr(0, pos); 
    fileExtension = fileExtension.substr(pos);        
    for(size_t i=0; i<100; i++){        
      std::string fileName; 
      fileName = sFilePath + std::to_string(i) + fileExtension;} 

Für diese Lösung müssen Sie umfassen.

#include <msclr\marshal_cppstd.h> 

Und wenn Sie möchten, dass Ihre Dateinummer mit verbleiter Null Sie haben string wie folgt zu verwenden:

 string fileName; 
     string fileNumber ; 
     stringstream ss; 
     ss <<'_'<< setfill('0') << setw(4) << std::to_string(i); 
     fileNumber = ss.str(); 
     fileName = f_sFilePath + fileNumber + f_sFileExtension; 
Verwandte Themen