Datei einlesen mit CFile...
-
hi,
ich versuche grade mich etwas mit der mfc vertraut zu machen.
Aber irgendwie scheitere ich schon an den einfachsten sachen.Ich will eine datei öffnen und dann in einen CString laden,
aber bei ReleaseBuffer bekomme ich immer eine exeption ("Debug Assertion Failed... Expression: nLength <= GetData()->nAllocLength") -> was will der compiler mir damit sagen?1. versuch:
CFile LoadFile; CString FileName; CString Buffer; CFileDialog cFileDialog(true, "*.txt", 0, OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, "*.txt|*.txt||", this ,0); if(cFileDialog.DoModal() != IDOK) return; FileName = cFileDialog.GetPathName(); LoadFile.Open(FileName, CFile::modeRead, NULL); LoadFile.Read(Buffer.GetBuffer(LoadFile.GetLength()+1), LoadFile.GetLength()); LoadFile.Close(); Buffer.ReleaseBuffer(); // fehler--- ka warum...
2.versuch mit extra pointer auf buffer
CFile LoadFile; CString FileName; CString Buffer; TCHAR *pBuffer=NULL; CFileDialog cFileDialog(true, "*.txt", 0, OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, "*.txt|*.txt||", this ,0); if(cFileDialog.DoModal() != IDOK) return; FileName = cFileDialog.GetPathName(); LoadFile.Open(FileName, CFile::modeRead, NULL); int iLen=LoadFile.GetLength(); pBuffer = Buffer.GetBuffer(iLen+1); LoadFile.Read(pBuffer, iLen); LoadFile.Close(); Buffer.ReleaseBuffer(); // error pBuffer=NULL;
erstellt mit MSVisualStudio 2003 auf WinXp.
Das ReleaseBuffer funzt wenn ich das LoadFile.Read(...) weglasse,
ansonsten bekomm ich immer diesen fehler.Was mach ich hier falsch?
Danke schonmal im voraus ^^
mfg
-
Anscheinend liest Read() mehr Zeichen als Du mit GetBuffer() reserviert hast. Deswegen kommt die Fehlermeldung auch nicht, wenn Du das Read() weglässt. Unicode Problem???
-
schonmal
LoadFile.ReadString(Buffer)
versucht?
z.B.
CFileDialog cDialog(TRUE, 0, 0, 4|2, _T("Config (*.cfg) |*.cfg||"), 0 ,0); CString Buffer, Wert; if(cDialog.DoModal() == IDOK) { CStdioFile File; File.Open(cDialog.GetPathName(), CFile::modeRead | CFile::typeBinary); File.SeekToBegin(); while(File.ReadString(Buffer)) Wert.Format(_T("%s"), Buffer); File.Close();
-
schonmal
C/C++ Code: LoadFile.ReadString(Buffer)
versucht?
ähm... bis jetzt noch nicht,
allerdings kannte ich die "CStudioFile" bis jetzt auch noch nich ^^aber so gehts... danke
obwohl mich trotzdem mal interressieren würde wieso das mit GetBuffer nicht funktioniert
-
mfc__neuling schrieb:
obwohl mich trotzdem mal interressieren würde wieso das mit GetBuffer nicht funktioniert
Ich habe Deinen Codeschnipsel mal in VC6 ausprobiert, das hat einwandfrei funktioniert.
-
Bist du dir sicher, dass CFile::GetLength das zurückgibt, was du benötigst? Ich bin es nicht. Die Doku sagt
Obtains the current logical length of the file in bytes, not the amount.
Was mit logical length gemeint ist weiss ich nicht. Eine Alternative um an die Länge zu kommen wäre CFile::GetStatus.
-
Hallo,
Bist du dir sicher, dass CFile::GetLength das zurückgibt, was du benötigst? Ich bin es nicht.
Ist schon korrekt, es wird die Länge, die für ein Programm meistens relevant ist, zurückgegeben: die Anzahl Bytes, die den eigentlichen "Inhalt" der Datei ausmachen.
Was mit logical length gemeint ist weiss ich nicht.
Ganz einfach erklärt: eine Datei belegt im Datei-System nicht die Länge, die CFile::GetLength zurückgibt, die Länge, die wirklich (auf dem jeweiligen Medium, z.B. unter Berücksichtigung der Cluster-Größe u.a.) belegt wird, könnte man als physi(kali)sche Länge bezeichnen, wenn man denn schon logische Länge erwähnt. Die logische Länge ist die, die nur die "Nutzdaten" berücksichtigt.
MfG,
Probe-Nutzer