CFile kontra fprintf - wie überprüfe ich den Inhalt ?



  • Wie kann man da denn bei der Verwendung von CFile (anstelle von fprintf)überprüfen ob die Datei neu angelegt werden muss oder schon existiert ? fprintf() macht das ja bei dem Parameter "a" von ganz alleine. Gibts die Datei schon wird angehängt, gibts sie noch nicht, wird sie neu angelegt. Zusammen mit fseek und ftell kann ich dann ganz einfach ermitteln ob schon was drin steht oder nicht, aber der fprintf-befehl bleibt eben immer der gleiche. Bei CFile muss ich aber wohl immer exakt angeben, was ich will: anlegen ("modeCreate") oder eben reinschreiben ("modeWrite"). Demnach habe ich immer mehr Code mit CFile als mit fprintf. Kennt sich damit jemand aus ? Ich will nämlich etwas nur in eine Datei schreiben, wenn es sie noch nicht gibt und etwas anderes, wenn es sie schon gibt.



  • Wenn du wissen willst ob was drinnen steht, nimm die Länge der Datei. Wenn sie neu erstellt wurde, muss das ja logischerweise 0 sein.Ansonsten kann man auch per WinAPI testen, ob ne Datei vorhanden ist(FindFIle oder so)



  • Das "a" entspricht CFile::modeNoTruncate.
    Du brauchst also vermutlich CFile::modeWrite|CFile::modeCreate|CFile::modeNoTruncate 🙂



  • CFile::modeNoTruncate hab ich wohl geschmeidig überlesen 🙄

    ich hab bisher immer versucht die Datei zu öffnen und wenn das schief ging hab ich die Datei erstellt.



  • Die Flagkombination, die ich oben geschrieben habe, ist extrem praktisch - ich nutze eigentlich IMMER nur die.
    Zumindest für das Schreiben. 😉



  • ist denk ich mal auch performanter, obwohl der geschwindigkeits unterschied wohl nicht bemerkbar ist bei den Dimensionen mit denen ich arbeite aber es geht ja ums prinzip ^^



  • Danke Euch allen ! Das truncate ist echt ne Hoffnung ! Aber nun steht in meiner Datei irgendwie nur ein einziges "L" ! Wie kommt das denn ??? Mein Code:

    if (file.Open(dateiname, CFile::modeWrite | CFile::modeCreate | CFile::modeNoTruncate, &e )) {
    	  if (file.GetLength() == 0) {
    		  text.Format(_T("Log file Bsp1 %s %s\n"), geraet, typ);
    	  }
    	  else {
    		  text.Format(_T("Bsp2 %s %s\n"), geraet, typ);
    	  }
    	  file.SeekToEnd();
    	  file.Write(text, sizeof(text));  // evtl. auch: file.WriteString(text); ???  
    	  file.Close();
      } // end if
      else {	 
    	  MessageBox(L"Fehler beim Dateiöffnen",L"Error");
      }
    

    Die Datei wird richtig erstellt, mit genau mit dem Namen, den ich per Variable dateiname festgelegt habe, aber dann wird eben nur das eine L reingechrieben. Mehr nicht.



  • plz benutz Code-Tags ⚠



  • Sorry, in der Hektik gerade vergessen. Hab ich nach dem Einstellen auch selbst gemerkt. Hoffe, mir kann trotzdem geholfen werden !



  • Stefan897987 schrieb:

    file.Write(text, sizeof(text));

    text ist ein CString, richtig? In dem Fall gibt sizeof(text) bestimmt nicht die Länge der kontrollierten Zeichenkette an, sondern die Größe der Steuerklasse (sind ca. 1 bis zwei Pointer, also max. 4 Byte) - du benötigst, wenn überhaupt, text.Length()*sizeof(TCHAR).



  • Ja, text ist ein CString. Aber Dein text.Length()*sizeof(TCHAR) versteh ich nicht ganz. Soll das irgendwie anstelle von sizeof stehen ? (bin doch noch ein ziemlicher C++-Newbie !)



  • Ich habe die Code-Tags mal nachgebessert. 🙂
    Melde dich doch an, dann kannst du editieren. 😉

    Falls das mit dem Schreiben gar nicht klappt, stell auf CStdioFile um, das geht ganz einfach und dann kannst du statt Write WriteString nehmen, das weiß selber, wann der String zu Ende ist. 🙂



  • Stefan897987 schrieb:

    Ja, text ist ein CString. Aber Dein text.Length()*sizeof(TCHAR) versteh ich nicht ganz. Soll das irgendwie anstelle von sizeof stehen?

    Ja, das sollte anstelle des sizeof(text) stehen - text.Length() gibt die Länge des Strings in TCHARs an, mit sizeof(TCHAR) bestimmst du die Größe eines Zeichens in Byte (je nach Projekteinstellungen ist das 1 (ASCII) oder 2 (UNICODE)), mit der Multiplikation erhältst du also die Länge des Strings in Byte -> genau das benötigt CFile::Write() zum Schreiben.



  • Folgende Fehlermeldung kommt aber, wenn ich das so eins zu eins übernehme und einfüge anstelle von sizeof(text):

    C:\blubbblubb\test.cpp(239) : error C2039: 'Length' : is not a member of 'CString'
    c:\programme\windows ce tools\...\include\afx.h(474) : see declaration of 'CString'



  • Das heißt GetLength. 🙄



  • Sorry, mein Fehler - das kommt davon, wenn man so selten mit der MFC arbeitet.



  • Stimmt, hieß GetLength, hätte ich auch selbst drauf kommen können. Jetzt kommt keine Fehlermeldung mehr, aber es steht immer noch nur L in der Datei. Merkwürdigerweise ist sie aber 2,17 KB groß !



  • Poste doch einfach mal den betreffenden Code!



  • hab ich bereits, siehe oben !



  • Hast du es schon mit Debuggen versucht?


Anmelden zum Antworten