Announcement

Collapse
No announcement yet.

ifstream.open() versagt und löscht Variable

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • ifstream.open() versagt und löscht Variable

    Hallo, ich wollte meine Datei-Prozeduren ändern und <fstream> verwenden. Die Funktion ifstream.open( myfilepath, mode) öffnet die Datei nicht und die Variable 'filename' wird geleert, obwohl das gar nicht passieren dürfte. Als Modi-Parameter habe ich schon ziemlich viel ausprobiert, daran scheint es nicht zu liegen. Verwende ich statt der Variable 'myfilepath' einen String direkt im Code, funktioniert es. Was ist da los?
    Code:
    string CibFile::GetFileAsString( const char* filepath)
    {
    	char* myfilepath = (char*)GetFileNameFromShellPath( filepath).c_str();
    
    	string out = "";
    	if ( !FileExists( myfilepath))
    	{
    		cerr << "File does not exist: \"";
    		cerr << myfilepath;
    		cerr << "\" !! \n";
    		return out;
    	}
    
    	ifstream localfile;
    	printf("try to open: %s \n", (const char*)myfilepath, std::out);
    	localfile.open( (const char*)myfilepath);
    	if( localfile.is_open())
    	{
    		string line;
    		while( !localfile.eof())
    		{
    		  getline ( localfile, line);
    		  out.append( line);
    		}
    		localfile.close();
    	}
    	else
    		printf( "no success! \n");
    	return out;
    }

  • #2
    Wäre das Einlesen mit TStringList nicht einfacher....

    http://www.marquardtnet.info/cecke/q...quicky_58.html

    TStringList *datei=new TStrinList();

    datei->LoadFromFile("c:\\meineDatei.txt");

    fertig
    Christian

    Comment


    • #3
      Ich habe mich für <fstream> entschieden, weil man damit auch binäre Daten einlesen kann. Im Grunde ist das Handling mit <fstream> auch nicht besonders schwierig. Ich verwende im Grunde nur modifizierten Code aus dem Netz und der ist sehr einfach. Die Frage war auch: warum wird die Variable 'myfilepath' geleert?

      Comment


      • #4
        Binär lesen tust du ja nun nicht. Des Weiteren ist es sinnvoll, wenn ich schon ein Framework verwende die Klassen des Framework zu verwenden und nicht alles zu mischen.
        Statt string die Klasse String oder AnsiString. Dann klappt überlicherweise auch das Zusammenspiel. Es gibt entsprechende Klassen TFile u.a. im C++Builder.

        Schon mal debuggt und den Zustand von myfilepath vor und nach dem open angesehen?
        Das printf funktioniert noch?
        Was ergibt is_open?

        Was macht
        GetFileNameFromShellPath

        Scheint doch nahezu liegen, das dort was schiegeht, wenn es mit einem festen Namen geht
        Christian

        Comment


        • #5
          GetFileNameFromShellPath macht nichts anderes, als mir die Möglichkeit zu geben, innerhalb meines C++-Codes relative Pfade zu verwenden. Sollte also meine Memberfunktion GetFileAsString mit einem Parameter '../datei.txt' aufgerufen werden. So bekomme automatisch den Pfad zu jener Datei mit GetFileNameFromShellPat einen absoluten Pfad zurück. Das funktioniert perfekt.
          'myfilpath' hat den Wert eines korrekten Pfades "/home/user/App/file" bis kurz for dem Aufruf localfile.open(...). Also auch noch beim printf. Sobald das Programm diese Stelle passiert hat ist die Variable leer. Witzig, oder?
          Binär lesen kommt später an einer anderen Stelle dran.

          Zusatz: Die Variable ist leer, sobald die Funktion localfile.open(...) passiert wurde, nicht prinftf.
          Zuletzt editiert von Christian Marquardt; 24.09.2010, 10:52.

          Comment


          • #6
            Nun, myfilepath ist als Zeiger definiert. Die Funktion GetFileNameFromShellPath gibt einen solchen zurück. Irgendjemand muss aber mal Platz für den Zeiger geschaffen haben. Also wäre meine Vermutung, das dies nicht geschehen ist, und es halt nur solange gut geht, wie der Speicher nicht anderweitig genutzt wird.
            Dafür würde sprechen, dass es mit einem festen Namen geht.
            Christian

            Comment


            • #7
              Was für einen C++Builder verwendest du denn? Klingt für mich evtl. nach einem UnicodeString-Portierungsproblem... ?

              Comment


              • #8
                Ich verwende gcc/g++ in Eclipse Linux. Ich mach es jetzt erstmal wie gehabt mit FILE* . Das funktioniert. Alles andere schau ich noch mal später an. Leider hab ich dafür jetzt keine Zeit. Vielen Dank, Michael

                Comment


                • #9
                  Ich verwende gcc/g++ in Eclipse Linux.
                  ??Darf man fragen, warum du dann unter C++Builder postest und man zu diesem Framework Hinweise gibt?
                  -> verschoben
                  Zuletzt editiert von Christian Marquardt; 24.09.2010, 12:47.
                  Christian

                  Comment

                  Working...
                  X