Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » maximale Cstringgröße Int_max?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
23.02.2003, 09:09 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hallo,
ich versuche zurzeit ein Programm zu schreiben welches mir beliebige Ordner durchsucht, aber nicht nach dateinamen sondern nach inhalt.

Im Moment les ich die Datei mit


C++:
CStdioFile srFile;
if(srFile.Open(strFilename, CFile::modeRead|CFile::shareDenyNone|CFile::typeBinary))
{
CString strInhalt = _T("");
char *buf = strInhalt.GetBuffer((int)srFile.GetLength());
srFile.Read(buf,(int)srFile.GetLength());



ein, das klappt soweit auch, nur:


C++:
strInhalt.GetLength()



ist immer 0!
auch wenn ich den oben erstellen charpointer mit


C++:
strInhalt.ReleaseBuffer()



entfernen will bekomme ich immer eine Debugassertion!

Auch


C++:
strKontext = strInhalt.Mid(Pos,20);



funktioniert nur wenn Pos == 0 ist und: er nimmt nicht nur 20 Zeichen sondern den kompletten String!

Was macht da mein Programm für einen Müll?!?

Achja was ich beinahe vergessen hab, in strInhalt ist der Inhalt der Datei (also das zeigt er mir an)
--
class God : public ChuckNorris { };

Dieser Post wurde am 23.02.2003 um 09:10 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
23.02.2003, 12:21 Uhr
Volle



Hi Flo,

den Code habe ich gerade bei mir wo rauskopiert. Probiers mal so...


C++:
bool CTreeTestDlg::ReadFile()
{
    bool retCode = false;
    const CString fileName = CString("G:\\source\\VC++\\Test\\TreeTest\\Debug\\Data.tvi");

    file.Empty();

    CFile source;
    CFileException error;
    source.Open(fileName, CFile::modeRead, &error);

    if (error.m_cause)
    {
        error.ReportError();
    }
    else
    {
        unsigned int size = source.GetLength();

        if ( size < (INT_MAX - 5))
        {
            if (source.Read((void*)file.GetBuffer(size), size) == size)
            {
                retCode = true;
                file.ReleaseBuffer();
                //max = content.GetLength();
            }
        }
    }

    return retCode;
}


Grüße, Volle.

Dieser Post wurde am 23.02.2003 um 16:50 Uhr von Uwe editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
23.02.2003, 18:11 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hallo,
das Problem ist nicht das auslesen,

wenn ich eine 2te Datei öffne und dort den "Inhalt" der ersten reinschreibe ist diese vollständig, auch wenn sie größer las INT_MAX ist, nur wenn ich intern mit dem CString arbeiten will bekomme ich müll...
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
23.02.2003, 19:39 Uhr
Volle



Hi Flo,

ich habe dich noch nicht ganz verstanden, glaube ich.

Grundsätzlich aber, machst du Folgendes...

Du holst dir die Adresse des CString- Speichers und schreibst sie in eine neue Variable. Die übergibst du dann an die die Read- Funktion. Spätestens ab hier, wird keine Überprüfung auf INT_MAX mehr stattfinden (aber vermutlich auch nicht, wenn du den Umweg über den zweiten char* nicht machst...).

Wenn du jetzt hergehst, und direkt diesen Buffer wieder zum Schreiben weitergibst, dann funktioniert das (zufällig?). Aber du kannst halt mit einem CString nicht mehr als INT_MAX- Zeichen verarbeiten. In den Puffer hast du aber mehr geschrieben. Ich weiß nicht, wie dieses Verhalten definiert ist (?). Aber auf jeden Fall würde ich hier vorsichtig sein.

Warum teilst du nicht auf? Ich würde von vorne herein feste "Paketgrößen" einlesen. Du musst halt den Fall implementieren, wenn die gelesene Paketgröße nicht mit der geforderten übereinstimmt. Dann bist du aber in jedem Fall auf der sicheren Seite. Schließlich musst du ja davon ausgehen, dass es u.U. öfter mal größere Files gibt, oder?

Das fällt mir dazu ein...

Grüße, Volle.

Dieser Post wurde am 23.02.2003 um 19:41 Uhr von Volle editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
24.02.2003, 13:42 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Naja,
natürlich könnte ich die Datei aufteilen (das es nur textdateien sind, UNIX/DOS-Format) könnte ich immer Zeilen einlesen, nur:

Wenn der Suchstring über mehrere Zeilen geht muesste ich den Suchalgo etwas komplizierter gestalten ...

(natürlich könnte ich die datei komplett in ein CStringArray einlesen, Suchstring in ein CStringArray und dann immer vergleichen, wird mir wahrscheinlich nichts anderes übrigbleiben)
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
24.02.2003, 14:04 Uhr
mike
Pinguinhüpfer
(Operator)


Hi!
Schau mal nach, wie M$ das im MSDN Sample WinDiff gelöst haben. Das durchsucht auch die ganzen Dateien.

mfg mike
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: