fopen(filename,"w") funktioniert nicht für Dateien ohne Endung ?



  • Also ich schreibe gerade eine Funktion write(const char* filename, container c)

    ich öffne (und erzeuge) die Datei mit fopen(filename,"w")

    wenn ich als filename "test" übergebe bekomme ich beim ausführen die Fehlerausgabe Segmentation fault.

    wenn ich aber "test.txt" übergebe funktioniert es.

    in meiner Funktion read (const char* filename) benutze ich auch fopen(filename,"r") da funktioniert es auch ohne .txt Endung.

    Ist das normal so ?



  • Wie heisst den das File? test oder test.txt?



  • die Datei muss vorher nicht vorhanden sein und sollte gegebenenfalls von fopen angelegt werden.

    es sollte für beides test und test.txt funktionieren

    bei test.txt legt er sie selbstständig an bei test aber nicht



  • Zeig mal den Code her.



  • void SampleBagIO::writeToLibSvmFile(const char* filename, SampleBag samplebag)
    {
    	if(filename != "")
    	{
    		FILE *fp = fopen(filename,"w");
    		ostringstream outputfile;
    		int featureSize = samplebag.getSample(0).getFeature().getSize();
    
    		for (int i = 0; i < samplebag.getSize(); i++)
    		{
    			int featureSize = samplebag.getSample(i).getFeature().getSize();
    			outputfile << samplebag.getSample(i).getClassNumber();
    			for (int j = 0; j < featureSize; j++)
    			{
    
    				outputfile << " " << j+1 << ":" << samplebag.getSample(i).getFeature().getValue(j);
    
    			}
    			outputfile << endl;
    			string str = outputfile.str();
    			const char *c = str.c_str();
    			fputs(c, fp);
    		}
    		fclose(fp);
    	}
    }
    


  • FILE* file =  std::fopen ("test","w");
    	 fputs ("2",file);
    	 fclose (file);
    

    Das funktioniert bei mir. Eventuell stimmt was mit den Rechten nicht.

    Aber warum machst du das so kompliziert? Wenn du sowieso schon mit ostringstream arbeitest, kannst du doch auch gleich einen ofstream nehmen, anstatt das so komisch zu verrenken.



  • soweit ich mich entsinne hab ich das probiert aber bei ofstream muss die datei vorhanden sein und kann nicht beim initialisieren erzeugt werden.

    correct me if i'm wrong





  • Hmm.. komisch, wo sind die "Das ist ein C++ forum nicht ANSI C forun" kommentare



  • ok danke probiers gleich nochmal.

    Bin im Moment leider schon beim nächsten Problem ^^



  • void SampleBagIO::writeToLibSvmFile(const char* filename, SampleBag samplebag)
    {
    	if(filename != "")
    	{
    		ofstream outputfile;
    		outputfile.open(filename);
    
    		for (int i = 0; i < samplebag.getSize(); i++)
    		{
    			int featureSize = samplebag.getSample(i).getFeature().getSize();
    			outputfile << samplebag.getSample(i).getClassNumber();
    			for (int j = 0; j < featureSize; j++)outputfile << " " << j+1 << ":" << samplebag.getSample(i).getFeature().getValue(j);		
    			outputfile << endl;
    		}
    		outputfile.close();
    	}
    }
    

    sieht echt besser aus 😃

    Danke

    trotzdem bin ich noch nicht ganz zufrieden. Die angelegte Datei hat immer die Endung .txt

    ich finde doch noch das haar in der suppe ^^



  • if(filename != "")

    ist immer wahr.



  • if(!strcmp(filename,"")){
    ...
    }
    


  • @KA51O:
    Was übergibst du den?
    ofstream erzeugt dir eine Datei, genauso, wie du sie öffnen willst. Wenn du "hmm" übergibst, dann erstellt er dir eine Datei, die genau "hmm" heisst, ohne was anderes.

    BorisDieKlinge schrieb:

    if(!strcmp(filename,"")){
    ...
    }
    

    Oder gleich std::string und std::string::c_str benutzen.


Anmelden zum Antworten