Pfadhandling in Konsolenanwendungen



  • Hallo Experten,

    habe eine Frage zum Pfadhandling in Windows-Konsolenanwendungen. Ich habe ein Tool geschrieben das als Parameter eine .txt-Datei übernimmt in der es Pfade von zu ladenden Dateien findet. Was ich nun nicht verstehe ist, dass wenn man die Release-exe mit dem Parameter über die Konsole startet gibt es keine Probleme. Zieht man aber die .txt mit der Maus auf die exe gibt es auf Win7 auch keine Probleme, bei XP allerdings stürzt das Programm ab, egal ob die Pfade absolut oder relativ sind. Wenn jemand Lust hätte mir die Ursache und evtl. eine Lösung zu erklären wäre ich sehr dankbar.

    Info: geöffnet wir mit ( FILE * pFile = fopen(filename, "rb"); )

    Viele Grüße



  • Was ist mit der Debug-exe unter XP mit Debugger? Was passiert dann?



  • Bei der Parameter .txt mit relativen Pfaden springt er ordungsgemäß in das Exception-Handling für den Fall das pFile==Null und übergebe ich die absoluten Pfade schmiert alles ab ohne Meldung! 😢



  • patric079 schrieb:

    Bei der Parameter .txt mit relativen Pfaden springt er ordungsgemäß in das Exception-Handling für den Fall das pFile==Null und übergebe ich die absoluten Pfade schmiert alles ab ohne Meldung! 😢

    Ohne Meldung beim Debug-Build im Debugger? Sorry, das kann ich kaum glauben. 😕



  • Doch ist leider so. Kanns mir auch nicht erklären, aber trotzdem Danke für Deinen Hilfeversuch. Bin leider nicht so der VS-Crack weswegen wahrscheinlich irgendwelche Einstellungen falsch sind. Habe mir fast gedacht das da nicht viel zu helfen ist.



  • Tuh uns allen nen Gefallen und gib uns etwas mehr von deinem Code. Vllt liegts ja doch dran.
    Wie beispielsweise sieht "filname" aus?

    Wenn du nur ließt, nimm mal nur "r"?

    Und dann kopier mal nur die Stellen in ein Extraprogramm bei denen du denkst, dass es daran liegt. Grenz den fehler ein bis du die Zeile hast die den Fehler produziert. Dann weißt du woran du arbeiten musst!



  • DataSourceRaw::DataSourceRaw(char* filename, int x, int y, int numberOfFrames)
    {
      type = ONE_DIMENSIONAL;
    
    	currentFrameNumber = 0;
    	xRes = x;
    	yRes = y;
    	frames = numberOfFrames;
    
    	FILE * pFile = fopen(filename, "rb");
    	std::string fileName = filename;
    
    	int fileType = checkForFileType(fileName);
    
    	  data1 = (float*) malloc(sizeof(float) * y * x * frames);
    
    	  if (fileName == "")
    	  {
    		  std::cout << "no data file loaded" << std::endl;
    			for(int i=0; i<y * x * frames; i++) { data1[i] = 0.0; }
    	  }
    	  else
    	  {
    		  try 
    		  {	
    			if(pFile==NULL)
    			{
    				std::string str = "An error occured when trying to open height or slope file.";
    
    				switch(fileType)
    				{
    					case 1:
    						str = "An error occured when trying to open height file.";
    						throw str;
    						break;
    					case 2:
    						str = "An error occured when trying to open x-slope  file.";
    						throw str;
    						break;
    					case 3:
    						str = "An error occured when trying to open y-slope  file.";
    						throw str;
    						break;
    					default:
    						throw str;
    				}
    			}
    		}
    		catch(std::string e)
    		{
    			std::cout << e << std::endl;
    			system("Pause");
    			exit(1);
    		}
    

    'rb' brauche ich weil die files binaries mit floats sind.
    Eingrenzen fällt mir schwer, da ja eigentlich alles funktioniert, außer eben wenn ich die config-file direkt auf die exe ziehe und das auch nur bei XP. Vorallem mysteriös ist, dass eben bei relativen Pfaden der try Block reagiert und bei absoluten nicht!



  • Und jetzt kommentier schrittweise das aus bis der fehler auftritt.
    Da wo er auftritt merkst dir kopierst das in ein zweitprojekt und guckst mal was passiert.

    Die art wie es auftritt ist allerdings schon seltsam. Musst dir mal ausgeben lassen was im programm ankommt wenn du die datei drauf ziehst bevor es zum fehler kommt.



  • Ist nicht ganz so mein Gebiet, aber der Catch-Block sieht komisch aus.

    catch(std::string e)
    

    Ich kenne das so...

    catch(exception e)
    

    Das er einfach nicht in den Block springt, weil diese Exception da nicht passt!?

    Oder liege ich da falsch?

    Gruß



  • das problem ist also dass der dateiname beim "auf die exe ziehen" falsch übergeben wird?

    hast du schonmal versucht dir einfach die übergebenen parameter anzeigen zu lassen?
    also cout << filename

    bzw cout << argv[i] mit i in einer schleife, gibt das dann unterschiede auf den verschiedenen os?



  • feilensystem schrieb:

    das problem ist also dass der dateiname beim "auf die exe ziehen" falsch übergeben wird?

    Schon möglich, aber warum springt er nicht in die Exception?


Anmelden zum Antworten