Noch ein Problem



  • Also ich habe jetzt :

    TCHAR text[1000];
    CFileDialog m_ldFile(TRUE,"html","*.html",OFN_ALLOWMULTISELECT|OFN_HIDEREADONLY,"HTML-Dateien *.html",this);
    CString m_pathname; 
    m_pathname += m_ldFile.GetFileName();
    if (m_ldFile.DoModal() == IDOK)
    {
          m_pathname = m_ldFile.GetPathName();
    }
    CFile datei(m_pathname, CFile::modeRead); 
    datei.Read(text,sizeof (text)); 
    datei.Close(); 
    m_strOutput = text;
    UpdateData(FALSE);
    

    jetzt habe ich folgendes Problem , mit sizeof(text) bricht er bei leerstellen ab , und bei text.Getlength meckert der Compiler weil text keine Klasse/Struktur/Union ist . Wie kann ich das machen ... ?



  • versuch doch mal:

    datei.Read(text,1000);
    

    dein array hat ja schliesslich immer 1000 Zeichen platz ... Aber bei strings das nullzeichen nicht vergessen 🙂

    [edit]
    schau dir doch mal CStdioFile an. Das kann ReadString() und WriteString().
    [/edit]

    grüsse

    [ Dieser Beitrag wurde am 31.03.2003 um 15:16 Uhr von soUrcerer editiert. ]



  • ne , der bricht bei der ersten leerstelle ab , das hab ich beim schreiben , bei getlength nicht .



  • Ich bin zwar kein Profi, aber welcher Variablentyp ist denn m_strOutput?
    Wenns ein CString ist hilft vielleicht die Änderung in

    m_strOutput = (CString)text;
    

    [ Dieser Beitrag wurde am 31.03.2003 um 15:25 Uhr von Stefan editiert. ]



  • m_strOutput ist eine membervariable zu einem Eingabefeld .



  • [nullraff]
    wie meinen? schreiben? getlength?
    [/nullraff]

    was meinst du denn mit leerstellen, bei denen er abbricht?

    Also, wenn du

    datei.Read(text,1000);
    

    schreibst, wird CFile versuchen 1000 Bytes aus dem File zu laden. Ist das File kleiner, werden demenstprechend nur x Bytes geladen. Ist das File grösser, bekommst du genau 1000 Zeichen, oder einen Fehler! CFile schert sich nicht darum, ob da Leerzeichen im File sind, oder nicht ...

    vielleicht hast du ja beim speichern das file ruiniert, oder zu wenig reingeschrieben. poste doch bitte mal den abspeichercode, der würd mich interessieren.

    grüsse



  • also ich habe jetzt schon wieder an der Datei rumgespielt und einiges geendert (wenn was falsch ist nicht meckern viles habe ich jetzt zum testen geendert) ich glaube ich weiß auch wie es geht aber hier ist der Code :

    void CMy1Dlg::OnButton1() 
    {
    
    UpdateData(TRUE);
    CFile f;
    CFileException fileException;
    f.Open( m_datei , CFile::modeCreate | CFile::modeReadWrite, &fileException );
    
    f.Write("<html><head><title>" , 20 );
    
    f.Write(m_uber, sizeof( m_uber ));
    
    f.Write("</title></head>" , 20 );
    
    f.Write("<body>",7);
    
    f.Write(m_text,m_text.GetLength() );
    
    f.Write("</body>",8);
    
    f.Write("</html>",8);
    
    f.Seek( 0, CFile::begin );
    
    UpdateData(FALSE);
    }
    


  • Also ich habe jetzt mit hilfe der msdn ein bisschen umgeschreiben (geht aber immer noch nicht) hier ist der gesamt Lese\schreib Code:

    void CMy1Dlg::OnButton1() 
    {
    
    UpdateData(TRUE);
    CFile f;
    CFileException fileException;
    f.Open( m_datei , CFile::modeCreate | CFile::modeReadWrite, &fileException );
    
    f.Write("<html><head><title>" , 20 );
    
    f.Write(m_uber, sizeof( m_uber ));
    
    f.Write("</title></head>" , 20 );
    
    f.Write("<body>",7);
    
    f.Write(m_text,m_text.GetLength() );
    
    f.Write("</body>",8);
    
    f.Write("</html>",8);
    
    f.Seek( 0, CFile::begin );
    
    UpdateData(FALSE);
    }
    
    void CMy1Dlg::OnButton3() 
    {
    TCHAR text[1000];
    CFile myFile;
    CFileException fileException;
    
    if ( !myFile.Open( m_datei, CFile::modeRead), &fileException )
    {
        myFile.Read(text,999);
        m_strOutput = text;
    
        TRACE( "Datei %s kann nicht geöffnet werden, Fehler = %u\n",
           m_datei, fileException.m_cause );
    }
    
    UpdateData(FALSE);
    }
    


  • und da haben wirs schon 🙂

    jedesmal, wenn du Write machst schreibst du einen string in das file. Ein string hat am ende ein nullzeichen. Dieses wird auch immer fleissig mit reingeschrieben. Das funzt beim schreiben wunderbar.

    Wenn du jetzt aber wieder auslesen willst, liest du das ganze File in einem Rutsch ein und machst daraus einen string. Dieser string ist aber dann nur so lang, bis das erste nullzeichen erreicht ist. Dieses nullzeichen ist aber schon direkt hinter "<html><head><title>", also wird dein string auch nur das enthalten.

    abhilfe würde WriteString und ReadString aus CStdioFile bringen, oder du speichers die nullzeichen nicht mit (also nur die anzahl der zeichen bei write
    angeben) ... Ich würd CStdioFile vorziehen, weils so schön easy ist.

    [edit]
    noch ne lösung ... mach dir einen String und schreib den ins file ... Wenn du einen String auslesen willst, solltest du auch einen String reinschreiben.

    ...
    CString text;
    
    text += "<html><head><title>";
    text += m_uber;
    text += "</title></head>";
    ...
    f.Write(text,text.GetLength());
    

    [/edit]

    grüsse

    [ Dieser Beitrag wurde am 31.03.2003 um 15:58 Uhr von soUrcerer editiert. ]



  • Hm, man könnte ja auch ganz einfach die Zeichen in den Zeichenketten zählen, OHNE SICH zu verzählen.

    f.Write("</title></head>" , 20 );  // Wo sind das 20 Zeichen ?
    f.Write("<body>",7); // Wo sind das 7 Zeichen ?
    


  • Hm, man könnte ja auch ganz einfach die Zeichen in den Zeichenketten zählen, OHNE SICH zu verzählen.

    f.Write("</title></head>" , 20 ); // Wo sind das 20 Zeichen ?
    f.Write("<body>",7); // Wo sind das 7 Zeichen ?

    was hat den das für auswirkungen das die Zahlen nicht stimmen ?



  • oh, das hat sehrwohl auswirkungen *lol*

    aber da überleg mal selber, genug infos haste ja jetzt dazu

    grüsse



  • hab jetzt ausprobiert , wenn die Zahlen stimmen gehen die Leerzeichenweg , soviel hab ich rausgefunden , jetzt muss ich nur noch den Text hinbekommen ...



  • erstmal danke , das funzt jetzt , also ich schreibe jetzt so :

    UpdateData(TRUE);
    CFile f;
    CFileException fileException;
    f.Open( m_datei , CFile::modeCreate | CFile::modeReadWrite, &fileException );
    
    CString haupt;
    
    haupt += "<html><head><title>";
    
    haupt += m_uber;
    
    haupt += "</title></head>";
    
    haupt += "<body>";
    
    haupt += m_text;
    
    haupt += "</body>";
    
    haupt += "</html>";
    
    f.Write(haupt,haupt.GetLength());
    
    f.Seek( 0, CFile::begin );
    
    UpdateData(FALSE);
    

    und lese so :

    {
    TCHAR text[1000];
    CFileDialog m_ldFile(TRUE,"html","*.html",OFN_ALLOWMULTISELECT|OFN_HIDEREADONLY,"HTML-Dateien *.html",this);
    CString m_pathname; 
    m_pathname += m_ldFile.GetFileName();
    if (m_ldFile.DoModal() == IDOK)
    {
          m_pathname = m_ldFile.GetPathName();
    }
    CFile datei(m_pathname, CFile::modeRead); 
    datei.Read(text,sizeof (text)); 
    datei.Close(); 
    m_strOutput = text;
    UpdateData(FALSE);
    }
    

    jetzt habe ich nur das Problem das er die "überflüssigen" Zeichen mit sowas ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ auffühlt , wie bekomme ich das weg , dann hab ichs 🙂



  • nullzeichen 🙂

    ...
    int count = datei.Read(text,sizeof (text)); 
    datei.Close(); 
    text[count] = 0;
    ...
    


  • es geht , DANKE AN ALLE !!!


Anmelden zum Antworten