CArchive::ReadString(CString& rString) ?Bug?
Andrew Alexander -- 100446.1321@compuserve.com Tuesday, January 23, 1996 I am using VC++ 4 MFC 4 For your information: CArchive::ReadString(CString& rString) appears to be flawed. I am using it to read in lines of text of various lengths sometimes larger than 128 characters. The first line over this length is fine. But the next line over this size is truncated. This occurs due to the flawed use of the Allocated length to calculate where to store the next 128 byte block. The Allocated length may be longer because of previous use of the string, but the function expects it to step up in size only due to reading in the current string. Please see attached source and Memory dump. Solutions: Well I deallocated the string before the next call. I guess I could change the MFC but.... Just In case I am doing something stupid I attach my code below. --------------------------------------------------------------------------------- ------- BOOL CArchive::ReadString(CString& rString) { rString = &afxChNil; // empty string without deallocating const int nMaxSize = 128; LPTSTR lpsz = rString.GetBuffer(nMaxSize); LPTSTR lpszResult; for (;;) { lpszResult = ReadString(lpsz, nMaxSize); // if string is read completely or EOF if (lpszResult == NULL || lstrlen(lpsz) < nMaxSize-1) break; // Problem here int nAllocLen = rString.GetAllocLength(); rString.ReleaseBuffer(); lpsz = rString.GetBuffer(nMaxSize + nAllocLen) + nAllocLen; // End Problem } rString.ReleaseBuffer(); return lpszResult != NULL; } Partial Memory Dump. 0065A9D3 27 4E 6F 72 74 68 61 'Northa 0065A9DA 6D 70 74 6F 6E 73 68 mptonsh 0065A9E1 69 72 65 27 2C 27 55 ire','U 0065A9E8 4B 27 2C 27 4E 4E 38 K','NN8 0065A9EF 20 33 46 47 27 2C 31 3FG',1 0065A9F6 2E 30 00 CD CD CD CD .0.IIII 0065A9FD CD CD CD CD CD CD CD IIIIIII 0065AA04 CD CD CD CD CD CD CD IIIIIII 0065AA0B CD CD CD CD CD CD CD IIIIIII 0065AA12 CD CD CD CD CD CD CD IIIIIII 0065AA19 CD CD CD CD CD CD CD IIIIIII 0065AA20 CD CD CD CD CD CD CD IIIIIII 0065AA27 CD CD CD CD CD CD CD IIIIIII 0065AA2E CD CD CD CD CD CD CD IIIIIII 0065AA35 CD CD CD CD CD CD CD IIIIIII 0065AA3C CD CD CD CD CD CD CD IIIIIII 0065AA43 CD CD CD CD CD CD CD IIIIIII 0065AA4A CD CD CD CD CD CD CD IIIIIII 0065AA51 CD CD CD CD CD CD CD IIIIIII 0065AA58 CD CD CD CD CD CD CD IIIIIII 0065AA5F CD CD CD CD CD CD CD IIIIIII 0065AA66 CD CD CD CD CD CD CD IIIIIII 0065AA6D CD CD CD CD CD CD CD IIIIIII 0065AA74 CD CD CD CD 29 00 CD IIII).I 0065AA7B CD CD CD CD CD CD CD IIIIIII You will notice the bracket that is meant to be the last character on the input line is 128 bytes offset from where it should be. ========================================= This is my cut down code. Its just a dialog box app with following code entered. Try it if you like. BOOL CGoSQLApp::InitInstance() { #ifdef _AFXDLL Enable3dControls(); // Call this when using MFC in a shared DLL #else Enable3dControlsStatic(); // Call this when linking to MFC statically #endif static char BASED_CODE szFilter[] = "Import Files (*.imp) | *.imp | All Files (*.*) | *.* ||"; CFileDialog Import(TRUE, "imp", "*.*", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter); CFile f; CString ImportFile; CFileException e; CString Input; do { if (IDOK != Import.DoModal()) return FALSE; ImportFile = Import.GetFileName(); } while (!f.Open( ImportFile, CFile::modeRead, &e )); CArchive i(&f,CArchive::load); while(i.ReadString(Input)) { TRACE("%s\n",Input); } return FALSE; }
Mike Blaszczak -- mikeblas@msn.com Friday, January 26, 1996 Andrew Alexander wrote: > CArchive::ReadString(CString& rString) appears to be flawed. This has been fixed for MFC 4.1. You'll note that CStdioFile::ReadString() has a similar problem. .B ekiM TCHAR szOhMan[] = _T("Thiss werds nahmmyon, I'ff haddladda vodka.")
| Вернуться в корень Архива |