Problemlösung gesucht (fopen)



  • Hallo ich habe ein kleines Problem.

    Ich habe ein kleines Tool programmiert und hänge nun.

    if(noPcmInput == 1)
        {    
            MakeDestFile(TrackNo,startoffset,endoffset);
            iniVariablesSet = 0;
        }
        else
        {
            MakeDestFile(szPcmDirname,startoffset,endoffset);
            iniVariablesSet = 0;
        }
    
    void MakeDestFile(char* szPcmDirname,unsigned long startoffset,unsigned long endoffset)
    {
        FILE *fp;                //Filepointer
    
        fp = fopen (szPcmDirname,"wb");            
        counter = startoffset;
        fseek(fd,startoffset,SEEK_SET);        // set fd-pointer to startoffset
    
        while(endoffset > counter)        // read data from DAT File and write it into the 
        {                                // PCM File until endoffset > counter
            fread(......);
            fwrite(.....);
            counter = .....;
    
        }
        fclose(fp);        // close PCM File
    }
    

    So es gibt 2 Optionen im Hauptprogramm:

    entweder der benutzer gibt das "szPcmDirname" an oder er gibt es nicht.
    Das Problem wenn er es angibt ist gelöst.

    Jedoch brauche ich eine Lösung, wenn der Benutzer es nicht angibt, soll folgendes Schema entstehen:

    c:\trk01.pcm
    c:\trk02.pcm
    .
    .
    .
    die datei sollte lokal auf C: sein und der dateiname soll trk0x.pcm lauten, wobei das x immer incrementiert wird bzw der Variable TrackNo entsprict

    wie kann man das problem lösen????

    danke

    mfg

    sanv



  • char buffer[256];
    sprintf(buffer,"foo%d",5);

    buffer beinhaltet "foo5"

    Hilft dir das bei deinem Problem?



  • em nein nicht wirklich 😢
    weiß nicht genauwas du damit meinst!!

    es geht ja darum welchen paramter ich in der folgenden funktion (MakeDestFile) eingeben soll:

    if(noPcmInput == 1) 
        {     
            MakeDestFile(??????,startoffset,endoffset); 
            iniVariablesSet = 0; 
        }
    


  • @viveks
    Shade meint damit du sollst dir deinen Dateinamen mit sprintf() zusammenbauen.

    char text[20];
    
    for(i=0;i<10;++i)
    {
       sprintf(text, "trk%02d.pcm", i);
    
       printf("%s", text);
    }
    

    Probier das mal aus und dann solltest du verstehen was gemeint ist 😉



  • if(noPcmInput == 1)
    	{	
    		char PcmBuffer[200];
    
    		sprintf(PcmBuffer,"trk%d.pcm",TrackNo);
    		szPcmDirname  = PcmBuffer;
    		MakeDestFile(szPcmDirname,startoffset,endoffset);
    		iniVariablesSet = 0;
    	}
    	else
    	{
    		MakeDestFile(szPcmDirname,startoffset,endoffset);
    		iniVariablesSet = 0;
    	}
    

    Ich habe das Problem so gelöst, jedoch bekomme ich im Visual C folgende Fehlermeldung: "Die Anweisung in "0x0040435c" verweist auf Speicher in "0x0000000c". Der Vorgang "read" konnte nicht auf dem Speicher durchgeführt werden".

    Was muss ich hier ändern ??? 😕



  • Wie ist denn szPcmDirname deklariert? Und warum übergibst du nicht gleich deiner Funktion PcmBuffer??

    Eventuell liegts auch an was anderem. Geh das Programm mal mit dem Debugger durch, dann findest du wenigstens die Stelle wo es hakt.



  • char* szPcmDirname = NULL;

    so hab ich es deklariert



  • Gut, dann sollte es daran nicht liegen, dass dein Fehler auftaucht.

    Wie gesagt, geh mal mit dem Debugger durch und schau an welcher Stelle der Fehler auftaucht. Überprüfe am besten auch gleich den Inhalt der Variablen bei denen du dir nicht schlüssig bist, was drin stehen könnte.



  • danke es hat alles perfekt funktioniert.

    jedoch habe ich jetzt einen anderen Fehler:

    szPcmDirname = oCmdLineParser.GetParameterString("-o");
    
    	//char* string = "c:\\";
    
    	if ((szPcmDirname = "c:\\")&& !(szPcmDirname = c:\\trk"))
    	{
    		noPcmInput=1;
    	}
    

    Es ist so in einem Falls gibt der Benutzer das szPcmDirname an und im anderen Fall wird es selber generiert. Wie kann ich jetzt die unterscheidung machen.

    Wenn der Benutzer den Trk nicht eingibt gibt er nur "c:" ein ansonsten gibt er zB: "c:\trk01.pcm" an.

    Wie kann ich das Problem mit dem obigen code dafür programmieren??



  • Zu deinem Logik-Problem:
    Ich vermute mal du lässt den Benutzer eingeben, wo er die Datei(en) speichern will. Da musst du dir überlegen in welchen Fällen du deine eigenen Dateinamen generieren musst. Ich würde z. B. in den Fällen die Dateinamen selbst generieren, wenn der Anwender entweder nichts eingegeben hat oder wenn er als letzes ein \ (Windows) bzw. / (Linux) angegeben hat (er will es also in ein Verzeichnis bzw. direkt im root eines Laufwerks speichern). (Hier wärs auch zu überlegen, dass man überprüft, ob der eingegebene Pfad ein Verzeichnis ist; geht aber rein mit ANSI-C leider nicht oder höchstens auf Umwege.)

    Nun zu deinem Quellcode:
    Vergleiche macht man generell mit == nicht mit =, denn = ist ein ZUWEISUNGSOPERATOR!
    Strings bzw. Arrays kann man allerdings nicht so einfach mit == vergleichen, denn du vergleichst in dem Fall die Zeiger, also die Adressen der Strings im Arbeitsspeicher. Du musst also Zeichen für Zeichen vergleichen. Zum Glück nimmt dir das eine Stringfunktion ab, die da heißt strcmp(). Wenn der Rückgabewert 0 ist, dann sind deine zwei Strings gleich.

    if(!strcmp(szPcmDirname, "C:\\"))
    { // in szPcmDirname steht C:\
    }
    else
    { // in szPcmDirname steht irgendwas anderes (evtl. sogar c:\)
    }
    

    strcmp() achtet also auch auf die Groß-Klein-Schreibung!



  • danke für deine Hilfe,

    ja den fehler mit dem Zuweisungsoperator habe ich schon selbst gefunden 😉

    danke


Anmelden zum Antworten