string replace



  • Ich suche jetzt schon wieder bald seit 2 Stunden aber bekomm es nicht heraus wie bekomm ich von einem OpenDialog der mir den

    ofn.lpstrFile
    

    zurück gibt einen Pfad den mein Programm auch verwenden kann sprich es muss anstatt jedem \ ein \\ sein oder habe ich schon wieder etwas falsch verstanden.

    Ich bin am verzweifeln mit string.replace komm ich auch nicht weiter bitte helft mir



  • thefiloe schrieb:

    es muss anstatt jedem \ ein \\ sein oder habe ich schon wieder etwas falsch verstanden.

    Du hast schon wieder etwas falsch verstanden.
    Probiers doch einfach mal ohne dein replace aus.

    Der Vollständigkeit halber: Ein char-replace sieht in C++ so aus:

    std::string s(ofn.lpstrFile)
    for (string::size_type pos; (pos = str.find('\\', pos)) != string::npos; ++pos)
       s.replace(pos, 1, "\\\\");
    


  • ofn.lpstrFile kann direkt verwendet werden.
    Warum? Eine Zeichenkette ist eine Aneinanderreihung von chars, die alle einen bestimmten Wert haben. Schau dir mal in Ruhe die ASCII-Tabelle an.
    Der Backslash hat den dezimalen Wert 92, steht er in der Zeichenkette, wird er natürlich richtig interpretiert.

    Anders im Editor: Nachdem der Compiler einen Backslash erkennt, wertet er das nächste Zeichen direkt als Escape Sequence aus (falls er sie nicht kennt, gibt es eine Warnung).
    Dies sind z.B. '\n','\r','\"' und eben auch '\'.
    Daher kann man im Editor "c:\\neuer ordner" schreiben, "c:\neuer ordner" führt nicht zum Ziel, da '\n' als (falsche) Escapesequenz gewertet wird.



  • EDIT: ich habe herausgefunden wenn ich das lied direkt von C:\... hole gehts sobald ich in das standartmäßige musik verzeichnis komme nicht mehr wieso?



  • Code zeigen!
    Ins Blaue hinein würde ich tippen, dass der Buffer zu klein ist.



  • hier ist der code:

    ich weiß ist sicher unsauber aber ist eben eines der ersten Projekte ohne mein Buch...

    sry

    /* 
     * File:   main.cpp
     * Author: Florian
     *
     * imports dll
     *
     * Created on 29. November 2010, 18:34
     */
    
    #include <iostream>
    #include <windows.h>
    #include "bass.h"
    
    using namespace std;
    
    //form structures
        //OpenfileDia
            OPENFILENAME ofn;       
            char szFile[260];       
            HWND hwnd;                        
    
    DWORD flags[4]={BASS_SPEAKER_FRONT,BASS_SPEAKER_REAR,BASS_SPEAKER_CENLFE,BASS_SPEAKER_REAR2};
    HSTREAM chan[4];
    
    void OpenfileDia(void);
    
    int main(void) {
        //int speaker=LOWORD(w)-10;
            //vars:
    
        int iChanPlace = 0;
        int iLenght = 0;
        int iPosition = 0;
        int iProgressBarValue = 0;
    
        OpenfileDia();
    
        BASS_Init(-1,44100,0,0,0); //bei console ist handle NULL bei window müsste so sein:     HWND handle;     BASS_Init(-1,44100,0,handle,0,0);
        BASS_StreamFree(chan[iChanPlace]); // free old stream before opening new
        if (!(chan[0]=BASS_StreamCreateFile(FALSE,ofn.lpstrFile,0,0,flags[iChanPlace]|BASS_SAMPLE_LOOP))) {
             cout << "Err" << endl;
             return 1;
        }
    
        BASS_ChannelPlay(chan[iChanPlace],FALSE);
         while ( 0 < 1)
         {
            cout << "playing" << endl;
            iLenght = BASS_ChannelGetLength(chan[iChanPlace],BASS_POS_BYTE);
            iPosition = BASS_ChannelGetPosition(chan[iChanPlace],BASS_POS_BYTE);
            iProgressBarValue = (iPosition * 100) / iLenght;
            cout << "--<";
            for(int i = 0; i <= iProgressBarValue; i++ ){
                cout << "#";
            }
    
            for(int i = 0; i <= 100-iProgressBarValue; i++){
                cout << "-";
            }
    
            cout << ">--";
    
            Sleep(1000);
    
            system("cls");
         }
        return 0;
    }
    
    void OpenfileDia(void){
    
    ZeroMemory(&ofn, sizeof(OPENFILENAME));
    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = hwnd;
    ofn.lpstrFile = szFile;
    ofn.nMaxFile = sizeof(szFile);
    ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
    ofn.nFilterIndex = 1;
    ofn.lpstrFileTitle = NULL;
    ofn.nMaxFileTitle = 0;
    ofn.lpstrInitialDir = NULL;
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
    
    if (GetOpenFileName(&ofn)==TRUE){
        cout << "geöffnet" << endl;
    }
    
    }
    


  • Die aufrufende Funktion kann nicht herausfinden, ob eine Auswahl in OpenfileDia getroffen wurde. Sprich, die Funktion sollte über Erfolg oder Misserfolg Auskunft geben. Globale Variablen sind hier total überflüssig und sollten vermieden werden.

    bool OpenfileDia(HWND hwnd, char* file, int len)
    {
    	OPENFILENAME ofn;
    	ZeroMemory(&ofn, sizeof(OPENFILENAME));
    	ofn.lStructSize = sizeof(OPENFILENAME);
    	ofn.hwndOwner = hwnd;
    	ofn.lpstrFile = file;
    	ofn.nMaxFile = len;
    	ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
    	ofn.nFilterIndex = 1;
    	ofn.lpstrFileTitle = NULL;
    	ofn.nMaxFileTitle = 0;
    	ofn.lpstrInitialDir = NULL;
    	ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
    	return (GetOpenFileName(&ofn));
    }
    

    Die Funktion wird jetzt mit Parametern aufgerufen, die lokal gehalten werden können:

    char szFile[MAX_PATH];
    if(OpenfileDia(GetConsoleWindow(),szFile,MAX_PATH))
    {
      cout << szFile << endl;
      // jetzt mit szFile arbeiten
    }
    


  • ich verstehs nicht ich geb ihm genau das gleiche als parameter mit wie vorhin in den globalen variabeln und es funktioniert aber nicht.

    Bei dem alten code:

    siehe oben habe ich gepostet

    geht es gut

    hier nicht:

    /*
     * File:   main.cpp
     * Author: Florian
     *
     * imports dll
     *
     * Created on 29. November 2010, 18:34
     */
    #define _WIN32_WINNT 0x600  // Windows XP = 0501H; Vista 0600
    #include <iostream>
    #include <windows.h>
    #include "bass.h"
    
    using namespace std;
    
    DWORD flags[4]={BASS_SPEAKER_FRONT,BASS_SPEAKER_REAR,BASS_SPEAKER_CENLFE,BASS_SPEAKER_REAR2};
    HSTREAM chan[4];
    OPENFILENAME ofn;
    
    bool OpenFileDia(HWND,char*);
    
    int main(void) {
        //int speaker=LOWORD(w)-10;
            //vars:
    
        int iChanPlace = 0;
        int iLenght = 0;
        int iPosition = 0;
        int iProgressBarValue = 0;
        //openfile
        char szFile[260];
        //--
        cout << "Adresse in Funktion : " << &szFile << endl;
        OpenFileDia(GetConsoleWindow(), szFile);
        BASS_Init(-1,44100,0,0,0); //bei console ist handle NULL bei window müsste so sein:     HWND handle;     BASS_Init(-1,44100,0,handle,0,0);
        BASS_StreamFree(chan[iChanPlace]); // free old stream before opening new
        if (!(chan[0]=BASS_StreamCreateFile(FALSE,ofn.lpstrFile,0,0,flags[iChanPlace]|BASS_SAMPLE_LOOP))) {
             cout << "Err" << endl;
             return 1;
        }
    
        BASS_ChannelPlay(chan[iChanPlace],FALSE);
         while ( 0 < 1)
         {
            cout << "playing" << endl;
            iLenght = BASS_ChannelGetLength(chan[iChanPlace],BASS_POS_BYTE);
            iPosition = BASS_ChannelGetPosition(chan[iChanPlace],BASS_POS_BYTE);
            iProgressBarValue = (iPosition * 100) / iLenght;
            cout << "--<";
            for(int i = 0; i <= iProgressBarValue; i++ ){
                cout << "#";
            }
    
            for(int i = 0; i <= 100-iProgressBarValue; i++){
                cout << "-";
            }
    
            cout << ">--";
    
            Sleep(1000);
    
            system("cls");
         }
        return 0;
    }
    
    bool OpenFileDia(HWND hwnd,char* file){
    
    ZeroMemory(&ofn, sizeof(OPENFILENAME));
    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = hwnd;
    ofn.lpstrFile = file;
    ofn.nMaxFile = sizeof(file);
    ofn.lpstrFilter = "All\0*.*\0Mp3's\0*.MP3\0";
    ofn.nFilterIndex = 1;
    ofn.lpstrFileTitle = NULL;
    ofn.nMaxFileTitle = 0;
    ofn.lpstrInitialDir = NULL;
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
    
    cout << "Adresse in Funktion : " << &file << endl;
    return GetOpenFileName(&ofn);
    
    }
    

    aber ich habe auch eine vermutung:

    Ich habe zwar noch sogut wie nie mit zeigern gearbeitet aber müsste die Adresse von file in der Funktion OpenFileDia nicht gleich wie sein wie die Adresse in der Main-Funktion von szFile...

    Entschuldigung, dass ich mich hier so Anfängermäßig verhalte aber ich gebe mir wirklich mühe und bin immer bevor ich hier was poste 1-2 Stunden am suchen also sorry 😣



  • Du gibtst für ofn.nMaxFile eine maximale Länge von sizeof(char*) an. Das ist genau die Größe eines Zeigers (32 Bit -> 4 Byte, 64 Bit -> 8 Byte).

    Warum hast du die Funktion nicht übernommen, wie ich es geschrieben habe? Warum ist OPENFILENAME ofn immer noch global? Warum verwendest du überhaupt die restlichen globalen Variablen?

    Das eigentliche Problem ist aber Folgendes: Du kannst durch einen Zeiger nicht auf den kompletten Bereich schließen, auf den er zeigt. Daher übergibt man in aller Regel die Größe des Bereichs gleich mit.

    Um die Konvertierung von int nach bool zu vermeiden, kannst du auch

    return (GetOpenFileName(&ofn)?true:false);
    

    schreiben. Der Returnwert sollte auch besser ausgewertet werden 🙂 .



  • danke nochmal und wieso ich deine funktion nicht genau so übernommen habe ist:

    1. sie hat nicht funktioniert aber ich probier es jetzt mit den neuen infos nochmal und
    2. wollte ich auch einwenig selber was lernen :D, da ich nicht viel con c&p halte...


Anmelden zum Antworten