[CFileDialog] Text speichern, wenn vorhanden anfügen?
-
Guten Morgen,
ich habe da eine Frage... (Wer hätte das gedacht
).
Wie bekomme ich es hin, einen CString in eine Datei zu schreiben, wenn die Datei nicht vorhanden ist sie anzulegen, wenn sie vorhanden ist den Text hinten anzufügen?
Habe bisher folgendes:
void ADD::OnHinzufugen() //Fehlermeldung, wenn Datei nicht existiert! { UpdateData(TRUE); CFileDialog fileDlg( FALSE, _T("*.txt"), _T("DateiName"),OFN_HIDEREADONLY,_T("Textdatei (*.txt)|*.txt|"), NULL ); if ( fileDlg.DoModal() == IDOK ) { CString strFile = fileDlg.GetPathName(); CStdioFile* pStdioFile = new CStdioFile(); pStdioFile->Open( strFile, CFile::modeReadWrite ); pStdioFile->SeekToEnd(); pStdioFile->WriteString(m_strAddDe); pStdioFile->WriteString("\n"); pStdioFile->Close(); MessageBox("Das Wort "+m_strAddDe+" wurde erfolgreich hinzugefügt!","Erfolgreich"); } else MessageBox("Das Wort "+m_strAddDe+" wurde nicht hinzugefügt!","Fehlgeschlagen",MB_ICONERROR|MB_OK); }
Den Text hinten anfügen funktioniert, jedoch kommt eine Fehlermeldung (und das Prog stürzt ab), wenn die Datei nicht vorhanden ist
Kann mir jemand helfen?
-
MSDN lesen hätte geholfen, gleich die beiden ersten Flags brauchst du:
CFile::modeCreate Directs the constructor to create a new file. If the file exists already, it is truncated to 0 length.
CFile::modeNoTruncate Combine this value with modeCreate. If the file being created already exists, it is not truncated to 0 length. Thus the file is guaranteed to open, either as a newly created file or as an existing file. This might be useful, for example, when opening a settings file that may or may not exist already. This option applies to CStdioFile as well.
Steht im Kapitel zu CFile::CFile.
-
Das stimmt wohl, jedoch kann ich mit modeCreate nicht anfügen, sondern er erstellt die Datei neu! Er soll jedoch, wenn die Datei vorhanden ist den neuen Text mittels modeReadWrite anfügen. Das Problem ist nur, wenn keine Datei vorhanden ist, kommt ein fehler, weil er dann ja nichts ranfügen kann
Müsste also irgendwie so aussehen:
Wenn Datei vorhanden, dann den vorhandenen Code.
Wenn Datei nicht vorhanden(Fehler), dann mit modeCreate neue Datei erstellen.Nur, wie kann ich das umsetzen?
-
Du musst die Flags verodern.
Also:
pStdioFile->Open( strFile, CFile::modeReadWrite|CFile::modeCreate|CFile::modeNoTruncate );
Und um ans Ende zu kommen gibt es SeekToEnd oder so ähnlich, ich mag nicht schon wieder suchen...
-
Oh man, warum hat das so lange gedauert?
Habe mir nämlich so nen schrott zusammengebastelt:CString strFile = fileDlg.GetPathName(); CStdioFile* pStdioFile = new CStdioFile(); CFileStatus status; if( CFile::GetStatus( fileDlg.GetFileName() , status ) ) { pStdioFile->Open( strFile, CFile::modeReadWrite ); pStdioFile->SeekToEnd(); MessageBox("Das Wort "+m_strAddDe+" wurde erfolgreich hinzugefügt!","Erfolgreich"); } else { pStdioFile->Open( strFile, CFile::modeCreate ); MessageBox("Das Wort "+m_strAddDe+" wurde erfolgreich in die neue Lektion "+m_strAddLek+" hinzugefügt!","Erfolgreich"); } pStdioFile->WriteString(m_strAddEn); pStdioFile->WriteString("|"); pStdioFile->WriteString(m_strAddDe); pStdioFile->WriteString("|"); pStdioFile->WriteString(m_strAddBsp); pStdioFile->WriteString("\n"); pStdioFile->Close();
hm... D.A.N.K.E.! (1Stunde verschenkt
)
-
Tja, ich habe von 12:00 bis 13:00 Mittagspause... :p
Außerdem sind wir nicht deine Privatsklaven, die immer sofort eine Antwort geben müsen wenn du hustest. Denk BITTE daran, dass das hier alles auf freiwilliger Basis passiert...Du hättest in der Zeit ja mal ein wenig in der MSDN lesen können. Da ist nämlich ein Beispiel drin.
Naja, jetzt weißt du aber hoffentlich, dass man Flags mit | zusammen benutzen kann. Das brauchst du bestimmt noch öfters.