Problems reading textfile with CStdioFile
stefan.o@monitor.se Friday, January 10, 1997 Environment: NT 4.0 VC++ 4.0 I'm trying to read a textfile with code like this: CString text; CString textRow; CStdioFile file(filename, CFile::modeRead | CFile::typeText);=20 while(file.ReadString(textRow)) { text +=3D textRow; } Some lines in the textfile are quite long (200 chars) and some shorter. The first long line is read ok, but any long lines after that are truncated= to=20 128 chars even if they are identical to the first one. Am I doing someting wrong or is it a bug? /Stefan
Mike Blaszczak -- mikeblas@nwlink.com Saturday, January 11, 1997 [Mini-digest: 4 responses] At 12:05 1/10/97 +0100, stefan.o@monitor.se wrote: >Environment: NT 4.0 VC++ 4.0 >I'm trying to read a textfile with code like this: >CString text; >CString textRow; > CStdioFile file(filename, CFile::modeRead | CFile::typeText); > while(file.ReadString(textRow)) > { > text += textRow; > } >Some lines in the textfile are quite long (200 chars) and some shorter. >The first long line is read ok, but any long lines after that >are truncated to 128 chars even if they are identical to the first one. >Am I doing someting wrong or is it a bug? Unfortunately, it's a bug. I think it was fixed in 4.1, but I'm not at liberty to check. If you're trying to read the entire content of a the file into a CString, though, you could certainly do so more efficiently using the Read() member of CStdioFile. .B ekiM http://www.nwlink.com/~mikeblas/ Why does the "new" Corvette look like a 1993 RX-7? These words are my own. I do not speak on behalf of Microsoft. -----From: jeremy@omsys.com (Jeremy H. Griffith) On Fri, 10 Jan 1997 12:05:07 +0100, stefan.o@monitor.se wrote: >Environment: NT 4.0 VC++ 4.0 > >I'm trying to read a textfile with code like this: >CString text; >CString textRow; > CStdioFile file(filename, CFile::modeRead | CFile::typeText); > while(file.ReadString(textRow)) > { > text += textRow; > } > >Some lines in the textfile are quite long (200 chars) and some shorter. >The first long line is read ok, but any long lines after that are truncated to >128 chars even if they are identical to the first one. > >Am I doing someting wrong or is it a bug? It's a known bug in MFC 4.0; see the KB (Q152319). I reviewed the MFC source (VC++ 4.0) for the two ReadString() functions, and saw where the bug was coded in ReadString(CString&). (Basically, they used the allocation length rather than the actual written length when deciding where to write the next 128-byte chunk of the line being read; this would work if allocation were also done in 128-byte chunks, but since it was done in 256-byte chunks instead, it left a 128-byte stretch of garbage inside.) However, I *also* saw that the other form of the function, ReadString(LPSTR, UINT), did *not* have such a bug; in fact, it merely calls fgets() on the underlying FILE object. So, you can use that form and thus sidestep the MFC 4.0 bug (which, BTW, was fixed in 4.1). CStdioFile MyFile; // open it here or later CString MyString; const int MY_MAX_LEN = 1024; // some number always big enough, but < 32K ... // this does *not* use the ReadString(CString&) with the VC++ 4.0 bug! MyFile.ReadString(MyString.GetBufferSetLength(MY_MAX_LEN), MY_MAX_LEN); // you might want to catch CMemoryException and CFileException here MyString.ReleaseBuffer(); // resizes to actual length ... --Jeremy -----From: "Peter R. Vermilye"---------- From: stefan.o@monitor.se[SMTP:stefan.o@monitor.se] Sent: Friday, January 10, 1997 5:05 AM To: mfc-l@netcom.com Subject: Problems reading textfile with CStdioFile Environment: NT 4.0 VC++ 4.0 I'm trying to read a textfile with code like this: CString text; CString textRow; CStdioFile file(filename, CFile::modeRead | CFile::typeText);=20 while(file.ReadString(textRow)) { text +=3D textRow; } Some lines in the textfile are quite long (200 chars) and some shorter. The first long line is read ok, but any long lines after that are = truncated to=20 128 chars even if they are identical to the first one. Am I doing someting wrong or is it a bug? /Stefan I may be mistaken (so hopefully someone can correct me on this) but I = think you need to allocate a buffer long enough to read in the longest = line you anticipate. I would probably modify your above code to read as = follows: CString text; // to store the whole file char* textRow =3D new char[4096]; // to read in a line at a time CStdioFile file(filename, CFile::modeRead | CFile::typeText); while (file.ReadString(textRow)) { text +=3D textRow; } delete [] textRow; I'm not 100% sure of the above syntax, you get the drift. While a = CString doesn't add a lot of overhead to a program, it seems to me that = for a simple buffer like you are proposing, a simple char[] would work = just as well (if not better). If you look through the MFC source, you = will see similar instances where a char[] is used instead of a CString. Hope this helps!! Peter R. Vermilye cpudude@mem.net PS: Who does Microsoft call for help? -----From: Simon Coghlan Stefan and the mfc-l.. I had this problem when I was writting a template interpretter for CGI = to HTML data conversion under MSVC 4.1.. Its still there under 4.2b and = will probably remain there.. It transpires that the Memory allocation routine that gets called as = part of the ReadString method gets confused when the string is already = greater than the first allocation block.. and it inadvertently 'forgets' = what comes next. Trace into the code after the first long string ( longer than 128 in = your case ) and you will see it stop working.. Here is the fix.. In order to make the thing work.. force the CString varaible to be = 'Empty()' before each line read.. // 18/10/96 Sorted out the ReadString Bug CString strDataLine; while ( Template_File.ReadString( strDataLine ) ) { pThreadData->pTemplateHandler->m_pstrHtml_Page_Array->Add( strDataLine = ); // have to empty the string because it forgets to reallocate=20 // the buffer in the ReadString Function strDataLine.Empty(); } --------- Simon=20 ----------<- Smurf-IV ->------------- Tel : 0121 200 7713 Fax : +44 (0)121 212 0379 Email smurf-iv@sharelink.com Member of the 'Team of CIS' ;-) ---------<- Fun To All ->------------ We are what we repeatedly do, Excellence, then, is not an act, but a = habit. Aristotle The one who says it cannot be done, should never interrupt the one who = is doing it. The Roman Rule On 10 January 1997 11:05, stefan.o@monitor.se wrote: > Environment: NT 4.0 VC++ 4.0 >=20 > I'm trying to read a textfile with code like this: > CString text; > CString textRow; > CStdioFile file(filename, CFile::modeRead | CFile::typeText);=20 > while(file.ReadString(textRow)) > { > text +=3D textRow; > } >=20 > Some lines in the textfile are quite long (200 chars) and some = shorter. > The first long line is read ok, but any long lines after that are = truncated to=20 > 128 chars even > if they are identical to the first one. >=20 > Am I doing someting wrong or is it a bug? >=20 > /Stefan >=20 >=20 >=20
| Вернуться в корень Архива |